Structured rows · verified · traceable

Extract transactions from a bank statement PDF

Extraction is only useful if you can trust it, and trust needs evidence. Every row this tool produces is checked against the running balance your statement prints, and the original text line behind each row is included in the output.

Drop your bank statement here

PDF from online banking, or an OFX / QFX export. Click to choose, or paste with Ctrl/⌘+V.

Text-based PDF up to 60 MB / 200 pages, or .ofx / .qfx

Never uploaded — conversion happens in your browser No sign-up, no email Rows checked against the statement's running balance

What happens between the PDF and the spreadsheet

1. Text with positions

The PDF's text layer is read as runs of characters, each with an x and y position and a font height. No meaning yet — just geometry.

2. Geometry becomes a table

Runs that share a baseline are grouped into rows. Numeric runs that share a right edge are grouped into columns. That is the whole trick, and it is why the parser does not care which bank printed the statement.

3. Columns get roles

Is that leftmost numeric column money-out, money-in, a signed amount, or the balance? The tool tries each plausible reading and keeps the one that best explains the balance chain.

4. The chain is checked

Each row's amount is tested against the difference between consecutive balances. Rows that fail are flagged with the delta, so a mismatch is visible rather than assumed away.

Every flag, and what it means

A flag is not an error message. It is a short list of the specific reasons a row could not be fully verified, so you know what to look at in the original PDF.

amount-not-found
No amount was read on this row. The amount is usually on the following line — check whether it was picked up.
both-debit-and-credit
Two money values on one row. Some statements show a fee and a net on the same line; only one belongs to the transaction.
sign-corrected
The amount's sign was flipped because only the flipped value satisfies the running balance. Usually correct — occasionally a sign that really is unusual.
multiline-description
Informational only. A continuation line was folded into this row's description. Safe to ignore.
balance-not-found
The row has no balance, so it could not be checked. Common on the last row of a statement.

Confidence, stated plainly

The result is graded rather than presented as either perfect or broken:

  • ok — text layer is healthy and the rows reconcile.
  • low confidence — rows were extracted but something did not add up, or very few transactions were found.
  • needs OCR — the PDF has no usable text. No rows are offered at all.

That last case matters most. A tool that returns plausible rows from a scan it cannot read is worse than one that refuses.

Questions people actually ask

What does "extract transactions" mean here?

Turning the table printed on a statement into structured rows: date, description, money in, money out and running balance. What comes out is not a wall of text but one record per transaction, typed so a spreadsheet or a script can work with it.

How do I know nothing was skipped?

The statement tells us. Every row prints a running balance, so the tool checks that each previous balance plus the row amount equals the balance printed on the next row. A skipped row breaks that chain, which is why a missing transaction shows up as a mismatch rather than as silence.

Can I see the original line behind a row?

Yes. The Excel workbook includes a Raw sheet with the source text line for every transaction, plus the balance delta and the flags for that row. If a converted figure is ever questioned, the line it came from is in the same file.

What if a row cannot be read?

It is flagged, not dropped. Common flags are "amount-not-found" (the amount landed on the next line), "both-debit-and-credit" (two amounts on one row), "sign-corrected" (the sign was flipped to satisfy the running balance) and a plain mismatch against the balance chain. The preview has a filter to show only flagged rows.

Can I extract transactions from hundreds of statements?

Not in one go, and not by uploading a folder — the browser does one file at a time and there is no server to hand work to. A batch route is planned; the current tool is for one statement at a time, however many pages it has.

Does extraction work on a scanned statement?

No. A scan has no text to extract, only pixels, so it needs OCR first. The tool detects that case and says so rather than producing invented rows — see the scanned statements page for what to use instead.