01 · Context
A UK payments business was closing its books manually each day. Finance pulled two exports from the processor, dropped them into a shared workbook, and reconciled them against an internal ledger. The workbook had grown beyond what Excel could hold without crashing, and a single missed row could mean chasing a figure for half a day.
02 · Constraints
Everything the solution had to respect from day one.
- 01
FCA-adjacent audit trail. Every adjustment had to be attributable and timestamped.
- 02
No downtime during the month-end close; the replacement had to cut over mid-cycle.
- 03
The finance team could not switch to a different workflow overnight; parity first, then improvement.
03 · Approach
What we actually built and why, in the order it happened.
- 01
Modelled the processor export and the internal ledger as first-class typed entities, with a single normalised view for reconciliation.
- 02
Built a diff view in React that matched the structure finance already knew, then layered fast search, filters and bulk approval on top.
- 03
Wrote every mutation through an append-only audit table. Rollbacks are cheap; history is never edited.
- 04
Cut over behind a feature flag, ran both systems in parallel for a full month, and only deprecated the spreadsheet when the numbers matched to the penny for thirty consecutive close cycles.
04 · Result
End-of-day reconciliation dropped from four hours to twenty minutes. Month-end exceptions fell by 86% in the first quarter after cut-over. The audit trail has since been cited in two external reviews without remediation.
- End-of-day reconciliation
- 4h → 20min
- Month-end exceptions
- −86%
- Go-live from brief
- 11 weeks