Bank Reconciliation Statement

Layout

Balance as per cash book                                  B
Add:  cheques issued but not yet presented               +c      book payments with a cheque number, unmatched
Add:  other payments booked but not yet debited          +p      book payments without a cheque number, unmatched
Add:  bank credits not yet booked                        +i      interest, returned payments, unidentified credits
Less: deposits booked but not yet credited               -d      book receipts, unmatched
Less: book receipts with no bank credit (duplicates)     -u      book receipts flagged as possible duplicates
Less: bank debits not yet booked                         -k      charges, GST, TDS, returned cheques, withdrawals
-------------------------------------------------------------
Balance as per bank (computed)       B + c + p + i - d - u - k
Balance as per bank statement                             S
Difference                                                S - computed

Empty sections are omitted. Each item line shows its id, date, description and, for bank items, the classification.

Where the balances come from

Why it must tie

Let U_bank and U_book be the signed totals of unmatched bank and book items, including carried-forward ones. Matched items have equal totals on both sides, so they cancel. With C_bank and C_book the signed totals of the carried-forward items:

difference = (opening_bank - opening_book) - (C_bank - C_book)  [+ statement footing error]

The difference is zero exactly when the opening balances are consistent with the outstanding items carried in. It does not depend on how well the matching did, which is why the BRS still ties after a reviewer rejects or creates matches, and why the test suite checks it as a property over generated data with random rejections.

When it does not tie

bankrecon brs exits with status 2 (and run --strict does too), prints STATUS: DOES NOT TIE and the diagnostics:

Example, September run with an opening book balance that is 1,234.00 too high (real output; brs then exits with status 2):

Balance as per bank statement                                                                               87,62,300.34
Difference                                                                                                     -1,234.00
========================================================================================================================
STATUS: DOES NOT TIE
  - Opening balances disagree with the carried-forward outstanding items by -1,234.00: check the opening balances and the prior-period outstanding list.
  - Possible duplicate book entries: L-0358

Carry-forward and aging

When a period is stored, its unmatched items (after review) are what the next run loads. Carried items keep their identity as B-0007@2026-09, are matched in the new period by the same passes, and stay outstanding otherwise. bankrecon outstanding --aging measures age against the last day of the period and buckets it as 0-30, 31-60, 61-90 and 90+ days. A cheque issued but not presented for more than stale_days (90) is flagged as stale: cheques are valid for three months, so it should be re-issued or written back.

The first period has nothing to carry from; pass the items outstanding at the start with --prior-outstanding and the matching opening balances.