StatementKit

What Bank Statement Reconciliation Actually Means, and How to Check Yours Balances

Faraz Ali Khan6 min read

“Reconciliation” gets used loosely enough that it’s worth pinning down what it actually means before talking about how to do it. At its core, reconciling a bank statement is answering one question: does the running balance, calculated by adding up every transaction in order starting from the opening balance, actually land on the closing balance the bank printed? Everything else — matching transactions to invoices, categorizing expenses, flagging suspicious activity — is a separate exercise that depends on this one being true first. If the arithmetic itself doesn’t add up, nothing built on top of it can be trusted, no matter how carefully categorized it is.

The check, precisely

Take the opening balance printed on the statement. Add the first transaction’s amount (positive for a deposit, negative for a withdrawal). That sum should equal the balance printed next to that first transaction, if the statement prints a running balance column — many do. Add the second transaction to that running total, and it should match the balance next to the second row. Continue for every transaction on the statement. If you reach the last row and the final running total matches the closing balance the bank printed, the statement reconciles. If it doesn’t, something between the opening and closing balance is wrong — a transaction is missing, an amount was misread, or a sign is flipped somewhere in the chain.

This is a chain, which matters more than it sounds like it should: an error anywhere in the middle propagates forward through every balance after it. If transaction #14 is off by ten dollars, every printed running balance from #14 onward will look “wrong” relative to a naive from-scratch recalculation, even though only one transaction actually has a problem. A useful reconciliation check has to be able to tell the difference between “everything after this point is wrong because of this one row” and “everything is independently wrong,” and that distinction is exactly what makes automating this check harder than it first appears.

Why a single “does it balance: yes/no” isn’t enough

A statement either reconciles or it doesn’t, but “it doesn’t” isn’t useful information on its own — you need to know where. The approach worth using walks the chain once, row by row: for each row that has its own printed balance, check whether the opening balance plus every transaction amount seen so far since the last known-good balance actually equals that row’s printed balance. If it does, that row is confirmed correct, and the running total resets from there — meaning a bad row doesn’t get blamed for every row after it, only for itself. If it doesn’t, that specific row gets flagged as a balance break, with the expected value, the actual printed value, and the size of the discrepancy attached to it.

This “re-anchor at each known-good balance” detail matters in practice more than it sounds like it should. Statements sometimes have a row where the balance column is blank, unreadable, or genuinely absent for that line (a pending transaction, a memo line). A naive implementation that assumes every row must chain perfectly from row one would report every single row after a single unreadable balance as “wrong,” which is technically true in an unhelpful, useless-for-debugging way. Re-anchoring at the next row with a real balance means one gap in the data doesn’t cascade into forty false alarms.

Reading the size of a discrepancy, not just its existence

Not every mismatch means the same thing. A difference of a cent or two is almost always a rounding artifact somewhere in how a bank formats fractional interest or fee amounts, not a real error. A difference of a few dollars up to a few dollars up to twenty-five often points to a single misread transaction — a 1 read as a 7, a decimal point in the wrong place. A difference of hundreds of dollars usually means an entire transaction is missing or duplicated, not that one number is slightly wrong. Treating these differently — rather than reacting to every non-zero difference with the same level of concern — is the difference between reconciliation being a useful triage tool and being background noise you learn to ignore.

Doing this without a calculator and a lot of patience

Manually walking a 40-60 row statement by hand, checking each running balance against a printed one, is exactly the kind of task that’s tedious enough that people skip it under time pressure — which is precisely when a mistake is most likely to slip through uncaught. StatementKit runs this check automatically the moment you enter a statement’s opening and closing balance: it walks every transaction in the order they appear, re-anchoring at each row with a real printed balance the way described above, and tells you immediately if — and exactly where — the numbers stop lining up, rather than leaving you to notice an off-by-one error by eye three rows or three weeks later.

The other checks worth running alongside the balance

Balance reconciliation catches arithmetic errors, but it won’t catch everything worth catching. Two transactions with the same date, amount, and description are worth flagging as possible duplicates even if the balance still reconciles perfectly (a duplicate paired with an equal-and-opposite missing transaction can cancel out arithmetically while still being wrong). A transaction dated well outside the statement’s period, or one that’s out of chronological order relative to its neighbors, is often a sign of a misread date rather than a real anomaly. None of these are the same check as balance reconciliation, but they’re the natural next things to look at once you know the arithmetic itself holds up.

Get a statement’s balance to reconcile first. Everything else you do with the data — categorizing, matching against invoices, building a report — is only as trustworthy as that first check.

Working with US Bank statements specifically? See converting a US Bank statement to Excel.