Automating bank reconciliation: from four days to forty minutes

Two ledger columns with matched rows connected in green and one unmatched row flagged in red

The client's finance team spent the first four working days of every month reconciling bank statements against open invoices - three people, a shared spreadsheet, and a ritual everyone dreaded. The request was "automate it." The interesting part was what it turned out to be.

The matching is easy; the exceptions are the product

Roughly 85% of statement lines matched an invoice on reference number alone. Another 10% matched on amount + counterparty + date window. Writing that logic took a week.

The remaining 5% is where the four days had actually gone: partial payments, bundled payments covering seven invoices, customers who paid from a different legal entity than the one on the invoice, and reference fields containing anything from poetry to the accountant's initials.

So the deliverable was never "a matcher." It was an exception queue - a screen where the unmatched 5% arrive each morning, pre-enriched with the three most likely candidate invoices and one-click actions to confirm, split, or escalate. The system learns from each confirmation: a counterparty-entity mapping confirmed once is applied automatically forever after.

Results, honestly stated

  • Month-end reconciliation went from ~32 person-hours to ~40 minutes of exception review.
  • Match rate climbed from 85% to 97% over six months as the mapping tables filled in.
  • The remaining 3% are cases a human should look at - that is the queue doing its job, not failing at it.

The lesson we keep re-learning: in finance integrations, the code is the small part. The value is in the mappings, and mappings are built by putting the right exceptions in front of the right person with the least possible friction.