Bank statements,
out of the PDF.
Drop a statement — get CSV, Excel, or QuickBooks. Every number is checked against the statement's own math before you download.
A profile names the bank and sets its date order, decimals and currency — the layout is read from your file either way. Leave this on auto unless a date or an amount came out wrong.
Every conversion shows its work
Converters usually hand you a spreadsheet and wish you luck. This one proves itself first — using the numbers already printed on your statement. How the check works — and what it can’t catch →
Row by row
When a statement has a balance column, every row must satisfy previous balance + amount = this balance. All of them. No exceptions.
Opening to closing
No balance column? Then the opening balance plus every transaction must land exactly on the closing balance printed by the bank.
Signs solved, not guessed
Many statements print amounts unsigned. Instead of guessing, we solve for the sign that makes the whole chain agree — and report every flip we make.
Four files, ready for wherever your books live
One conversion returns all four — download whichever your workflow needs.
CSV
Opens clean in Excel, Sheets and Numbers. One signed column or debit/credit split — your pick. Formula-injection guard built in, so a description like =SUM(…) stays text.
Excel
Typed columns — dates are dates, amounts are numbers, not strings pretending. Sort, filter and pivot right away, no re-parsing dance.
QuickBooks (QBO)
Web Connect format QuickBooks imports natively. Transaction IDs are derived from the transaction itself, so re-importing the same statement won’t create duplicates. Checking, savings, credit card and more.
DATEV
A Buchungsstapel in DATEV-Format (EXTF 700), for German bookkeeping. Amounts unsigned with Soll/Haben, Windows-1252 as the format requires. Every row lands on one contra account for your bookkeeper to reassign — a statement never says which account a payment truly belongs to.
Prefer a terminal?
The web page is just a thin wrapper. The same engine — same parsing, same verification — ships as a CLI and a TypeScript library, for folders of statements or your own pipeline.
Your statement stays yours.
A bank statement is about as private as documents get. This tool is built so you never have to take anyone's word for it — including ours.
docker compose up
Fair questions
What about scanned statements?
Yes, by recognising the page images — you ask for it, because it costs about a second a page where reading text costs nothing. Every amount is then checked against the statement’s own balances exactly as usual, so a misread digit breaks the sum and the result comes back unverified rather than wrong. The descriptions and the dates are not checked, because no arithmetic can check them: read them before you import.
My bank isn't on the list.
Try it anyway. The generic engine reads most layouts by geometry alone, and the verification math works for any bank. Named profiles just add polish for odd formats.
What happens when verification fails?
You see exactly where the chain breaks and fix it in one click — or export as-is with the gap noted in the file's warnings. Never a silently wrong number.
Any limits?
32 MB, 100 pages and 6 000 transactions per file — the last two are what this server can hold without falling over, and a bigger statement splits by period. Multi-account statements and foreign-currency sub-sections are still on the honest-limitations list.
Why not just use ChatGPT?
For one statement you want to look at, often you should — it is faster. It cannot check its own reading against the balances, it cannot write a file QuickBooks or DATEV will accept, and if the statement is a client’s, sending it to a consumer assistant is a disclosure decision. The long answer.