A ledger that never loses a kobo
- Client
- Halden Pay
- Industry
- Fintech
- Location
- Lagos, Nigeria
- Year
- 2025
- Engagement
- Dedicated team
- Duration
- 7 months
- Team
- 5 engineers, 1 product lead
- Disciplines
- Backend
Overview
Halden had outgrown the spreadsheet-and-cron-job ledger that powered its first year. We designed and built a double-entry ledger, reconciliation engine and settlement service that now moves money for over three thousand merchants.
- Transactions a day
- 4.2M
- p99 posting latency
- 38ms
- Unreconciled entries since launch
- 0
Growth had turned reconciliation into a full-time job.
Halden's original system wrote balances directly to merchant rows. Every failed webhook or retried transfer meant a finance analyst hunting through logs. By the time they reached 1,000 merchants, three people spent their week reconciling, and month-end close took nine days.
The brief was clear: a source of truth for money that the finance team could trust without checking, and that engineering could extend without fear.
Architecture
System overview
Every movement of money is an immutable, balanced journal entry. Balances are derived, never stored as mutable state, which makes the ledger auditable by construction.
01 · Ingress
API Gateway
Idempotency keys, rate limits
Webhook Intake
Signed, deduplicated
02 · Core services
Ledger
Double-entry, append-only
Reconciliation
Matches bank statements hourly
Settlement
T+0 / T+1 payout batching
03 · Data
PostgreSQL
Serializable isolation
Event stream
Kafka, 30-day replay
04 · External
Bank rails
NIP, card schemes
Finance tools
Daily exports to ERP
Boring technology, unusually strict rules.
We chose PostgreSQL with serializable transactions over a specialised database. The team already knew it well and its guarantees were exactly what a ledger needs. Every write path is idempotent. Every entry must balance or the transaction aborts.
We migrated live, running the new ledger in shadow mode for six weeks and comparing every balance against production nightly before the cut-over. Merchants never noticed.
- Days to close the month
- 9 → 1
- Transactions posted daily
- 4.2M
- Ledger availability
- 99.995%
- Analysts on manual recon
- 3 → 0
Stack
Languages
- Go
- TypeScript
Data
- PostgreSQL 16
- Kafka
- Redis
Infrastructure
- AWS
- Terraform
- Kubernetes
Observability
- OpenTelemetry
- Grafana
- PagerDuty
“They asked better questions about our business in the first week than our previous vendor did in two years. The platform they shipped is the reason we closed our Series A.”
Ama Health
Scheduling and patient records across a clinic network