Read, prove, then export.
Six steps, all of them inside the browser tab. The fourth is the reason to use this over a generic PDF converter.
1. Open the PDF
The file is opened with pdf.js, the PDF engine built into Firefox, running from this site's own copy. It yields every piece of text on each page with its exact position. Nothing else is needed, which is why a statement downloaded from online banking works and a scan does not: a scan has no text, only a picture of text.
2. Find the table
TallyRows looks for header rows — a line made mostly of column labels such as Date, Description, Withdrawals, Deposits, Paid out, Amount, Balance. The position of each label becomes the edge of its column. A statement can have several tables (deposits in one section, card purchases in another); each header starts its own section.
3. Read the rows
- A line with a date under the date column starts a transaction. Figures are assigned to the money column they line up with, so a reference number inside a description is never mistaken for an amount.
- Lines with text but no date or figures are description lines, and are attached to the nearest transaction — whether the bank prints them above, beside or below the figures.
- Statements that print the date only once per day are handled: a line with an amount but no date takes the date above it, and is shown in grey so you can see it was carried down.
- When a section has a single unsigned amount column, the section heading decides the sign: “Deposits and additions” are money in, “ATM & debit card withdrawals” are money out.
- Years missing from the rows (“03/14”) come from the statement period printed at the top, including periods that cross New Year. Whether 03/04 is March 4 or 3 April is decided from the dates in the same document that can only be read one way.
4. Prove the figures
Banks print their own arithmetic, and TallyRows checks your rows against it in two independent ways:
- Running balance. Each printed balance must equal the previous balance plus every amount in between. Where a bank prints one balance per day, the whole day is checked at once.
- Totals. Opening balance plus money in minus money out must equal the closing balance, and the money-in and money-out totals must match the summary the bank printed — including statements that split withdrawals into several categories.
The result is one of four verdicts:
- Every amount checks out — each amount is covered by at least one passing check.
- Checks pass, some rows uncovered — what can be checked agrees, but some rows have no printed balance after them.
- Mismatch — a check fails. The row where the chain breaks is flagged with the exact difference.
- Nothing to check against — the statement prints no balances or totals. Rows are still read, but you should compare a few by eye.
5. Look, and fix if needed
The original page sits next to the rows. Click a row and it is highlighted on the page. Double-click any cell to correct it; the checks re-run as you type, and every edited cell is underlined so the exported file is never silently different from the statement.
6. Export
CSV is free. With a plan, Excel (with real dates and numbers, filters, totals and a sheet listing the check results), QBO for QuickBooks, and OFX for Quicken, Xero and other accounting software. Several statements can be merged into one file in date order.
What “nothing is uploaded” means, technically
Every page on this site is served with a Content-Security-Policy that includes connect-src 'none'. That instruction is enforced by your browser, not by us: it forbids the page from opening any network connection — no uploads, no analytics, no background requests. Fonts and the PDF engine are served from this site, so no third party learns that you visited.
Limits worth knowing
- No OCR. Scanned or photographed statements will not read.
- Column labels are matched in English.
- Password-protected PDFs must be opened and re-saved without a password first.
- A layout that does not read is reported as such; TallyRows does not guess. See statement layouts.