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.

Drop a PDF statement here
or click to browse — several at once become a batch. Parsed in memory, never stored.
Your bank missing? Tell us which one →

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.

No statement handy? Try:
✓ In-memory only, nothing stored ✓ No sign-up ✓ Open source, MIT

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.

14.016,55 − 1.234,56= 12.781,99 ✓
12.781,99 − 64,30= 12.717,69 ✓
12.717,69 + 42,50= 12.760,19 ✓

Opening to closing

No balance column? Then the opening balance plus every transaction must land exactly on the closing balance printed by the bank.

4,522.10
+ 3,215.00 in
− 2,529.47 out
= 5,207.63 ✓ matches

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.

700.00 → +700.00? −700.00?
chain agrees only with +700.00
1 sign auto-corrected · reported

Four files, ready for wherever your books live

One conversion returns all four — download whichever your workflow needs.

statement.csv

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.

statement.xlsx

Excel

Typed columns — dates are dates, amounts are numbers, not strings pretending. Sort, filter and pivot right away, no re-parsing dance.

statement.qbo

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.

EXTF_statement.csv

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.

$ truecsv stmt.pdf -f csv,qbo
✔ stmt.pdf profile=chase txns=14
  opening 4,522.10 → closing 5,207.63 · reconciliation OK
import { parseStatement } from 'truecsv';

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.

Read the source ↗ docker compose up
01
Parsed in memory
Never written to disk, never queued, never logged. The response is built and the bytes are gone.
02
No account, no history
No sign-up, no email, no list of your uploads anywhere.
03
Open source, MIT
Read every line before you trust it — or self-host it next to your books with one command.
04
Counted, not tracked
Daily totals only — pages served, statements converted, which bank matched, which export was taken. No cookie, no record of a single request. To count visitors rather than views, your IP address and browser string are hashed with a salt that is never written down and is thrown away when the day, week or month it counts ends; what is kept is a table of counters no visitor can be recovered from.

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.