0→1 System Design · D2C Retention2026

Designing a Customer-First Post-Purchase Platform

Replacing five manual SOPs and agent memory with a deterministic retention engine.

View live product →
0→1 System Design · D2C Retention2026
29Policy Rules Codified · mattress, furniture & accessories
29Policy Rules Codifiedmattress, furniture & accessories
3Server Contractsstatus · actions · verdict, zero UI logic
9Systems UnifiedOMS, WMS, courier, tech, CRM, finance, POS
1Retention Laddercheapest fix first, every flow
CompanyD2C sleep & comfort brand
Duration2026, Phase 1 validated
RoleAssociate Product Manager
TeamShivam (Senior PM) · Engineering · Design · Ops · Finance

Everything after checkout at The Sleep Company — tracking, cancellations, returns, repairs, installation, refunds, warranty — ran across calls, email, Freshdesk, courier portals, and POS, guided by agent memory and five SOPs. As APM alongside Senior PM Shivam, I designed the end-to-end customer flow for a post-purchase app that replaces that fragmentation with one self-service product: a deterministic policy engine renders every decision, and cancel/return are never first-class buttons — they're outcomes reached only after a cheapest-fix-first retention ladder is exhausted.

01Context

Cancel and return were the path of least resistance

Post-purchase support at The Sleep Company was fragmented across calls, email, Freshdesk, third-party logistics portals, and POS, run on tribal agent knowledge and five separate SOPs. Agents applied policy from memory, so two customers with the identical issue could get different answers depending on who picked up.

That inconsistency had a direct revenue cost: with no faster alternative surfaced, 'cancel' and 'return' were the easiest path for both the customer and the agent, even when a cheaper lever (hold, edit, repair, part-replacement) would have kept the order and solved the actual problem.

  • ·Fragmented touchpoints — app, email, phone, courier portals, store — for a single customer need
  • ·No real-time status visibility, so 'where is my order' dominated inbound contacts
  • ·No case dashboard: duplicate tickets, repeat explanations, poor CSAT
  • ·Policy applied from memory: inconsistent outcomes, no audit trail, no way to prove fairness
02Data Discovery

Mapping every order state and every reason a customer contacts support

I worked through the order lifecycle end to end — 29 distinct order states, from Order Created through delivery, installation, and warranty — and mapped them down to 7 UI phases the customer actually needs to reason about (pre-dispatch, in transit, out for delivery, delivered 0–10 days, 11–100 days, post-100 warranty, terminal).

In parallel, I built a full VOC (voice-of-customer) disposition tree from real complaint, request, and query volume — delivery complaints, delivery queries, delivery requests, double-delivery, RTO-replacement, and more — tagging each leaf with its automation tier and the entry→exit states it moves through. That tree is what proved which issues could be fully self-served, which needed a single automated gate (like a technician verdict), and which had to stay human.

The policy itself turned out to depend on 11 inputs, not one: product category, stated reason, who's at fault (TSC vs. customer), days since delivery, installation state, technician verdict, approval state, order value, stateful counters (how many times this order has already been replaced or returned), sales channel, and customer segment. Any post-purchase decision engine that didn't model all 11 would just be another inconsistent agent, expressed in code instead of memory.

  • ·29 order states mapped to 7 customer-facing phases
  • ·Full VOC disposition tree built from real complaint/request/query volume, tagged by automation tier
  • ·11-dimension policy model: category, reason, who-erred, days-since-anchor, install-state, tech-verdict, approval-state, order-value, counters, channel, segment
03Strategic Thinking

The retention ladder, and a hard architectural rule

The organizing bet: every option list is ordered cheapest-fix-first — keep as-is → expedite/hold/reschedule → edit or swap the product → repair → part-replace → replace → return/refund, always last. Cancel and Return are never offered as a first action anywhere in the app; a flow that surfaces either before the ladder is treated as a defect, not a design choice.

The second bet, which is what makes the first one enforceable: the app ships no policy logic. Every decision comes from three pure server contracts — a status projection, an action-availability check, and a resolution verdict — and the UI only renders their output. No policy constant (a return window, a shipping charge, an approval cap) is allowed to be hardcoded into a screen. That's what turns a policy change from an engineering rebuild into a config edit, and what makes every decision traceable to a named rule instead of an agent's memory.

I also designed the Case object as the contract between this customer app and the internal agent app that comes later: every self-resolution, booked action, and human escalation writes one Case, with the full rule trace attached — so Phase 4 (the agent console) plugs into the same data with zero rework.

  • ·Retention ladder: keep → expedite/hold → edit/swap → repair → part-replace → replace → return (last resort)
  • ·Zero policy logic in the UI — three server contracts (status, actions, verdict) drive every screen
  • ·Every decision carries a rule trace and writes an auditable Case object
04Solution

An end-to-end flow that never asks the customer to repeat themselves

My focus was the customer-facing flow, screen by screen: Home and Order-360 lead with 'What can we help with?' in plain language, never a raw Cancel/Return tile. Ineligible actions render greyed out with their reason instead of disappearing silently, so the customer always understands why, not just that something isn't available.

Cancellation asks why before it shows an exit: 'taking too long' surfaces the real delivery date plus expedite/hold, 'found it cheaper' routes to price-match, 'changed my mind' offers an edit or swap. Only after that reason-specific retention step does a cancel path exist — instant refund pre-dispatch, an honest 'not guaranteed' recall attempt post-dispatch.

Returns and replacements run through evidence and technician gates matched to the actual product and situation — a non-mattress item damaged after installation needs a technician verdict before any remediation books; a mattress discomfort case walks posture-correction education → topper offer → replacement, only reaching return once that ladder is exhausted. Every escalation to a human — approvals, technician disputes, general support — carries the full case context forward, so the customer is never asked to re-explain what they already told the app.

  • ·Home → Order-360 → 'What can we help with?' — no raw Cancel/Return entry points anywhere
  • ·Reason-specific retention before every cancellation exit (expedite, price-match, edit/swap, hold)
  • ·Evidence and technician gates matched to product category and install state
  • ·Context-carrying handover to a human: nothing the customer already said gets asked twice
05Validation & Testing

Proving it on real orders, not slideware

Phase 1 was scoped and validated end to end on realistic demo orders: a non-technical person could open an order, try to cancel and get retained, report a damaged item and be guided to the correct replacement mode (and see why), report a delivery problem, book a technician, check a refund, and escalate to a human at any point with full context carried — with every policy number traceable to a named rule.

That acceptance bar mattered more than a feature checklist: it forced the retention ladder and the context-carrying handover to actually work across the full customer journey, not just in isolated flows.

  • ·Phase 1 (customer hero journeys — cancellation, remediation, delivery, service, finance, warranty, handover): validated
  • ·Every rendered decision traceable to a named policy rule
  • ·Full flow diagrams built for engineering handoff, swimlaned by who acts (customer, app, backend, courier, warehouse, technician, gateway, people)
06Outcomes

A platform, not a feature

29Policy Rules Codifiedmattress · furniture · accessories
11Policy Input Dimensionsmodeled, not guessed
0Policy Logic in the UIconfig change, never a rebuild
4Release Phases ScopedPhase 1 validated

This shipped as a system, not a screen: a policy engine that can absorb the next 100 edge cases as config rather than code, a Case object that already speaks the language the future agent console will need, and a customer flow where the fastest path to resolution is also the one that keeps the order — by design, not by luck.

Phases 2–4 (full case coverage, real OMS integration, the internal agent app) build on the same contracts without touching the customer-facing flow again — which is the point of designing the architecture before the screens.