Bank-reconciliation engine
Cut bank-reconciliation matching from centuries to minutes
Outcomes
The problem
The platform reconciles large volumes of bank and ledger records for a financial operation with roughly $90M in annual revenue. At its core sits a matching problem: pair every transaction with its counterpart across statements, ledgers and third-party systems. Done naïvely, that match is NP-hard: the pairing space explodes, and a brute-force run is measured in centuries, not minutes. This was never a tuning problem. It was a modelling problem.
Context
I joined as a reconciliation & banking solutions developer (intern) on a live platform: a 100K+ LOC codebase fed by SAP, REST APIs and internal client systems over batch jobs and real-time webhooks. The constraint hierarchy was strict and non-negotiable: correctness first, then speed, then maintainability. A wrong or double-posted match isn’t a glitch; it’s a real-money defect.
Approach
The win wasn’t faster hardware. It was a better model of the problem.
The leverage at scale is in the problem model: a sharper heuristic and idempotent integration beat raw compute.
- Heuristic search. I reframed the match as a guided search that prunes the combinatorial space aggressively while preserving financial accuracy, collapsing runs from centuries into minutes.
- AI anomaly clustering. On top of the deterministic matcher, I added unsupervised text clustering to surface anomalies across large ledgers, the cases that rule-based checks quietly miss.
- Resilient integration. Every inbound path (SAP, REST, internal APIs, batch and webhooks) was wrapped in validation, traceability, retries and idempotency, so a partial failure never double-posts or drops a record.
What shipped
- 10+ automated reconciliation flows, replacing manual, error-prone steps.
- 50+ critical defects resolved across a large, live codebase.
- A service generator/analyzer that accelerated the migration toward microservices and made new services cheaper to stand up.
Outcome
Matching runtime dropped from centuries to minutes, and stability, availability and financial accuracy all rose on a system moving real money at scale. A reconciliation that had been effectively intractable became a routine, trustworthy job.
What I’d carry forward
When the naïve approach is computationally impossible, the answer is rarely a bigger machine: it’s a better model of the problem, paired with integration that’s safe to retry. Get those two right and “impossible” quietly becomes “routine.”