Compare records between two systems to find mismatches, missing entries, and data drift. The detective pattern that finds problems before they become costly — essential for finance, HR, and IT.
Rendering diagram…
Use cross-system reconciliation when:
Rendering diagram…
| Parameter | Example |
|---|---|
| System A | ERP (source of truth for financials) |
| System B | Bank statement / Payment processor |
| Matching key | Invoice number, PO number, or transaction ID |
| Fields to compare | Amount, date, status, counterparty |
| Tolerance | Amounts within $0.01 are considered matching |
| Frequency | Daily for financial, weekly for operational |
| Period | Reconcile records from the last 7 days |
Pull records from each system for the reconciliation period:
records_a = query_system_a({
date_range: [period_start, period_end],
status: ['completed', 'pending']
})
records_b = query_system_b({
date_range: [period_start, period_end],
status: ['completed', 'pending']
})
Normalise the data:
For each record in System A:
For remaining unmatched records in System B: 4. Record as "missing in A" (orphans)
Matching strategies for fuzzy scenarios:
| Strategy | When to Use |
|---|---|
| Exact key match | Both systems share a common ID (invoice number) |
| Composite key | Match on amount + date + counterparty when no shared ID |
| Fuzzy match | Names/descriptions may differ slightly (Levenshtein distance) |
| One-to-many | One PO in System A corresponds to multiple invoices in System B |
| Result | Priority | Action |
|---|---|---|
| ✅ Full match | None | Log and move on |
| ⚠️ Partial match (some fields differ) | Medium | Create investigation task |
| ❌ Missing in target | High | Investigate — failed sync? delayed entry? |
| ❌ Orphan in target | High | Investigate — unauthorized entry? |
| 🔄 One-to-many resolved | Low | Log the mapping for reference |
📊 Daily Reconciliation — Mar 15, 2025
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ERP (System A) vs Bank Statement (System B)
Period: Mar 14, 2025
Summary:
• Total records compared: 245
• ✅ Matched: 232 (94.7%)
• ⚠️ Mismatched: 5 (2.0%)
• ❌ Missing in Bank: 6 (2.4%)
• ❌ Orphans in Bank: 2 (0.8%)
Top mismatches by value:
1. INV-4521: ERP $5,000.00 vs Bank $5,200.00 (Δ $200)
2. INV-4498: ERP $12,350.00 vs Bank $12,350.50 (Δ $0.50)
Missing in Bank (may be pending):
• INV-4530 ($3,200) — Created today, likely not yet processed
• INV-4528 ($8,900) — Created 3 days ago ⚠️ OVERDUE
Based on the results:
| Finding | Automated Action |
|---|---|
| Mismatch > tolerance | Create investigation task for Finance |
| Missing > 3 days | Escalate to Accounts Receivable |
| Orphan record | Flag for fraud review |
| Reconciliation rate < 95% | Alert Finance Director |
Always run reconciliation in read-only mode first. Never auto-correct mismatches without human review. A "mismatch" might mean System A is wrong, not System B.
Accept file uploads (CSV, Excel), validate every row against business rules, report errors to the submitter, and import clean data into the target system. The essential pattern for bulk data intake.
Take a basic record and enhance it with data from external APIs — geocoding addresses, resolving company info, validating phone numbers, scoring leads. Transform minimal input into rich, actionable data.