From Monthly Reconciliation to Continuous Matching
Confidence-scored matching, ISO 20022 transaction classification, and the operational impact of daily automated reconciliation.
Real-Time Reconciliation: From Monthly Fire Drill to Continuous Confidence
Last week of the month. The finance team downloads bank statements. Exports the internal ledger. Opens a spreadsheet. Starts matching.
Row by row. Amount, date, reference. Some match cleanly. Some are off by a day, timing difference between booking date and value date. Some match on amount but not on reference, the bank truncated the end-to-end ID. Some don't match at all: a bank fee that no one expected, a returned payment that the system recorded under a different transaction code, a duplicate entry from a provider webhook that fired twice.
The unmatched items become a queue. Each one requires investigation. How old is the discrepancy? A week? Two? Thirty days? The older it is, the harder the investigation. A 30-day-old mismatch requires forensic work across bank portals, internal logs, provider dashboards, and sometimes a phone call to the clearing partner. A 1-day-old mismatch is usually obvious.
This is the monthly fire drill. It costs time, attention, and confidence. The team dreads it. The CFO asks about it. The auditor asks about it more.
Bank Statement Import as the Foundation
camt.053 (bank-to-customer statement) is the ISO 20022 standard format for end-of-day bank statements in SEPA. Most banks provide it. Some provide camt.052 (intraday) as well.
Automated import means: parse the XML, extract transactions as structured records, store them in a reconciliation staging table. Each imported transaction carries:
| Field | Source | Purpose |
|---|---|---|
| Amount | camt.053 Amt | Primary match field |
| Currency | camt.053 Ccy | Must match ledger currency |
| Value date | camt.053 ValDt | Settlement date (not booking date) |
| Booking date | camt.053 BookgDt | When the bank recorded it |
| Creditor/Debtor IBAN | camt.053 CdtrAcct/DbtrAcct | Counterparty identification |
| End-to-end reference | camt.053 EndToEndId | Primary correlation to internal transfers |
| BankTransactionCode | camt.053 BkTxCd (Domain/Family/SubFamily) | Transaction classification |
| Remittance info | camt.053 RmtInf | Free-text or structured reference |
The BankTransactionCode is the same ISO 20022 classification discussed in the ISO 20022 article: PMNT/RCDT/ESCT for an incoming SEPA Credit Transfer, PMNT/RDDT/ESDD for an incoming Direct Debit. If the internal ledger uses the same codes, because it stores ISO 20022 classifications natively, the classification match is structural. No translation required.
Confidence-Scored Matching
Matching is not binary. A bank statement entry either matches an internal ledger entry perfectly, partially, or not at all. The matching engine compares multiple fields and produces a confidence score.
| Match Field | Weight | Tolerance |
|---|---|---|
| Amount + Currency | 40% | Exact match required |
| End-to-end reference | 30% | Exact or substring (banks truncate) |
| Value date | 15% | ±1 business day |
| BankTransactionCode | 10% | Exact ISO code match |
| Counterparty IBAN | 5% | Exact match |
Weights are configurable. Date matching tolerates ±1 business day because value dates and booking dates can differ across time zones and clearing cutoff times.
The confidence score drives the action:
| Confidence | Count (typical) | Action |
|---|---|---|
| ≥ 0.95 | ~92% of items | Auto-matched. No human review needed. |
| 0.70, 0.94 | ~5% of items | Suggested match. Manual confirmation with one click. |
| < 0.70 | ~3% of items | Unmatched. Requires investigation. |
The target: auto-match rate above 95%. This means 95 out of 100 bank statement entries are matched to internal ledger entries without human intervention. The remaining 5 are presented to the finance team as a prioritized queue, not a spreadsheet dump.
The 3% unmatched items are the ones that matter. They are bank fees, late returns, provider duplicates, and genuine discrepancies. Investigating 3 items per 100 is a task. Investigating 100 items per 100 is a fire drill.
From Monthly to Continuous
The shift: import bank statements daily (camt.053 end-of-day) or intraday (camt.052). Run the matching engine automatically. Present the results every morning.
| Interval | Unmatched Queue Size | Investigation Effort | Discovery Lag |
|---|---|---|---|
| Monthly | 100-500 items | Multi-day project | Up to 30 days |
| Weekly | 25-100 items | Half-day task | Up to 7 days |
| Daily (T+1) | 5-15 items | 30-minute review | 1 day |
| Intraday | 1-5 items | Real-time alerts | Hours |
Investigation effort drops not just because the queue is smaller, but because the items are fresh. A discrepancy from yesterday has context: the team remembers the transactions, the bank portal shows recent activity, the provider dashboard has current data. A discrepancy from three weeks ago requires archaeology.
Three metrics track reconciliation health:
- Auto-match rate: percentage of items matched without human intervention. Target: >95%.
- Average resolution time: how long unmatched items stay in the queue. Target: <24 hours.
- Reconciliation gap: elapsed time between a transaction occurring and its reconciliation being confirmed. Target: T+1 or better.
What This Requires from Your Ledger
A matching engine is only as good as the data it receives from both sides. Bank statements provide structured, ISO-standard data. Your internal ledger must provide equally structured data, or the matching degrades from deterministic to heuristic.
Consistent references. Every outbound payment must carry an end-to-end reference that the bank preserves in the statement. If the internal system generates references that the clearing network truncates or modifies, the matching engine loses its primary correlation field.
ISO-standard transaction codes. If the internal ledger uses PMNT/ICDT/ESCT for an outgoing SEPA Credit Transfer and the bank statement uses the same code, matching on transaction type is automatic. If the internal ledger uses a proprietary code (SEPA_CT_OUT) and the bank statement uses ISO, a translation layer is needed, and every translation is a potential mismatch source.
Value dates. The bank statement reports value dates (when funds are available) and booking dates (when the bank recorded the entry). The internal ledger must track both. Matching on booking date alone produces false mismatches when value dates differ.
Structured amounts. Integer arithmetic. No floating-point. A ledger entry of EUR 100.00 stored as 10000 (cents) matches a bank statement amount of 100.00 parsed to 10000. If either side uses floating-point, rounding differences create phantom mismatches: 99.999999 ≠ 100.000000.
The Operational Impact
Continuous reconciliation changes the finance team's relationship with the numbers.
Monthly reconciliation is retrospective. The team discovers problems after the fact. The CFO sees the reconciliation report and asks: "Are we confident in last month's numbers?" The honest answer is: "We will be, after we clear the unmatched queue."
Daily reconciliation is prospective. The team starts each day with a confirmed position. The unmatched queue from yesterday is 5 items, not 500. The CFO asks: "Are we confident?" The answer is: "As of yesterday's close, yes. Here are the 3 items we're investigating today."
The confidence is not aspirational. It is measured. Auto-match rate: 96.2%. Average resolution time: 4.3 hours. Reconciliation gap: T+1. These are numbers an auditor can verify.
Read more: Connectivity, Financial Rails | ISO 20022: Beyond Message Format Conversion
Sources:
- ISO 20022 camt.053.001.11, Bank-to-Customer Statement message specification
- ISO 20022 camt.052.001.11, Bank-to-Customer Account Report (intraday)
- ISO 20022 BankTransactionCode, External Code Sets (Domain/Family/SubFamily)
- ECB TARGET2 operating schedule (https://www.ecb.europa.eu/paym/target/target2/profuse/calendar/html/index.en.html)