Design document · not product UIv2 · fixes from 2 adversarial reviews applied

User flows & site states

Every journey through the Protein Matters store with the states each screen must handle. Grounded in design-corpus.md and corrected after two adversarial reviews (UX-standards pass + operator/unit-economics pass): subscription flow gained an address & drop-window step, the weekly cycle is now explicit, rollover and expiry contradictions are resolved, serviceability and OTP auth added.

Flow 0 — Serviceability (before anything else matters)

the kitchen serves a radius; check early, never at step 5 of 7
Header location chip"Deliver to 700··· " visible on every page; opens a pincode checkall screens
ServiceablePincode saved; menu, slots and checkout proceed normallymenu.html
Not served yetPlain state: "We don't deliver to 4110·· yet" + notify-me email; browsing stays open, checkout blocked at addressmenu.html · checkout.html

Flow 1 — À la carte pre-order

home → menu → item → cart → checkout (address → slot → pay) → confirmed → track
LandFirst visit: 3-step welcome, once per device, log-in shortcut for returning users on a new devicehome.html
Browse menuCategory chips, search, protein + kcal on every card; sold-out items greyed with "back [day]"menu.html
Item detailGallery, 4-number macro strip, ingredients/allergens, stack/fresh tag, qty + Addproduct.html
CartInstant line totals, fee + free-threshold progress, earliest-delivery hint. No slot picking herecart.html
1 · AddressPincode-first (re-validates serviceability), mobile with rider-call helper, landmark optionalcheckout.html
2 · SlotDay tabs (Tomorrow/+2/+3) × 2-hr windows; earliest pre-selected; past-cutoff greyed and labelled; countdown linecheckout.html
3 · PayUPI first → card → COD (fee noted). Guest gate here: Google → Apple → phone OTP / email. Cart, address and slot survive login (local wins on merge)checkout.html
ConfirmedOrder no., slot recap, address, items, payment; Track CTA; edit/cancel free until 24h before the slotcheckout.html
Empty cart · icon + one CTA + suggestions Fee threshold · "Add ₹120 for free delivery" progress Day full · next day pre-selected + one-line explanation Past cutoff · greyed, labelled, never hidden Sold out at checkout · re-validate items at pay, offer swap/remove Slot expired at pay · re-validate, pre-select next, message UPI pending · order held, slot reserved 10 min, status polls, "don't retry yet" Payment failed · inline retry, order + slot kept

Flow 2 — Weekly subscription (credits)

plans → tier → build → drops → address & windows → review → active. Weeks run Mon–Sun; rebuild/pause close Thu 6 PM for the following week
Plans3 tiers, Bloom highlighted; per-day math "₹240/day, worth ₹300"; cycle line beside CTA: "Weeks run Mon–Sun · change closes Thu 6 PM"subscribe.html
Pick tierSprout ₹1,680 · Bloom ₹2,800 · Harvest ₹4,480 /week; peg stated once: ₹1 = 10 creditssubscribe.html
Build your dayDepleting meter "2,140 of 3,000 cr left · worth ₹214"; fresh items tagged; unspent allowance becomes wallet credits for add-onssubscribe.html
Drops1–3 capped by tier; fresh items pin to their own drop (1-drop disabled if plan has fresh items); fewer drops than cap earns bonus wallet creditssubscribe.html
Address & windowsDelivery address + a 2-hr window per drop — reuses checkout componentssubscribe.html
Review + payWeekly math, savings line, computed start date ("Your week starts Mon 20 Jul"); prepaid only — no COD; guest gate heresubscribe.html
Active weekDated start; manage from Account before Thu 6 PM lockaccount.html
Over budget · meter coral; wallet credits drawn first, then "move up a tier" Under budget · "unspent × 7 becomes wallet credits" stated at review Rebuild window closed · locked week continues; next window dated Paused week · takes effect from next week; resume CTA Cancel · pause + rebuild offered first; effective next week; locked week delivers, no mid-week refunds

Flow 3 — Returning user & post-purchase

recognised on device · account · order tracking · add-ons
RecognisedLogin cookie → signed in; no welcome modal; header shows Accounthome.html
AccountSidebar: Overview / Orders / Subscription / Addresses / Settings; wallet balance with ₹ worth; ledger lines like "+50 · consolidation bonus" — credits never expireaccount.html
Order detailTracker: Placed → Cooking → Out for delivery → Delivered; Cancel free until 24h before slot; Reorder → prefilled cartaccount.html
Add-on to a dropÀ-la-carte items attached to an upcoming drop (order ≥24h before it): delivery fee waived; pay ₹ or wallet creditsmenu.html → cart.html
New device · login: Google → Apple → phone OTP / email; welcome modal links here Signed out · header shows Sign in; local cart persists Delivery failed · rider unreachable → reschedule to next legal slot Drop past cutoff · add-on falls back to its own slot + normal fee

Auth rules

  • Guests browse, cart, address and slot freely — the gate exists only at payment
  • Gate order: Google → Apple → phone OTP / email; copy is "Continue with…"
  • On gate login: carts union-merge (local quantities win); in-progress address + slot kept; user returns to the pay step
  • Welcome modal fires once per device; confirmation repeats a one-field account nudge

Slot & cycle rules

  • A window is orderable only ≥ 24 h before it starts; enforced live, re-validated at pay
  • Day tabs: Tomorrow / +2 / +3; earliest available pre-selected
  • Two densities under decision: A = 3 windows/day, B = 6; same rules both
  • Subscription weeks run Mon–Sun; rebuild / pause / cancel close Thu 6 PM for the following week; start date always computed and shown before payment

Money rules

  • ₹ in Indian grouping; strikethrough for value-vs-price; per-day unit math on plans
  • Peg stated wherever credits appear: ₹1 = 10 credits; every credit figure shows ₹ worth
  • Credits never expire — no expiry UI anywhere; unspent daily allowance × 7 converts to wallet credits (spendable on add-ons)
  • Delivery fee visible from cart onward; subscriptions are prepaid only (UPI/card); COD is à-la-carte only, fee disclosed