- Monthly close
- 40 min
- Manual matches
- -94%
- Unexplained variance
- <0.01%
The challenge
The finance team reconciled four payment providers by exporting CSVs into a chain of spreadsheets. Month-end close took three working days. Every close produced unexplained variance that was written off rather than investigated, and only two people in the company understood the process.
The risk was not the three days. It was that nobody could explain a number to an auditor without calling one of those two people.
Our approach
We modelled a double-entry ledger in PostgreSQL as the single source of truth, then built one ingestion adapter per provider to normalise settlement files into a common event shape. Matching runs as a deterministic pipeline with an explicit exception queue: anything the system cannot match with confidence goes to a human, rather than being silently absorbed into a rounding difference.
Critically, we did not remove the spreadsheets on day one. We ran both processes in parallel for two close cycles and reconciled the reconciliations.
That is how we found two long-standing errors in the original process — one double-counting refunds from a single provider, one dropping a fee category entirely. Neither would have surfaced if we had cut over immediately, and both would have been blamed on the new system.
The outcome
Close now completes in under an hour, with variance below one basis point. The exception queue averages a dozen items a month, each with a documented reason and an owner.
Finance can answer an auditor's question without engineering involvement, which was the actual goal the whole time.