Bag & checkout
Mobile app: every screen, state and flow in Bag & checkout.
9 screens and overlays, 76 states, 3 flows. Frames show a real screenshot where one was captured and a wireframe card where the state needs data or conditions a device run cannot produce.
Flows
Bag to Shopify checkout
Shopify checkout
Completed with order id
De-duplicated, session client_completed, bag replaces to confirmation
Needs data: Capture audit 2026-10-30. ios: Real checkout/payment required; do not bypass route allowlist. android: Real checkout/payment required; do not bypass route allowlist.
Order Confirmed!
Order Confirmed!
Order document exists, even if payment status is pending
Needs data: Capture audit 2026-10-30. ios: Real checkout/payment required; do not bypass route allowlist. android: Real checkout/payment required; do not bypass route allowlist.
Branches and edge cases
My Bag
Syncing bag
Pending writes disable the sticky button reading Syncing bag…
Not reachable on a device: Needs a network fault, crash, race or code change to show
Items Unavailable
Item count subtitle
1 item or N items no longer available for checkout
Needs data: Capture audit 2026-10-30. ios: Requires Shopify to reject a line Convex still reports in stock. Current sold-out lines disable Checkout before this modal; cannot stage through current dev cart without a store-side mismatch. android: Requires Shopify to reject a line Convex still reports in stock. Current sold-out lines disable Checkout before this modal; cannot stage through current dev cart without a store-side mismatch.
My Bag
Checkout Error toast
Prepare failed; raw message, or Too many requests when rate limited
Not reachable on a device: Needs a network fault, crash, race or code change to show
Shopify checkout
Completed without order details
No navigation; bag stays locked: Your order is being confirmed
Not reachable on a device: Needs a webhook-timing race after payment
Flow diagram
Address selection
Branches and edge cases
Deliver to
Loading addresses
Address list loading
Not reachable on a device: Needs a network fault, crash, race or code change to show
New Address / Edit Address
Saving…
Save Address button shows Saving…
Not reachable on a device: Needs a network fault, crash, race or code change to show
New Address / Edit Address
Unable to save address
Server message or Please try again; sheet stays open
Not reachable on a device: Needs a network fault, crash, race or code change to show
Flow diagram
Voucher and promo
Vouchers & Promo
Promo code applied
Valid promo; discount in total, row with remove control
Needs data: Capture audit 2026-10-30. ios: Needs valid live Shopify promo; no store writes or customer code use. android: Needs valid live Shopify promo; no store writes or customer code use.
Branches and edge cases
Vouchers & Promo
No vouchers yet
Earn them through stamps and rewards
Needs data: Capture audit 2026-10-30. ios: All four fixed-OTP test accounts have vouchers. An isolated zero-voucher signed-in fixture is needed; existing rewards were not removed. android: All four fixed-OTP test accounts have vouchers. An isolated zero-voucher signed-in fixture is needed; existing rewards were not removed.
Vouchers & Promo
Loading vouchers
Voucher list loading
Not reachable on a device: Needs a network fault, crash, race or code change to show
Vouchers & Promo
Invalid promo code
Code failed validation
Needs data: Capture audit 2026-10-30. ios: Toast renders behind native sheet, already reproduced. android: Two attempts: invalid promo request finishes but no visible error toast appears over native voucher sheet. Rejected screenshot quarantined.
Vouchers & Promo
Validate failed or throttled
Failed to validate, Sign in to apply, or Too many tries; code stays applied
Not reachable on a device: Needs a network fault, crash, race or code change to show
Vouchers & Promo
Voucher or promo removed
Voucher unavailable or Minimum purchase of RMx not met after bag change
Needs data: Capture audit 2026-10-30. ios: Prior repeated runs failed to show intended toast; report bug instead of more capture retries. android: Prior repeated runs failed to show intended toast; report bug instead of more capture retries.
Flow diagram
Screens and states
My Bag
(app)/(tabs)/my-bagMy Bag
Shopping bag with line editing, vouchers, address, estimate and checkout launcher
src/app/(app)/(tabs)/my-bag/index.tsxEntry
- Tab bar
- PDP bag icon or View Bag
- Checkout sign-in sheet return
- Deep link
Exits
- Checkout → Shopify checkout sheet
- Checkout completed → order confirmation
- Guest Checkout → sign-in sheet
- Start shopping → All Products list
- Voucher pill → VoucherSheet
- Address line → AddressPickerModal
States · 22
src/app/(app)/(tabs)/my-bag/index.tsx:902src/features/cart/hooks/use-cart-page.ts:38src/features/cart/components/empty-cart-state.tsx:37src/app/(app)/(tabs)/my-bag/index.tsx:714src/features/cart/components/summary/sticky-checkout-bar.tsx:55src/features/cart/hooks/use-cart-auth-sync.ts:100src/features/cart/hooks/use-cart-auth-sync.ts:189src/features/cart/components/minimal-cart-item.tsx:239src/features/cart/hooks/use-server-cart.ts:88src/features/cart/components/minimal-cart-item.tsx:344src/app/(app)/(tabs)/my-bag/index.tsx:406src/features/cart/hooks/use-server-cart.ts:47src/features/cart/components/minimal-cart-item.tsx:306src/app/(app)/(tabs)/my-bag/index.tsx:134src/features/cart/constants.ts:15src/features/loyalty/components/stamps/bag-stamp-note.tsx:24src/app/(app)/(tabs)/my-bag/index.tsx:266src/app/(app)/(tabs)/my-bag/index.tsx:483src/app/(app)/(tabs)/my-bag/index.tsx:302src/app/(app)/(tabs)/my-bag/index.tsx:302src/app/(app)/(tabs)/my-bag/index.tsx:509src/features/checkout/hooks/checkout-preparation.ts:466Vouchers & Promo
Vouchers & Promo
Needs data: Needs the QA account to hold a usable voucher
VoucherSheetVouchers & Promo
Choose one voucher or enter one promo code for the order
src/features/cart/components/vouchers/voucher-sheet.tsxEntry
- Floating voucher pill on bag, signed in only
Exits
- Tap coupon → applies or swaps
- Apply promo → validates code
- Swipe → close
States · 13
src/features/cart/components/vouchers/voucher-sheet.tsx:236src/features/cart/components/vouchers/voucher-sheet.tsx:244src/features/cart/components/vouchers/voucher-sheet.tsx:292src/features/cart/components/vouchers/voucher-sheet.tsx:84src/features/cart/hooks/use-cart-discount.ts:209src/features/cart/hooks/use-cart-discount.ts:272src/features/cart/hooks/use-cart-discount.ts:272src/features/cart/hooks/use-cart-discount.ts:405src/features/cart/hooks/use-cart-discount.ts:405src/features/cart/components/vouchers/floating-voucher-button.tsx:46src/features/cart/components/vouchers/voucher-sheet.tsxsrc/features/cart/components/vouchers/voucher-sheet.tsxsrc/features/loyalty/hooks/use-applicable-vouchers.ts:42Checkout details
CheckoutDetailsSheetCheckout details
Estimate breakdown with free shipping progress, stamp note and Checkout button
src/features/cart/components/summary/checkout-details-sheet.tsxEntry
- Tap total in sticky bar
Exits
- Checkout → closes, starts checkout
- Swipe → close
States · 2
src/features/cart/components/summary/checkout-details-sheet.tsx:132src/app/(app)/(tabs)/my-bag/index.tsx:174Choose variant
Choose variant
Not captured yet
VariantSwitcherSheetChoose variant
Change the variant of a bag line
src/features/cart/components/shared/variant-switcher-sheet.tsxEntry
- Variant pill on a bag line
Exits
- Pick variant → updates line, closes
States · 5
src/features/cart/components/shared/variant-switcher-sheet.tsx:118src/features/cart/components/shared/variant-switcher-sheet.tsx:122src/features/cart/components/shared/variant-switcher-sheet.tsx:109packages/backend/convex/cartSync/mutations.ts:421packages/backend/convex/cartSync/mutations.ts:393Deliver to
AddressPickerModalDeliver to
Choose delivery address for shipping estimate and checkout prefill
src/features/addresses/components/address-picker-modal.tsxEntry
- Address line under bag title, signed in
Exits
- Choose address → sets and closes
- Add new address → address form after 300 ms
States · 3
src/features/addresses/components/address-picker-modal.tsx:66src/features/addresses/components/address-picker-modal.tsx:70packages/backend/convex/userAddresses/mutations.ts:129New Address / Edit Address
/(app)/address-formNew Address / Edit Address
Create or edit a saved address with search, locate and validation
src/app/(app)/address-form.tsxEntry
- Address picker Add new address
- Profile address book edit
Exits
- Save → back to previous screen
- Swipe down → close
States · 12
src/app/(app)/address-form.tsx:53src/app/(app)/address-form.tsx:29src/app/(app)/address-form.tsx:58src/features/addresses/components/address-form.tsx:286src/features/addresses/components/address-form.tsx:336src/features/addresses/components/address-form.tsx:336src/features/addresses/components/address-form.tsx:336src/features/addresses/validation/address-schema.ts:10src/features/addresses/utils/postcode-to-state.tssrc/features/addresses/components/address-form.tsx:421src/features/addresses/components/address-form.tsx:421src/features/addresses/components/address-form.tsx:708Items Unavailable
Shopify checkout
ShopifyCheckoutSheetShopify checkout
Shopify hosted native sheet for shipping, discount, payment and order placement
src/features/checkout/hooks/use-checkout.tsEntry
- Bag Checkout
- PDP Buy now
Exits
- Completed with order → order confirmation
- Close → back on bag or PDP
- Error → back on bag, no message
States · 12
packages/backend/convex/shopify/checkoutActions.ts:108src/features/checkout/hooks/use-checkout.ts:592packages/backend/convex/shopify/checkoutActions.ts:108packages/backend/convex/shopify/checkoutActions.ts:474src/features/checkout/hooks/use-checkout.ts:264src/features/checkout/hooks/use-checkout.ts:322src/features/checkout/hooks/use-checkout.ts:359src/features/checkout/hooks/use-checkout.ts:383src/features/checkout/hooks/use-checkout.ts:554src/features/checkout/hooks/use-checkout.ts:669packages/backend/convex/crons.ts:124packages/backend/convex/webhooks/shopify.ts:1480Bag stamp note
Bag stamp note
Needs data: Needs a cart meeting or missing the stamp minimum; set up cart
BagStampNoteBag stamp note
Tells shopper whether the bag earns a stamp
src/features/loyalty/components/stamps/bag-stamp-note.tsxEntry
- Bag screen, signed-in users only
States · 3
src/features/loyalty/utils/stamp-eligibility.ts:66src/features/loyalty/utils/stamp-eligibility.ts:69src/features/loyalty/utils/stamp-eligibility.ts:69


































