← All work
Case 01Payments ledger, rebuilt

Ledgerworks

An event-sourced double-entry ledger replacing a spreadsheet that had opinions. Month-end close went from six days of heroics to four hours of nothing happening.

ClientSeries-B payments platform
Year2025
RolePrincipal architect + build
Engagement9 months

01 — The problem

Balances were computed in three places and agreed in none. Month-end close took six people the better part of a week, reconciliation was a shared spreadsheet with tribal formatting rules, and the finance team had learned to distrust the product. Nobody could answer "what did this account look like on the 14th?" without a database restore.


02 — What I did

Modelled the domain as an append-only event log with derived read models, so every balance became a replayable statement of fact rather than a number someone updated.

Built the ledger core in Go against Postgres, with projections streamed through Kafka to reporting and reconciliation consumers.

Wrote the migration as a six-week dual-write with automated shadow reconciliation, so the cutover was a config change rather than a weekend.

Left a runbook, a load-test harness, and two engineers who could explain the whole thing on a whiteboard.

Fig. 1 — the system as designed
Fig. 2 — the system in production

The first month-end after cutover, nobody stayed late. Finance assumed something had broken.
Head of finance engineering, Series-B payments platform

03 — Outcome

4 hrs

Month-end close, down from six days

100%

Reconciliation automated — no spreadsheet in the loop

0

Balance discrepancies since cutover


04 — What I left behind

A replay harness that rebuilds every balance from the event log in eleven minutes.

A written ledger invariant document their auditors now read instead of interviewing engineers.

Two engineers who can whiteboard the whole design without me in the room.

Stack
GoPostgresKafkaTerraformAWSOpenTelemetry

MeridianAll work
Next case — 02 / 2024

Tideline

Telemetry ingest for 12,000 vessels, built to survive the satellites it depends on.

Read the case →

Got a system that needsdesigning properly this time?

Contracts from six weeks. I read every enquiry myself and reply within two working days, usually with an awkward question about your data model.

Start an enquiryjoey@startupapps.shopGitHubMedium