Skip to content

E2E retail roadmap and checklist

VersionDate (UTC)Notes
1.0.02026-05-21Initial roadmap: P0/P1/P2 screen checklist, phased work packages, links to existing specs. Implementation schedule: TBD (owner fills dates when planning).

Owner / scheduling: Add a row below when you commit to a phase (start date, target exit, responsible).

PhasePlanned startTarget exitOwnerStatus
Phase 0 — FoundationTBDTBDTBDNot started
Phase 1 — P0 POS & ordersTBDTBDTBDNot started
Phase 2 — P0 inventory & catalogTBDTBDTBDNot started
Phase 3 — Admin P0TBDTBDTBDNot started
Phase 4 — P1 expansionTBDTBDTBDNot started
Phase 5 — P2 & maintenanceTBDTBDTBDOngoing

Retail operations require correct money, stock, and scope (store, zone, role). This page is the single backlog for:

  1. Which screens and flows need browser E2E (Playwright) or API E2E (Jest).
  2. What to build in each phase (fixtures, specs, CI).
  3. How to know P0 is done before calling a release gate.

This does not replace:

Accuracy model: Unit tests prove logic; API E2E proves HTTP contracts and totals; browser E2E proves critical UI paths call those APIs correctly. No approach guarantees 100% correctness—this roadmap minimizes regression on tier-A revenue paths.


AreaToolingBrowser E2E todayNotes
vendor-webPlaywright (apps/vendor-web/playwright.config.cjs)e2e/login.spec.ts onlyglobal-setup.ts waits for GET /api/v1/health
vendor-webSame⚠️ “E2E” folder mostly not browserFiles like pos-place-order-surfaces.spec.ts read src/ (contract tests)—move to Vitest over time
admin-webVitest only⛔ No Playwright yetSee Admin web test cases
backendJest test/*.e2e-spec.tsN/A (HTTP)Auth, health, OpenAPI smoke, partial POS admin

Commands:

Terminal window
# Vendor browser E2E (backend must be up)
cd apps/backend && npm run start:dev # or DB_ENABLED=false for in-memory seeds
cd apps/vendor-web && npm run test:e2e:install
npm run vendor:test:e2e # from repo root

Env vars: PLAYWRIGHT_VENDOR_OWNER_EMAIL, PLAYWRIGHT_VENDOR_OWNER_PASSWORD, PLAYWRIGHT_API_BASE_URL — see Frontend applications.


PriorityMeaningRelease gate
P0Revenue-critical: wrong behavior loses money, stock, or trustRequired for “retail E2E ready”
P1Important operations; schedule soon after P0Recommended before major releases
P2Lower traffic or hardware-dependentBacklog

Automation columns: Unit | API-E2E | Browser-E2E | Manual — check when done; add spec path in Notes.


Routes use VENDOR_ROUTES in apps/vendor-web/src/lib/vendor-routes.ts.

IDRoute / screenFlow to automateMin assertionsUnitAPI-E2EBrowser-E2ENotes
A1/loginOwner + employee sign-inURL /dashboard, shell visible; login POST 200[x] e2e/login.spec.tsExtend forgot-password later (P2)
A2/dashboard/pos or /point-of-sale/saleOpen shift (if required) → select store/lane → add SKU → pay cashplace-order 200, order_id, totals match API (minor units)[ ][ ][ ]Golden path #1
A3SameCart with % discount + taxSubtotal, discount, tax, grand total = API body[ ][ ][ ]Pair with API fixture cart
A4SameCRM customer (non-guest) + membership preview priceLine price matches catalog preview API[ ][ ][ ]See pos-catalog-member-preview util tests
A5SameDebt / BNPL tenderNo terminal modal; order status correct[ ][ ][ ]isPosTerminalPaymentBlocking contract exists
A6/dashboard/orders/createManual retail orderSame as A2 via postVendorPlaceOrder[ ][ ][ ]usePosPlaceOrder on 3 surfaces
A7/dashboard/ordersList → detail; filters; pagination URLpage, limit, tab in URL; detail fields[ ][ ][ ]
A8Returns tab / /point-of-sale/returnsPartial refundRefund amount + stock restored[ ][ ][ ]Backend: vendor-refund-restock.util
A9/dashboard/orders/shiftsOpen / close shiftBlock or warn place-order when policy requires shift[ ][ ][ ]P1 if shift not mandatory in seed

Linked sheets: POS & payments, Vendor orders & checkout, Vendor POS workspace, POS guide.


IDRouteFlowMin assertionsUnitAPI-E2EBrowser-E2ENotes
B1/dashboard/items/listSearch, sort, pagination URLQuery params stable after reload[ ][ ][ ]P0 list accuracy
B2/dashboard/items/createCreate simple itemAppears on list; POS menu can load it[ ][ ][ ]P0
B3/dashboard/items/:id/editChange retail pricePOS menu price updates[ ][ ][ ]P0
B4/dashboard/items/price-approvalsApprove price batchStatus transition[ ][ ][ ]P1 if workflow enabled
B5Items list column popoverToggle optional columns + persistVisible columns + storage key[ ][ ]P1; admin has similar pattern

Linked: Catalog products (vendor), Vendor web test cases.


IDRouteFlowMin assertionsUnitAPI-E2EBrowser-E2ENotes
C1/dashboard/inventory/stocksView stock for storeQty matches API before/after sale[ ][ ][ ]P0
C2/dashboard/inventory/adjustmentsPost adjustment (+/−)Delta = form; audit row[ ][ ][ ]P0
C3/dashboard/inventory/lotsLot detail (if used)Lot qty consistent[ ][ ][ ]P1 if lots enabled
C4/dashboard/inventory/inter-store-borrowTransfer between storesSource ↓ dest ↑[ ][ ][ ]P1 pick one transfer type

Linked: Inventory (vendor), Vendor inventory test cases.


D. Vendor — customers & receivables (P0 / P1)

Section titled “D. Vendor — customers & receivables (P0 / P1)”
IDRouteFlowMin assertionsUnitAPI-E2EBrowser-E2ENotes
D1/dashboard/customers/listCreate / edit customerSelectable on POS[ ][ ][ ]P0
D2/dashboard/finance/receivablesReceivable from BNPL order (A5)Balance = order debt[ ][ ][ ]P0
D3SameRecord partial paymentBalance decreases correctly[ ][ ][ ]P0

Linked: Finance (vendor), Vendor finance test cases, Sales & receivables procedures.


IDRouteFlowBrowser-E2E
E1/dashboard/finance/transactionsFilter by date range[ ]
E2/dashboard/finance/expensesCreate expense[ ]
E3/point-of-sale/reportRevenue matches P0 orders[ ]

IDRouteFlowBrowser-E2E
F1/dashboard/settings/checkout-lanesMulti-lane: lane required before POS[ ]
F2/dashboard/settings/devicesDevice row saved (mock terminal in CI)[ ] Manual for real pinpad
F3/dashboard/orders/create-wholesaleWholesale order + price list[ ]

G. Admin platform (P0 / P1) — Playwright not set up yet

Section titled “G. Admin platform (P0 / P1) — Playwright not set up yet”

Routes: ADMIN_ROUTES in apps/admin-web/src/lib/admin-routes.ts.

IDRouteFlowMin assertionsAPI-E2EBrowser-E2ENotes
G1Admin loginLogin + module in JWTDashboard shell[ ][ ]Mirror vendor Playwright config
G2/dashboard/productsZone-scoped list + batch status403 out of zone; batch cap 200[ ][ ]P0
G3/dashboard/products/createCreate platform itemVisible in list[ ][ ]P1
G4/dashboard/storesStore in admin zoneDetail / edit guard[ ][ ]P0
G5/dashboard/vendorsVendor list + package[ ][ ]P1
G6/dashboard/ordersPlatform orders list/detail[ ][ ]P1
G7/dashboard/inventory/stocksCross-vendor stock (zone)[ ][ ]P1
G8/dashboard/ticketsSupport Kanban / list[ ]P2

Linked: Admin catalog test cases, Admin web.


H. Backend API E2E (Jest) — P0 complements

Section titled “H. Backend API E2E (Jest) — P0 complements”

Add or extend under apps/backend/test/. These prove money and stock without UI.

IDAPI / areaScenariosFile (proposed)Status
H1Vendor POS place-orderCash cart fixture → totals, tax, discount, stock deltavendor-place-order.e2e-spec.ts[ ]
H2Admin products batch statusCap, zone deny, success countextend admin products tests[ ]
H3Inventory adjustmentQty after adjustvendor-inventory-adjust.e2e-spec.ts[ ]
H4Receivable paymentLedger balance after paymentvendor-receivable-payment.e2e-spec.ts[ ]
H5Admin products listZone filter on list/getextend existing service e2e or HTTP[ ]

Existing: auth.e2e-spec.ts, vendor-auth.e2e-spec.ts, auth-admin.e2e-spec.ts, openapi-routes.e2e-spec.ts, pos-admin.e2e-spec.ts, http-security.e2e-spec.ts.


  • Real PAX / CodePay hardware and bridge payment capture (POS terminal docs).
  • Bulk marketing, translation admin, low-traffic settings (SMTP, withdrawals).
  • Docs-only screenshots (e2e/docs-screenshots.spec.ts) — keep separate from retail gate.
  • Snapshot-testing entire pages (brittle; prefer numeric API asserts).

Use the Phase schedule table at the top to record dates when ready.

Goal: Reliable CI + shared fixtures; clarify what is “browser E2E” vs unit.

#TaskDone
0.1Document seed strategy: retail-e2e vendor, 2 stores, fixed SKUs/prices/stock (script or migration seed)[ ]
0.2Playwright fixtures: loginAsVendorOwner, loginAsVendorEmployee, selectStore, gotoPosSale in apps/vendor-web/e2e/fixtures/[ ]
0.3Move non-browser specs from e2e/*.spec.tssrc/**/*.spec.ts (Vitest)[ ]
0.4CI job: MySQL (or documented DB_ENABLED=false) + vendor:test:e2e smoke (login + health)[ ]
0.5Assert convention doc: money in minor units from JSON, not parsed UI text[ ]
0.6Add data-testid on POS Pay / Place order (minimal, stable)[ ]

Exit criteria: npm run vendor:test:e2e green on CI; login spec + health; seed documented.


#TaskIDsDone
1.1API E2E place-order totalsH1[ ]
1.2Browser: cash saleA2[ ]
1.3Browser: discount + taxA3[ ]
1.4Browser: debt tenderA5[ ]
1.5Browser: create order pageA6[ ]
1.6Browser: order list + detailA7[ ]
1.7Browser: partial returnA8[ ]

Exit criteria: Golden path “sell → list → partial refund” green locally and CI.


Phase 2 — P0 inventory & catalog (vendor)

Section titled “Phase 2 — P0 inventory & catalog (vendor)”
#TaskIDsDone
2.1Stock before/after saleC1 + H1[ ]
2.2AdjustmentC2 + H3[ ]
2.3Items list/create/edit priceB1–B3[ ]
2.4Customer + receivable from debt orderD1–D3 + H4[ ]

Exit criteria: Stock and receivable numbers match API after P0 sale flow.


#TaskIDsDone
3.1Scaffold apps/admin-web/playwright.config + e2e/global-setupG1[ ]
3.2Admin login E2EG1[ ]
3.3Products list + batch statusG2 + H2/H5[ ]
3.4Stores zone scopeG4[ ]

Exit criteria: Admin smoke on CI; products batch covered.


#TaskIDsDone
4.1Shifts, wholesale, lanesA9, F1, F3[ ]
4.2Finance transactions, expenses, POS reportE1–E3[ ]
4.3Price approvals, column popoverB4, B5[ ]
4.4CI: @smoke tag for PR (~15 min); nightly full suite[ ]

  • Admin tickets Kanban (G8), marketing, permission matrix (owner vs employee).
  • Flaky test budget: < 2% over 50 CI runs before enforcing PR gate.
  • Optional: 3–5 visual snapshots (not whole-app).

Before treating E2E as a release gate, all must be true:

  1. CI smoke runs on every PR: A1 + A2 + C2 + G1 + G2 (or documented subset with issue link).
  2. Money asserts use API JSON integers (cents), not OCR from UI.
  3. Seed data is deterministic (E2E_SKU_001, fixed prices)—no “today’s date” dependence.
  4. Unit coverage remains for services (admin-products.service.spec.ts, PosService, refund restock utils, etc.).
  5. Flaky rate under agreed threshold; quarantined tests marked test.fixme with ticket id.

Effort reference (for planning — not commitments)

Section titled “Effort reference (for planning — not commitments)”

Rough engineering weeks with one FTE focused on E2E (backend support for seeds part-time):

PhaseCalendar weeksNew browser specs (order of magnitude)New API e2e specs
0220
138–124–6
2310–144
336–83
4415–205

Adjust when you fill the Phase schedule table.


When a spec lands:

  1. Check the row in sections A–H (Unit / API-E2E / Browser-E2E).
  2. Add TC- id in the matching system test cases sheet; mark E2E✓ + path.
  3. Update Vendor testing and screenshots index for vendor screens.
  4. Bump Document control version on this page if priorities change.