Case study, Fintech
A real-time ledger for Nordbank.
Nordbank ran on an overnight batch that posted the previous day's transactions each morning. We replaced it with a double-entry core that settles the moment money moves, at 12k transactions per second and a p99 of 40 ms, without a single batch window.
The engagement
From nightly batch to instant settlement.
Nordbank is a digital bank. Its ledger was correct but slow: balances were only trustworthy after the overnight run finished, so support, risk, and the mobile app all worked from stale numbers for most of the banking day. We rebuilt the ledger as an event-sourced, double-entry service that posts and settles each transaction inline, holds its latency budget under peak load, and produces an audit trail the bank can reconcile at any point in time.
Engagement at a glance
The approach
Four decisions that made settlement safe at speed.
We did not chase novelty. The design leans on well understood patterns, applied carefully and instrumented so the bank can prove each guarantee holds in production.
A double-entry core
Every movement is two balanced postings against accounts. The invariant that debits equal credits is enforced inside the write path, not checked after the fact, so an unbalanced transaction can never be committed in the first place.
Event sourcing with an outbox
The ledger's state is derived from an append-only log of posting events. State changes and their outbound events are written in the same PostgreSQL transaction through an outbox table, so what the rest of the bank sees can never drift from what was actually committed.
Idempotent processing
Every command carries a client-supplied idempotency key. A retry, a redelivery, or a duplicate from an upstream service resolves to the exact same posting, so at-least-once transport becomes safe to build on without ever double-charging an account.
Exactly-once settlement
The outbox relay and a Kafka consumer with committed offsets give effectively-once delivery downstream. Combined with idempotent writes, each transaction settles exactly one time even across broker restarts, consumer rebalances, and partial failures.
Results
The batch is gone, and the numbers held.
The ledger has run the settlement path in production for the full engagement and beyond. Figures below are steady-state production measurements.
Live balances
Support, risk, and the mobile app now read balances that are correct to the second, not to the previous business day.
Reconciles to the cent
The event log lets the bank reconstruct any account's state at any timestamp, which cut month-end reconciliation from hours to minutes.
Room to grow
Throughput headroom above current peak means the next tier of volume needs more partitions, not another architecture.
ECORTIQ took a ledger we were afraid to touch and turned it into the most reliable service we run. They understood the failure modes better than we did, and they proved every guarantee instead of asserting it.
Related practices
The work behind this build.
This engagement drew on two of our practices. Read how we approach each.
Platform & distributed systems
The double-entry core, idempotent write path, and exactly-once settlement that keep the ledger correct under load.
Explore practice 02 / DataData & streaming
The event log, outbox relay, and Kafka projections that carry every settled posting to the rest of the bank in real time.
Explore practiceStart
Have a ledger you are afraid to touch?
Tell us where the correctness or the latency hurts. We will tell you honestly whether we are the right team to rebuild it.