Reconciliation dashboard
A dashboard for spotting and resolving mismatches between two ledgers, built so an operator can see the discrepancy and the evidence for it on one screen.
- Role
- Sole developer
- Period
- 2024
- Stack
- React
- Next.js
- Node.js
- PostgreSQL
This is a seeded example project, not client work. It is here so the structure of a case study is right from day one, and it is replaced before this site goes live.

Measured
Under 30 seconds
Reconciliation run
Measured on a day of production-scale transaction volume
Integer minor units
Money handling
No floating point anywhere in the calculation path
Idempotent
Repeat runs
Re-running a completed day produces no duplicate entries
Problem
Two systems recorded the same transactions and disagreed often enough that someone was reconciling them by hand in a spreadsheet each morning.
The manual process took hours, and because it produced no record of the reasoning, the same mismatch was investigated repeatedly.
Approach
The matching rules came first, written as pure functions with tests covering the awkward cases: partial matches, same-amount duplicates on one day, and entries arriving out of order.
The interface was built around the operator's actual question, which was not whether a mismatch existed but why, so each discrepancy shows both sides and the rule that failed.
- Matching logic as pure, tested functions before any interface
- Every amount handled as integer minor units
- Each resolution stores who decided it and on what basis
Architecture
A scheduled Node job pulls both ledgers, runs the matcher, and writes results to Postgres. The dashboard reads those results and never recomputes on request.
Runs are keyed by date and source so a repeat run replaces its own results rather than appending duplicates.
- Matching separated from both fetching and rendering
- Idempotency keyed on date and source
- Resolutions append to a history rather than overwriting
Outcome
The morning reconciliation went from hours of spreadsheet work to reviewing a short queue of genuine exceptions.
Because each resolution recorded its reasoning, recurring mismatches were traced to their source instead of being re-investigated.