000 / 100
Start a project Call (+91) 97417-39223
Case studies

The long version, including what went wrong.

Published with client permission and reviewed by them before going up. Each one includes the false starts, because a case study without them is marketing rather than evidence. Figures are the client's, not ours.

Banking18 monthsJava · Kafka · AWS

Northbank: replacing a settlement core while it was still running

Reconciliation ran as a nightly batch. Disputes took four days to clear, the batch had started overrunning into business hours, and the three people who understood it were within six years of retirement.

4 days → 6 hrsSettlement time
₹31 crAnnual saving
0Lost transactions
99.99%Uptime since

The situation

Northbank processes settlement for a mid-sized card and payments book. The core was COBOL batch on a mainframe, written in stages between 1994 and 2006, with roughly fourteen years of live history. It worked. That's the thing people forget about legacy systems — it had been correct every night for two decades.

The problem was the edges. Dispute resolution required manual reconciliation across three systems and took four working days. Volume growth had pushed the batch window from four hours to nearly nine, which meant a bad night bled into the trading day. And the institutional knowledge sat with three engineers, one of whom had already announced his retirement date.

The two false starts

We wrote both of these proposals, and we were wrong twice before we were right.

Attempt one was a lift-and-shift of the batch logic into Java, preserving the batch model. It was cheap and quick and would have bought about three years. We built a prototype and killed it ourselves at week seven, because the dispute-resolution problem — the actual business pain — was structural to batch processing. We'd have delivered a faster version of the wrong thing.

Attempt two was a full event-sourced rebuild with a big-bang cutover over a long weekend. Northbank's risk committee rejected it, correctly. We had assumed a level of confidence in the migration that we could not evidence, and the rollback plan was, on honest inspection, a hope.

Attempt three worked: event-sourced ledger, built alongside the mainframe, dual-run against live volume for eleven weeks with automated comparison of every single position. Cut over account segment by account segment. It cost more than either of the first two proposals and took four months longer.

What we built

An append-only event ledger in Java on Kafka, with projections for balance, position and dispute state. Every business event is immutable and replayable, so a dispute becomes a query over history rather than a reconstruction exercise across three systems. Fourteen years of mainframe history was migrated in and replayed to verify the projections reproduced known-correct closing positions for every month-end in that period.

The comparison harness was the real deliverable. For eleven weeks, every transaction went through both systems and a reconciler flagged any divergence within sixty seconds. We found nineteen genuine discrepancies. Eighteen were our bugs. One was a mainframe rounding behaviour on a rare currency pair that had been quietly wrong since 2011, which Northbank's finance team described as the most expensive free gift they'd ever received.

What went wrong

The dual-run cost roughly eleven weeks of double infrastructure and two full-time engineers watching a reconciliation dashboard. Northbank's programme office pushed to shorten it to four weeks at the halfway point, and we pushed back hard. Three of the nineteen discrepancies surfaced after week eight — in month-end processing, which only happens, by definition, monthly.

We also underestimated training. We budgeted two weeks for operations handover and needed five, because the operations team had spent twenty years developing intuitions about the batch that simply didn't transfer. That was our miss, and we absorbed the cost.

Where it stands

Live since March 2022. Settlement completes in under six hours, disputes clear same-day, and the system has had no unplanned outage over eleven minutes. Northbank's own team has run it since month four after launch; four of their eight platform engineers were hired through our recruitment practice and trained on the codebase before go-live.

Healthcare11 monthsFHIR · Postgres · React

Verdana Health: one patient record across 38 clinics

Thirty-eight clinics, nine record systems inherited through acquisition, and a merger deadline. The technical integration was the easy half.

38 → 1Record systems
−4.5 minPer intake
94%Clinician adoption
11 moTo full rollout

The situation

Verdana had grown by acquiring independent practices and had never consolidated their systems. A patient seen at two clinics existed twice, with no link between the records. Referrals moved by fax and PDF. Clinicians had adapted, as clinicians do, by keeping their own parallel notes.

The board wanted a unified record. The clinicians, entirely reasonably, expected a new system to cost them time — because in their experience every new system had.

The thing we got right by accident

Our original plan sequenced the work by technical dependency: identity resolution first, then the data layer, then interfaces. Sensible engineering order. We'd have shown clinicians nothing usable for five months.

A senior nurse at the pilot site told us, in week three, that she'd seen four systems arrive and three leave, and she'd judge this one on whether intake got faster. So we reordered everything around that. We rebuilt the intake screen first — the single highest-frequency interaction — and shipped it against the old data layer with a shim, purely so it could be used and measured while the real work continued underneath.

Intake dropped by four and a half minutes per patient in the first month. After that we never had to argue for cooperation again. Clinicians started requesting the rollout at their sites rather than resisting it.

What we built

A FHIR-based record with probabilistic identity resolution across the nine source systems, plus consent and access control modelled directly in the data layer rather than enforced at the application edge. Any query, from any surface, is filtered by the consent state of that patient — which means a future integration cannot accidentally bypass it.

Identity matching flagged 41,000 probable duplicates. We deliberately did not auto-merge any of them. Every merge was reviewed by clinical staff through a purpose-built queue, because a wrongly merged patient record is a clinical safety incident, not a data quality issue. It took nine months of background work and was, without question, the correct decision.

What went wrong

We badly underestimated the merge review queue. Original estimate: six weeks with two reviewers. Actual: nine months with a rotating clinical panel. We had modelled it as a data task and it was a clinical judgement task. That was an estimation failure on our part and it pushed full rollout out by roughly three months.

We also shipped a consent interface that was technically complete and practically unusable — nested toggles that required understanding the data model to operate. A clinician described it as "an accurate diagram of your database." She was right. We rebuilt it around four plain-language scenarios instead.

Where it stands

Live across all 38 clinics since 2024. Verdana runs it with an internal team of six, four of whom we recruited and trained during the build. The consent model has since passed two external audits without a finding.

Logistics9 monthsPython · Go · GCP

Kestrel Logistics: the optimal route nobody would drive

Kestrel had already bought a routing optimiser. It worked. Drivers ignored it, and the previous vendor's answer was a compliance policy.

22%Empty-run cut
91%Route acceptance
2,400Vehicles
7 moTo payback

The situation

The incumbent system produced routes that were, on paper, 6% shorter than what drivers actually drove. Adoption sat around 30%. Management's read was a driver discipline problem. We asked to ride along for a week before proposing anything, which Kestrel found an odd use of billable time.

What the ride-alongs found

The optimiser was solving for distance. Drivers were solving for a longer list: where you can legally and safely stop, which loading bays have a queue after 2pm, which client sites require a signature from someone who takes lunch at a fixed time, and where you can use a toilet on a nine-hour shift.

None of that was in the model, so the model's routes were shorter and worse. The drivers weren't being difficult; they were correcting for missing constraints, and the compliance policy was punishing them for knowing more than the software.

What we built

A routing engine that optimises against distance and a learned acceptance model, trained on two years of historical driver deviations. When a suggested route diverges from what a driver would historically have chosen, the system either surfaces its reasoning or accepts the human route — and logs the divergence as a signal rather than a violation.

We also added a plain feedback control: a driver can reject a leg with one tap and a two-word reason. Those rejections feed back weekly. It turned the system from an instruction into a negotiation, and the acceptance rate went from 30% to 91%.

What went wrong

We shipped the feedback loop with a fourteen-day retraining cadence. Drivers noticed nothing changing and, briefly, disengaged — they had reasonably assumed feedback meant something visible. We moved to weekly retraining and added a simple "your feedback changed this route" notice. Small thing, disproportionate effect on trust, and we should have anticipated it.

There's also a limitation worth being honest about: the acceptance model encodes existing driver behaviour, including habits that are merely habitual. We've kept a deliberate exploration budget — around 4% of legs test alternatives — but this is a genuine trade-off, not a solved problem.

Where it stands

Live since 2023 across 2,400 vehicles. Empty-run kilometres are down 22%, which paid the project back in seven months. Kestrel's own data team owns the retraining pipeline; we review the exploration results with them quarterly.

Ask these clients about us directly.

All three have agreed to take reference calls. We'll introduce you without sitting in on the conversation, which is the only way a reference is worth anything.