2026.09.02

Bank reconciliation: from two days to twenty minutes

One month-end walked through: 240 bank movements, 180 invoices, twenty minutes.

Every payment leaving your bank account should have an invoice behind it. Every invoice you send should have money arriving against it.

This is one of the basic tasks of month-end, and in principle it's simple. In practice it means matching hundreds of bank movements to hundreds of invoices, by hand, every month. That is slow. So most teams tick off the obvious ones and let the small differences go.

That is where duplicate payments quietly stay paid.

Why matching is hard

If every transfer arrived with the exact amount and a correct reference, this would be trivial. They don't arrive that way.

A customer pays two invoices in one transfer. Or one invoice in two instalments. Or deducts a credit note, so the amount doesn't agree. Or puts their own internal reference in the payment description instead of your invoice number. Or the company name on the bank statement differs from the name on the invoice.

Each of those needs a moment of thought — and there are several hundred of them a month.

What the system does

AI reconciles the whole statement: every bank movement matched to the right invoice, supplier and customer, by amount, reference, date and counterparty — not on any single field, but on the pattern they form together.

Take a worked example: a month-end with 240 bank movements against 180 invoices. The system matches 168 of the 180 automatically. And not only the obvious ones:

  • Missing reference — €1,150.00 arrives with no payment description, but amount and counterparty identify it unambiguously
  • Rounded payment — €6,000.00 received against an invoice for €5,998.75; a €1.25 variance, plainly the same item
  • Merged payment — a single transfer of €9,420.00 covering three invoices: €3,200.00 + €4,180.00 + €2,040.00

Those three cases are what make manual reconciliation slow. A rule-based system would drop all three.

Whatever does not resolve is flagged with the reason attached. In this example that is 16 movements and 12 invoices, together worth €15,052.40.

How the system decides what belongs together

Matching doesn't hinge on any one field. On amount alone, two invoices of equal value get confused; on reference alone, most items stay unmatched.

So the system weighs the amount, the reference in the payment description, how close the dates are, and the identity of the counterparty together — and derives a confidence level from the combination. High-confidence matches settle automatically. Uncertain ones don't: they go to a person as a suggestion, with what supports it and what argues against it.

That distinction is what makes the system usable. A tool that tries to match everything will eventually match something wrongly — and a wrong match is worse than an unmatched item, because nobody will ever look at it again.

Currency and multiple accounts

Reality is rarely one invoice, one bank, one currency. A foreign-currency invoice settled locally, several bank accounts, bank charges deducted, direct debits — each adds manual work.

Exchange differences are a standing irritation: the invoice amount and the amount received never agree exactly, and the difference has to be posted manually to FX gain or loss. That is precisely the kind of operation the system handles automatically within a tolerance, flagging whatever falls outside it.

Why duplicate payments are the expensive ones

The other exceptions surface on their own eventually. An unpaid invoice gets chased by the supplier. A part payment shows up at the next reconciliation.

A duplicate payment announces nothing. Nobody misses it, because the supplier did receive their money — twice. If it isn't caught at month-end, it is likely caught after the quarter closes, or never.

That kind of error doesn't persist because the team is careless. It persists because manual matching runs out of capacity before it reaches the last items on the list.

What a typical exception list holds

Flagged items are not all alike, and not all urgent. From the same worked example:

  • Paid twice — €4,820.00. The same invoice settled twice by two separate SEPA transfers on consecutive days. Same amount, same reference. That is recoverable money.
  • No invoice on file — €7,340.00. Three outgoing payments with no matching invoice in the ledger. Not lost money, but audit exposure: missing documentation.
  • Partially paid — €2,400.00. €10,000 received against an invoice for €12,400.
  • Overpayment — €310.00. €5,110 received against an invoice for €4,800. A credit is due back.
  • FX and bank fee variance — €182.40. Nine small differences, each under €40, grouped into a single decision.

That last line matters more than its size suggests. Nine separate small differences would mean nine separate decisions, which nobody considers worth making. Grouped, it is one click. This is what keeps exception handling to twenty minutes rather than turning it into another half-day.

What changes

  • Month-end matching: from two days to roughly twenty minutes
  • Automatically matched: 93% of items in the example
  • Money recovered: €4,820.00 in a single month, from the duplicate payment
  • Audit gaps closed: all three missing documents requested

What implementation needs

Two things: access to the bank data and access to the invoice data. The first is usually solved by automatic statement import or an open banking connection; the second comes from the accounting or ERP system.

What really matters is history. With a year or two of previously reconciled months, the system has something to learn from: how each counterparty references payments, who routinely pays several invoices together, where part payments are normal. It works without that too — there are simply more items for a person to review in the early months.

A realistic expectation: half to two thirds clearing automatically in the first month, eighty to ninety percent after a few.

Where it runs

The system connects to your existing accounting or ERP platform and runs in your own EU cloud environment. Bank data is the most sensitive commercial information a company holds; it is not used to train a third party's general models.

If your month-end still runs on manual matching, it is worth measuring how long it actually takes — and what isn't being found as a result.