Three checkouts, three codebases, zero shared logic.

Three checkout experiences had been built over years by separate squads, each with its own fields, validation rules, and fraud logic. Desktop, responsive, and app behaved as strangers to a single buyer.

New anti-fraud requirements were landing on three codebases at once.

Every fix doubled in cost, every change in copy risked contradicting the next surface. The order summary on iOS was obscured by the keyboard. There was no capacity for new compliance fields without a full redesign on each surface.

Auditing divergence, designing convergence

1. Audited the 23 divergence points across the three flows and split them into must-unify, will-unify, and keep-separate categories.

2. Designed a single field architecture with shared validation states and anti-fraud fields.

3. Introduced AI-assisted copy and flow validation as a weekly ritual.

4. Led the phased rollout: desktop first, then responsive web, then native app.

Divergence audit spreadsheet and categorization

From audit spreadsheet to shared architecture

Divergence audit: 17 of 23 field-level points diverged
Unified checkout with shared validation states

Three surfaces become one coherent system

One component library, three layout contexts. Shared validation on blur across all surfaces, same error copy, market-specific fields that adapt but never contradict. The iOS order summary stayed visible above the keyboard. Anti-fraud fields shipped once and propagated to all platforms.

Unified checkout: desktop, responsive, and app side by side

One system, zero contradictions

Three surfaces collapsed into one design system. Fraud compliance rolled out once instead of three times. New anti-fraud fields now ship once and scale across all platforms. The weekly AI validation ritual caught 12 inconsistencies in the first 8 weeks.

Unification is a negotiation over ownership

The designs landed only because we named the exact 23 points up front. Without that audit, stakeholders would have debated "should iOS look native" forever. Naming the specific tradeoffs unblocks decisions.

What I chose not to change

1. I didn't redesign the payment flow. Payment integration was a separate system with its own constraints.

2. I didn't enforce a single validation timing. Some markets required on-submit validation for legal reasons.

3. I didn't deprecate the app checkout immediately. The native app team needed a migration path, not a deadline.