Case study 03
Turning a multi-team initiative into a controlled production launch
Two teams, one customer-facing experience: clear boundaries, integrated validation, controlled activation — and an owner for it after launch.
Context
A new customer-facing experience was being built by two engineering teams — mine and a partner team — across several related workstreams, all converging on one launch.
Each team owned different pieces, but customers would experience them as one product. And what each customer saw depended on their own data, so many paths only existed for particular states.
Problem
A set of independently finished tickets doesn’t automatically add up to a coherent release. Launches like this fail at the seams: a component can be correct while the whole experience is wrong, one team can be ready while another still has open dependencies, and a deployment can succeed while the feature still shouldn’t be exposed.
And once the launch call ends, someone has to own monitoring and respond when the real world behaves differently from the test environments.
Constraints
- Two teams delivering into the same experience against a fixed launch date.
- Nothing could change for existing customers until the moment of launch.
- Many paths were only reachable with realistic customer states.
- Mobile had to be a first-class target, not a follow-up.
My role
I led my team’s part of the build and coordinated its path to production: the flag-based release approach, validation and triage, work with the partner team, the go-live, and the monitoring we handed over afterwards.
Decisions
01Separate deploy from release
Everything shipped to production dark, behind feature flags, well ahead of launch day. That turned the launch into a configuration change instead of a deployment, and rollback into a flag flip instead of a revert under pressure.
TradeoffFlags add conditional paths that must be tested in both states and removed afterwards. That cleanup is real work, and it belongs in the plan.
02Validate the integrated experience
Testing followed what customers would actually see: conditional flows, responsive layouts, embedded content, data presentation, and the interactions between features owned by different teams — in a production-like environment, across realistic states rather than one demo account.
TradeoffRealistic states take effort to prepare. Skipping them just moves the discovery to launch day.
03Fix issues while the context is fresh
Internal UAT ran as a structured pass with owners and severities. When it surfaced problems, we worked through them together instead of turning each finding into another handoff — I fixed conditional-logic issues myself.
04Make release ownership explicit
The go-live had a coordinated activation sequence across both teams’ work, known dependencies, clear owners for the decisions during the release, verification in production immediately afterwards, and a rollback path agreed in advance.
05Treat monitoring as part of delivery
We built the synthetic monitoring and alerting as part of the work, then handed ownership to the operations center, with alerts routed to its engineers — so the experience’s health no longer depended on the team that built it.
Execution
Build behind flags
Both teams merged and deployed continuously, with new surfaces hidden until activation.
Validate in staging
End-to-end checks across customer states in a production-like environment.
Run UAT
Structured internal testing, triaged by severity and owner, with fixes verified before sign-off.
Activate
A coordinated flag change across both teams’ work, followed by verification in production.
Hand off
Synthetic monitoring and alert ownership moved to the operations center.
Outcome
Several independently developed pieces became one coordinated production experience, with controlled activation and defined operational ownership.
The launch also separated three things teams often treat as one event: deploying code, releasing functionality, and operating the system. That distinction has become a recurring part of how I approach production delivery.
Lessons
- Deploy and release are different events. Separating them is the cheapest risk reduction there is.
- Validation finds the seams. Give it time, owners, and a definition of done.
- A feature is finished when the organization can release it safely and operate it afterwards.