truecsv.

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.
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.

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

Three files, ready for wherever your books live

One conversion returns all three — 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.

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.

Fair questions

What about scanned statements?

Not yet. Image-only PDFs are rejected with a clear error instead of a silent garbage parse. OCR is on the roadmap — it ships when it can pass the same verification math.

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 and 500 pages per file. Multi-account statements and foreign-currency sub-sections are still on the honest-limitations list.