Case study, names changed for confidentiality. Synthesised from a real engagement with a Bengaluru-based RBI-regulated neo-bank.
The brief
A founder team had six months to put a regulated lending product into the hands of customers. Greenfield. Forty engineers, most of them sharp but new to one another. Zero production code. RBI compliance breathing down the calendar.
The internal pitch was "build it like a payments giant from day one." The honest answer was "we cannot — and we shouldn't try."
The cut that made it ship
The first architectural decision was the load-bearing one: split the domain into bounded contexts the day the team formed, before anyone wrote code. Lending, KYC, ledger, decisioning, customer profile, notifications, ops console. Each context owned its data store and its deploy lane. Cross-context calls were async events through a bus, never synchronous RPC, except where regulation explicitly required a blocking confirmation.
That single rule — async by default, sync only by regulation — is what kept 170 services from collapsing into a distributed monolith.
What broke first
The fix was a six-hour rewrite to a state-machine over the bus: the orchestrator persisted intent, fired off side-effects asynchronously, and let the customer-facing app poll a status endpoint instead of holding the connection. We shipped it the same day, post-mortemed it the next, and made "no synchronous call to a third party in a customer-blocking path" a written rule.
The org-shape lesson
Forty engineers cannot all be senior. The team was one-third senior, two-thirds mid-and-junior. The architecture had to make the junior engineers productive — meaning every service was scaffolded from a single reference template (logging, tracing, deploy pipeline, error envelope, dependency injection) so a new engineer could start their second microservice in a day.
That investment cost two senior engineers a fortnight in week one. It returned two thousand engineer-hours over the next six months.
What the artefact looked like
- A bounded-context map and event-storming wall, photographed and re-drawn weekly.
- A reference service template, opinionated and small.
- A "contract registry" — every cross-context event schema, versioned, in one repo with codegen.
- A weekly architecture council, 90 minutes, where the four contexts most under load that week defended their boundaries.
None of these were exotic. The discipline was in keeping them alive through six months of pressure.
The number that mattered
It went live on schedule with the first product wave. The system has since carried multiple expansions — KYC tiers, additional product lines, a second-stage compliance audit — without an architectural rewrite. That, more than the launch itself, is the win.
What I'd reuse
- Bounded contexts before code. Always.
- Async-by-default. Synchronous calls only where regulation demands.
- A reference service template. The single highest-leverage investment for any team larger than fifteen engineers.
- Weekly architecture council. Not a status meeting — a defense session where the contexts under load argue for their seams.