September 3, 2026
Every bank statement carries its own proof of correctness, printed at the top and bottom of the page. A converted statement that has not been checked against it is a guess with good formatting.
A statement is a closed system. The bank prints an opening balance, lists every transaction in the period, and prints a closing balance. Those three things are bound by one line of arithmetic:
opening balance + credits − debits = closing balance
If the transactions you extracted from the PDF do not satisfy that equation against the printed figures, at least one transaction is wrong, missing or duplicated. There is no third possibility. The bank's own ledger produced the closing balance from those same transactions, so any reading of them that lands somewhere else has misread something.
Most statements also print a running balance after every transaction, or at least at the end of each day. That gives a second, finer check: each balance must equal the previous balance plus that row's amount. The chain has to hold from the first row to the last. When it breaks, the row where it breaks is the first row that was read wrongly, and you go straight there instead of scanning three hundred lines.
PDF extraction fails in ways that leave no trace. The output is a tidy table, every cell filled, and one of them is wrong. The recurring cases:
Each of these leaves a spreadsheet that opens without complaint, sorts by date, and totals to a plausible number.
Bookkeepers are good at spotting a row that looks strange. The failures above do not look strange. A dropped row is invisible by definition. A sign flip on a $1,240.00 rent payment is a $1,240.00 deposit with the landlord's name on it, and on a busy statement it reads as ordinary. A misread digit on a card purchase is a card purchase.
The only thing that exposes them is the arithmetic. A dropped $312.50 row leaves the closing balance $312.50 short. A flipped $1,240.00 leaves it $2,480.00 off. A duplicated line adds exactly its amount. Every failure mode has a signature in the total, and the running-balance chain points at the row.
The same applies to the general-purpose chat tools people now paste statements into. They do a reasonable job on a two-page statement. On a long one they tend to drop rows partway through or collapse a run of similar transactions into fewer lines, and they do not check their output against the printed totals unless asked. The result comes back formatted and confident. Reading a ledger is not a language problem; the check that matters is arithmetic, not fluency.
This is why the tie-out is worth more than any amount of visual review. It is one calculation, it uses only numbers printed on the statement, and it fails on every one of the errors above:
| Extraction error | Effect on closing balance | Where the chain breaks |
|---|---|---|
| Digit misread | Off by the difference | At that row |
| Row dropped | Off by the row's amount | At the row after the gap |
| Rows merged | Off by the lost amount | At the merged row |
| Sign flipped | Off by twice the amount | At that row |
| Line duplicated | Off by the duplicate | At the duplicate |
Two errors can cancel exactly, in theory. The running-balance chain, which checks every row rather than just the total, is the safety net for that. A statement that passes both the total and the chain has been read correctly, row by row.
The tie-out is also what turns "I converted it" into something you can defend. If a client or an auditor asks how you know the imported transactions are complete, "the rows reconcile to the printed opening and closing balances" is an answer. "I looked at it" is not.
A failed tie-out is not a dead end; it is a pointer. Work it in this order:
The tie-out needs two numbers from the statement itself: the printed opening balance and the printed closing balance. Without the closing figure there is nothing to compare against. A converter can still add up whatever it extracted, but a sum with nothing to check it against is not a check; it is the same guess written as a total.
This is why PennyClose will not show a statement as tied unless it has found the printed closing balance and the extracted rows reach it from the printed opening balance. If there is no closing figure it can read, or the figure is ambiguous, the result says so and the export is marked as unproven. That is less satisfying than a green light on every upload. It is also the only honest thing a converter can say.
The practical rule is short. Convert the statement. Look for the proof against the printed balances. If it ties, import. If it does not, find the first broken row before you do anything else. Never import a statement that nobody has shown to tie.
Try it. Upload a statement and see whether it ties to its printed balances before you download anything. The preview is free and needs no account. Convert a statement