ZeroParse
HomeHelp

How ZeroParse does on 40 real bank statements

Every converter in this category advertises an accuracy number. None of them publishes what it was measured on. This page is our attempt at the opposite: the corpus, the method, the per-file results, and the files we got wrong.

32 of 40

PDFs whose extracted rows add up against the balances the statement itself printed

6

printed nothing we could check against — reported as unverified, not as correct

2

where the arithmetic disagreed and we said so

What “reconciled” means, and what it does not

A statement usually prints facts about itself: an opening balance, a closing balance, sometimes column totals. Reconciled means we added up the rows we extracted and they match those printed figures. It is arithmetic, not an opinion, and you can redo it by hand on your own file.

It is not a claim that every field is perfect. A description could still be truncated or a date read in the wrong order without breaking the totals. Reconciliation catches the errors that move money — a dropped row, a missed digit, a debit read as a credit — which are the ones that matter most and the ones that are hardest to spot by eye.

Roughly a fifth of real statements print nothing checkable at all. Those come back unverified. That is an honest “we cannot tell you”, and we would rather say it than show a green tick that means nothing.

Where this corpus came from, and how it is biased

These are 40 real PDF statements and 6 real CSV/Excel exports, collected from the founder's own accounts and from family and friends who agreed to share theirs. They span 6 currencies, and 14 of the PDFs are credit-card statements rather than bank accounts.

This is not a random sample and we will not pretend otherwise. It is weighted towards Singapore and India, with statements from the UK, the United States, Australia and Brunei alongside them; it is mostly personal accounts, though a small retail business banks in there too; and it contains no statement from a bank that refused to work — because a file nobody could obtain never entered the set. A vendor's own corpus is the weakest form of evidence there is. It is simply more than anyone else in this category currently shows you, and it grows as real files arrive.

The files themselves are never published, and never will be. They belong to real people. What you see below is derived from them by a generator that reads only counts and verdicts and never reads a filename.

Per-file results: PDF

2,722 transactions across 40 files. 34 were read from the page's own text layer; 6 were scans that needed OCR.

FileCurrencyRead asRowsOut / InResult
F01 cardAUDText3432 / 2Reconciled
F02AUDText325301 / 24Reconciled
F03 cardBNDText111105 / 6Unverified
F04GBPText54 / 1Reconciled
F05GBPText6157 / 4Reconciled
F06GBPText205193 / 12Reconciled
F07GBPText242189 / 53Unverified
F08INRText1610 / 6Reconciled
F09 cardINRText1814 / 4Suspect
F10INRText1914 / 5Unverified
F11INRText2115 / 6Reconciled
F12INRText4830 / 18Reconciled
F13INRText5341 / 12Reconciled
F14INRText5347 / 6Unverified
F15INRText10677 / 29Reconciled
F16—Text66 / 0Unverified
F17—Text126 / 6Reconciled
F18—Text126 / 6Reconciled
F19—Text1311 / 2Reconciled
F20—Text7463 / 11Reconciled
F21—Text113106 / 7Reconciled
F22—Text123116 / 7Reconciled
F23 card—OCR1413 / 1Unverified
F24 cardSGDText22 / 0Reconciled
F25SGDText95 / 4Reconciled
F26 cardSGDText105 / 5Reconciled
F27SGDText325 / 27Reconciled
F28SGDText5031 / 19Reconciled
F29 cardSGDText5436 / 18Reconciled
F30 cardSGDText5653 / 3Reconciled
F31 cardSGDText5655 / 1Reconciled
F32 cardSGDText6158 / 3Reconciled
F33 cardSGDText8584 / 1Reconciled
F34SGDText24733 / 214Reconciled
F35 cardSGDOCR87 / 1Reconciled
F36SGDOCR4233 / 9Reconciled
F37SGDOCR7170 / 1Reconciled
F38SGDOCR130124 / 6Suspect
F39 cardUSDText10197 / 4Reconciled
F40 cardUSDOCR2413 / 11Reconciled

File ids are positions in a sorted list, not stable identifiers — they shift when the corpus grows. “card” marks a credit-card statement, where a purchase is exported as a debit so it lands the right way round in QuickBooks and Xero.

Per-file results: CSV and Excel

1,350 of 1,361 source rows mapped into transactions across 6 files. These are parsed entirely in your browser and never uploaded, which is also why this path is weaker at self-checking: it reads column headers, and a header can be missing or meaningless.

FileSource rowsMappedSkippedDate orderResult
C0112120MDYUnverified
C0218180MDYUnverified
C0345450MDYUnverified
C0454486DMYReconciled
C056116065MDYReconciled
C066216210MDYSuspect

The ones we got wrong

Publishing only the wins would make this page marketing. These are the open problems this corpus currently shows.

  • One scanned statement comes back suspect. Our own arithmetic disagrees with the balances it prints, and we have not yet closed the gap. It is counted above as a failure rather than quietly dropped from the sample.
  • One CSV auto-maps none of its 621 rows. The bank exports its headers literally as Column 1 … Column 7, and auto-detection matches on header text, so it has nothing to go on. Mapped by hand in the app it takes all 621 rows correctly — but the automatic path is what most people will meet first.
  • The CSV path computes no reconciliation verdict at all. That is why nearly every CSV above reads unverified. One of them states its own opening balance, closing balance and withdrawal/deposit totals, and its mapped rows match all three to the cent — but we throw that certainty away today rather than report it. A real gap, recorded rather than hidden.

Check us on your own file

You do not have to take this page's word for anything. Drop one of your own statements in — the same reconciliation check runs on it, and tells you which of the three results above your file got, before you export anything. CSV, Excel and OFX files never leave your browser at all.

Method

Every file in the corpus is re-run through the real extraction pipeline — not a test double — on every change that touches it. The run records each file's row count, debit/credit split, zero-amount rows and reconciliation verdict, and compares them against a stored baseline, so an unexplained change in what a real file extracts is itself treated as a defect. This page is generated from those baselines, so it cannot drift from what the checks actually measured: if the corpus grows or the numbers move, the page is stale until it is regenerated, and our build checks fail until it is.

Figures on this page were last regenerated from a corpus of 40 PDFs and 6 CSV/Excel files.