FlowParse
AI Bank Statement Validation

Bank Statement Validation ToolValidate transactions, balances and financial data automatically

Upload a bank statement and automatically verify transaction accuracy, running balances, debit and credit mapping, duplicate records and financial consistency — before the data reaches your books.

Running balances
Missing transactions
Duplicate detection
Debit / credit mapping
Date consistency
Exact failing rows named

Free plan: 10 pages a month · Originals deleted automatically 30 days after upload

Statement Validation Report2 issues
Running balance reconciles
All dates valid
Debit / credit mapped
Possible duplicate row (line 24)
Balance break at line 41
See it before you upload

A real sample: bank statement (uk style) — to a working spreadsheet

A fictional sample document converted by the same engine you get — flip through the source PDF and every export format, or download the files themselves.

sample.pdfFictional data
Bank statement (UK style) — source PDF preview page 1
.pdf .xlsx .csv .qbo .qfx .ofx .sta .xml .xml
All samples →
Bank statement validation tool verifying transactions, running balances and debit/credit columns with green validation badges and confidence scores

What is bank statement validation?

Bank statement validation is the process of verifying that extracted transaction data is accurate, complete and internally consistent. It is the step between pulling transactions off a PDF and trusting them for reconciliation, reporting or an audit.

A strong validation workflow checks:

Transaction dates
Descriptions
Debit amounts
Credit amounts
Balances
Account information
Duplicate transactions
Missing rows

The goal is simple: ensure the exported spreadsheet accurately reflects the original statement. A statement is a chain of transactions where each balance depends on the one before it — which makes it uniquely suited to automated validation. If a single row is missing or duplicated, the running balance stops adding up, and that break is something a rules engine can detect with certainty.

AI bank statement validation dashboard reviewing transaction rows, balances and account information

What the bank statement validator checks

Every uploaded statement runs through the same deterministic checks, so the review is identical whether it is a single page or two hundred transactions across ten pages.

Transaction Dates

Detects invalid or missing dates.

Transaction Descriptions

Verifies transaction rows were extracted correctly.

Debit Amounts

Checks outgoing payments.

Credit Amounts

Checks incoming funds.

Running Balances

Validates balance progression.

Missing Transactions

Identifies gaps in extracted data.

Duplicate Transactions

Detects repeated entries.

Account Consistency

Reviews statement integrity.

Bank statement validator highlighting transaction dates, descriptions, balances, debit and credit values

How bank statement validation works

Every step runs automatically on upload, and you stay in control of the final review — nothing a check flags is exported as if it had passed.

1

Upload Statement PDF

Drag & drop a digital or scanned statement.

2

OCR Reads Document

The statement is converted into machine-readable text.

3

AI Extracts Transactions

Rows, amounts and balances are structured.

4

Validation Rules Run

Balances, duplicates and gaps are checked.

5

Issues Detected

Inconsistencies are flagged.

6

Report Generated

A validation report is produced.

7

Export Clean Data

Validated transactions are exported.

Step-by-step bank statement validation workflow: upload, OCR extraction, AI validation, issue detection, report and export

Validate running balances automatically

The single most important check on a statement is the running balance. The system re-derives the balance for every row and confirms the chain holds:

Previous Balance+Credits−Debits=New Balance

If a balance does not match the expected value, the validator flags the row. Because each balance depends on the previous one, a single break pinpoints exactly where something went wrong — helping identify:

Missing transactions
Duplicated transactions
OCR mistakes
Extraction errors
AI balance validation dashboard checking transaction flow and running balances with warning indicators

Running-balance validation: a worked example

The figures below are a made-up example, kept small so every line can be checked in your head. An account opens at 3,500.00 and records five transactions. The right-hand column is what the validator computes for each row: the balance above, plus or minus this row's amount, against the printed balance.

Example statement — illustrative figures, not a real account
#DateDescriptionAmountPrinted balanceValidator's check
—01 MarOpening balance3,500.00Start of chain
103 MarClient payment+1,250.004,750.003,500.00 + 1,250.00 = 4,750.00 ✓
205 MarOffice rent−1,100.003,650.004,750.00 − 1,100.00 = 3,650.00 ✓
309 MarCard fee−12.503,637.503,650.00 − 12.50 = 3,637.50 ✓
412 MarSoftware subscription−49.003,588.503,637.50 − 49.00 = 3,588.50 ✓
515 MarCustomer refund received+75.003,663.503,588.50 + 75.00 = 3,663.50 ✓

Every row holds, and so does the whole statement: 3,500.00 + 1,250.00 − 1,100.00 − 12.50 − 49.00 + 75.00 = 3,663.50, the printed closing balance. Here is what four common extraction faults do to the same statement:

What went wrongRow-by-row checkOpening + transactions = closing
Digits swapped on row 3 (−21.50 read instead of −12.50)3,650.00 − 21.50 = 3,628.50, but the printed balance is 3,637.50 — row 3 is off by 9.00 and is named3,500.00 + Σ amounts = 3,654.50 ≠ 3,663.50 closing — off by 9.00
Row 4 lost at a page breakRow 5: 3,637.50 + 75.00 = 3,712.50, but the printed balance is 3,663.50 — off by exactly 49.00, the missing amountΣ amounts falls 49.00 short of the closing balance
Refund read as a debit (sign lost)3,588.50 − 75.00 = 3,513.50 ≠ 3,663.50 — off by 150.00, twice the amountOff by 150.00 — a difference of twice one row's amount points to a sign error

The size of the difference is a clue: one transaction's amount usually means a missing or repeated row; twice an amount means a flipped sign; a gap divisible by nine is the fingerprint of swapped digits. The row check tells you where the problem is; the totals check tells you whether the document is complete, and it still works on statements that print no running balance. FlowParse runs both.

That is the answer to how to extract transactions from bank statement PDFs and validate running balances automatically: extraction produces a plausible table, the running balance turns it into a checked one. Our guide on how to extract transactions from a PDF bank statement covers the extraction half.

Detect missing transactions

Missing rows are one of the biggest risks in bank statement extraction — and the hardest to spot, because what is gone leaves no visible trace on the page. Common causes include:

Broken table structures
Poor scans
OCR failures
Page transitions
Merged transaction rows

The Validation Engine automatically identifies suspicious gaps by watching the running balance: when it jumps by an amount the listed transactions cannot account for, a row is probably missing — and you are told where.

Running-balance chain on a bank statement with one broken link marking the row where a transaction is missing

Duplicate transaction detection

Duplicate transactions — often introduced when overlapping pages are extracted twice — quietly corrupt your data. They can create incorrect balances, reconciliation issues and inaccurate reports. The validator checks:

Identical dates
Identical amounts
Matching descriptions
Same line read twice on one page

Potential duplicates are highlighted automatically so you can confirm or remove them before export.

AI duplicate transaction detection dashboard highlighting repeated rows and duplicate financial records

Three verdicts, honestly reported

The verdict travels with the document, and it only ever says one of three things. There is no score to interpret and no percentage dressed up as certainty — either the statement's own arithmetic holds, or it does not, or there was nothing printed to check it against:

Reconciled

Every row holds

Each balance follows from the previous one plus the amount, within 0.02.

Failed

Named rows

The arithmetic breaks — the verdict lists the exact rows, so you check two, not two hundred.

Not verifiable

Nothing to check against

No running-balance column printed — the verdict says so instead of pretending to pass.

The third verdict matters more than it looks. Plenty of documents — some card statements, simple transaction lists, exports with the balance column cut off — print no running balance at all. A tool that reports "validated" on those is reporting its own optimism. FlowParse reports not verifiable, extracts the data anyway, and leaves the judgement with you.

Validation report

Every processed statement receives a clear, actionable report — a summary of exactly what was checked and what needs attention.

Statement status

Pass Warning Fail

Issues found

  • Missing transactions
  • Duplicate rows
  • Balance discrepancies
  • OCR concerns

Rows checked, rows passed

The report counts the rows that carried a checkable balance and how many of them held, plus the opening balance, the closing balance and the computed closing — opening plus the sum of all amounts — side by side.

Exact failing rows

A failed verdict names the rows whose arithmetic breaks, linked in the preview, so the review starts at the problem.

Professional bank statement validation report showing status, confidence score, transaction issues and suggested actions

Bank statement validation for accountants

Accountants use statement validation to turn slow, line-by-line reconciliation into a fast, exception-based review. Instead of checking every row, they focus only on what the validator flags:

  • Improve bookkeeping accuracy
  • Reduce reconciliation time
  • Prepare audits
  • Review client statements
  • Identify missing transactions
Professional accountant reviewing validated bank statement data inside an AI-powered financial dashboard with reconciliation tools

Why the running balance is the only real proof

A bank statement is unusual among financial documents: it carries its own proof. Every row prints the balance after the booking, so the balance on row ten minus the balance on row nine must equal row ten's amount — and the opening balance plus the sum of every amount must land on the closing balance. Nothing else can tell you whether an extraction is right. The PDF has no answer key, no labels, no second copy to compare against. This arithmetic is the answer key, and it is printed on the statement itself.

That is why FlowParse runs the check on the verbatim grid — the table exactly as printed, the same grid your Excel file is built from. Among the faults it has caught on real statements: a VAT number landing in the balance column, credits silently losing their sign, and amounts read off the wrong column. Each produced a plausible spreadsheet; each broke the chain on the first row it touched.

One refinement matters on real documents: many PDFs print several accounts in sequence — a current account, then a savings account, each restarting its own running balance. The validator detects those blocks and checks each chain separately. Without that, every multi-account statement would fail at each boundary for no real reason; with it, a break inside any one account still surfaces precisely.

There is also one defect the arithmetic can not only detect but name: when every single row holds with the amounts' signs flipped, the extraction read debits as credits throughout. That is reported as exactly that — an inverted statement — and corrected with arithmetic rather than a re-read, because the evidence is unambiguous.

Overdrawn accounts: Dr, OD and parentheses

Statements rarely print a minus sign on a negative balance. They write 680,905.75 Dr, 29,157.09 OD or (1,234.56) — a trailing marker that is easy for software to miss, and when it is missed, an overdrawn account reads as comfortably in credit. On one real overdrawn statement, correcting the balance signs dropped the rate of rows whose balance movement disagreed with their amount from 81.9% to 18.1% — the difference between a file you can reconcile and one you cannot.

Each repair is guarded twice: a negation only triggers on a marker printed on that field's own text, and every repaired row is re-tested against the balance arithmetic and rolled back if the chain gets worse.

Duplicates: dropped, flagged or left alone

Not every repeated row is an error, so the pipeline treats repetition in three different ways rather than one blunt rule. A line the extraction read twice from the same page — same row, same position — is dropped outright. So are notice-block repeats: many European statements re-print upcoming direct debits in an announcement block (Avis de prélèvement, Lastschriftankündigung, Avisos de lançamento) with the same date and amount but no balance of their own; counting those twice would double every announced payment.

What remains — two rows sharing a date, an amount and a description — is flagged, not deleted. A real fleet-card ledger printed the identical toll charge twice in a row: a double-printed line, or the same toll gate crossed twice in one day? No algorithm can decide that from the PDF, so the validator lists the pair and lets someone who knows the account decide.

Dates that moved — and why you are told

Scanned statements misread years more than any other field — a 2023 that comes out as 2028 puts a transaction outside the statement's own period, and the pipeline re-anchors it to the year that puts it back inside. That repair is almost always right. Almost.

Some documents legitimately reference dates outside their own period: an expense ledger once listed a tyre replacement dated a month before the statement's stated start — a real purchase, correctly dated, that a silent "fix" would have moved. So the validator does not hide the repair. Every row whose year was re-anchored is listed, with the printed date and the adjusted date side by side, so a reader who knows their own dates can spot-check them in one pass instead of discovering a moved date at tax time.

Transaction validation: every check, in one table

"Transaction validation" can sound like a black box. It is not: every check below is a fixed rule that runs on every bank statement, compares numbers or text the statement already prints, and produces the same result every time it is run on the same file. Nothing here is a model's opinion. The same discipline sits behind our wider financial data validation for invoices, receipts and other financial documents.

CheckWhat it comparesWhat happens when it fails
Running balance, row by rowPrevious balance ± amount against the balance printed on the row, within 0.02Failing rows named; verdict Reconciled / Failed / Not verifiable
Opening + transactions = closingThe statement's own printed opening and closing balances against the sum of every amountDocument flagged incomplete or over-counted — works even without a balance column
Same line read twice on one pageIdentical date, amount and description on the same page, with matching balance or positionDropped before export
Notice-block repeatsUpcoming direct debits re-printed in an announcement block with no balance of their ownDropped, so announced payments are not counted twice
Possible duplicatesRows that still share date, amount and description after the drops aboveListed in the export for you to decide — never deleted
Date inside statement periodEach transaction date against the period the statement printsWarning; re-anchored years disclosed with printed and adjusted date
Rows without date or amountShare of rows missing a date, an amount, or bothWarning, or an error when the table is clearly not a ledger
Header fieldsAccount holder, currency, opening and closing balance present and read with confidenceWarning to verify before export
Balance sign markersDr, OD and parentheses printed on the balance itselfSign repaired, then re-tested; rolled back if the chain gets worse

One check is deliberately absent: a separate per-page subtotal comparison. Many statements print no page subtotals, and the running balance already carries across page breaks — a row lost between pages breaks the chain at exactly that point.

Bank statement verification: two different jobs

People search for "bank statement verification software" or a "bank statement checker" meaning two different things, and it is worth being plain about which one this is. One job checks the data: that what landed in your spreadsheet is complete and arithmetically consistent with what the statement printed. The other checks the document: that the PDF really came from the bank and has not been altered. FlowParse does the first. It does not do the second, and it does not certify that a statement is genuine.

Split illustration: on the left a statement's rows checked for arithmetic consistency, on the right a magnifying glass inspecting the document itself for authenticity
Data validationDocument authenticity verification
Question it answersDo the extracted numbers add up and match what the statement prints?Did the bank really issue this document, unedited?
Evidence usedThe statement's own arithmetic: balances, opening, closing, datesThe file itself, the issuing bank, open-banking data, the customer's identity
CatchesMissing, repeated and misread rows; lost signs; incomplete extractionAltered amounts, template fakes, documents never issued by the bank
Cannot catchA carefully forged statement whose arithmetic was kept consistentA genuine statement that was then extracted into Excel with errors
FlowParseYes — built into every uploadNo — we do not certify documents

What authenticity checks generally involve

Document-fraud checking is its own discipline, usually run by lenders, letting agents and compliance teams. Generically, it combines three kinds of evidence. The file: PDF document properties record when it was created and last modified, and a March statement modified last week invites a question. The page: a figure in a slightly different font, characters off the baseline, text layered over an image. And the source: asking the bank to confirm the figures, or reading the account through open banking, where the account holder gives explicit consent for a regulated provider to access the data directly from the bank.

The two jobs overlap: a clumsy edit usually breaks the running-balance chain, so a failed verdict on a clean-looking PDF is a reason to look harder. But a careful forger can keep the arithmetic consistent, so a reconciled verdict is evidence of consistency, never of origin. For affordability work, our page on bank statement analysis for loans covers turning statements into underwriting data — pair it with source verification, not instead of it.

And a third meaning: real-time transaction validation

"Real-time data validation for financial transactions" usually means screening payments as they happen, inside a bank or payment system. That is transaction monitoring, not statement validation. FlowParse checks each statement, and the transactions printed on it, when you upload it.

"Is this a valid statement?" — a checklist

Split the question in two. The left column can be proven from the statement itself; the right column needs evidence from outside the document. A statement can pass one side and fail the other.

Is the data valid? (FlowParse checks this)

  • Every row's balance equals the previous balance plus that row's amount
  • Opening balance plus all transactions equals the closing balance printed on the statement
  • The opening balance matches the closing balance of the previous statement
  • Every transaction date falls inside the statement period
  • No unexplained pairs of rows with the same date, description and amount
  • Page breaks do not drop or repeat a row — the balance carries straight across

Is the document genuine? (outside FlowParse)

  • The statement came to you directly from the bank or the account holder's online banking, not as a forwarded edit
  • Fonts, spacing and alignment are consistent — a figure in a slightly different typeface is a classic edit sign
  • The file's document properties: creation and modification dates that do not fit the statement date deserve a question
  • Totals, interest and fees look like that bank's usual statements for the same account type
  • When the decision matters, the figures are confirmed with the bank or through consented open-banking data

Statements also chain across months: February's closing balance must be March's opening balance. When you merge months with combine bank statements into one Excel, compare each closing balance with the next opening balance before reconciling.

How to validate a bank statement yourself in Excel

A spreadsheet and a few formulas run the core checks, and knowing them lets you re-check any row you doubt. Put the date in column A, description in B, a signed amount in C (credits positive) and the printed balance in D, with the opening balance in D2 and the first transaction in row 3. A bank statement to Excel conversion gives you these columns directly.

PurposeCellFormulaHow to read it
Row check (signed amount column)E3=ROUND(D2+C3-D3,2)0.00 on every row means the chain holds
Flag only the breaksF3=IF(ABS(D2+C3-D3)>0.005,"BREAK","")Filter the column for BREAK
Whole-statement identityany=ROUND(Opening+SUM(C3:C200)-Closing,2)Name the opening and closing cells Opening and Closing; 0.00 means complete
Possible duplicatesG3=COUNTIFS(A:A,A3,B:B,B3,C:C,C3)>1TRUE marks rows sharing date, description and amount
Date inside the periodH3=AND(A3>=PeriodStart,A3<=PeriodEnd)FALSE marks a date outside the statement period

Fill the row check down: every cell should read 0.00, and the first non-zero cell is where the problem starts. ROUND matters because spreadsheets store money as binary fractions, so a correct chain can show 0.0000000001 without it.

COUNTIFS counts rows where every condition is met at once, so it finds rows sharing date, description and amount. Treat a TRUE as a question, not a verdict — two identical coffees on one day are real.

Spreadsheet with a helper check column marking every row as passing except one highlighted row where the running balance breaks

The manual route's weak points are retyping balances, which adds the errors you are checking for, and setup time on long statements. FlowParse runs the same checks on the extracted grid and lists failing rows in the workbook's QA Report sheet. To then match the statement against your ledger, see how to do a bank reconciliation.

Skip the helper columns

Upload a statement and get the running-balance and totals checks done for you — 10 free pages every month.

Supported statements

The validator works with statements from the major neobanks and high-street banks, in both digital and scanned form.

Multiple bank statement formats (Revolut, Wise, Monzo, N26) automatically validated by AI inside a premium fintech dashboard

Validate transactions before export

Frequently asked questions

Trust your financial data

Use FlowParse to validate transactions, balances and bank statement data automatically — and only ever review the exceptions.

Bank statement uploaded into AI validation platform with transaction validation badges, confidence scores and export-ready indicators