← All tests

Loyalty Mobile App Settings (prod)

The first shipped surface of the NIX Loyalty Platform — a white-label loyalty/spin product. This is the merchant config page inside nix-cafe, and it’s an API client of a separate loyalty backend (its own service, so consumer loyalty traffic never touches the live POS database). Config persists in the loyalty backend, not in cafe.* tables.

Gate 2 4/4 passed + 23/23 regression subset (phase1 11/11, phase2-cafe-multishop 6/6, phase2-sso-outdoor 6/6). nix-cafe cf35820 · no migration.

New backend deployed: nix-loyalty-backend (Node + Fastify + Drizzle) live on Fly.io (Singapore) → nix-loyalty-backend.fly.dev, on a dedicated Supabase project. nix-cafe reaches it server-to-server with a service token + X-Tenant-Id (the tenant code).

The page ships six working config sections — Theme (white-label app name, logo, colors), Promotions & Seasonal banners (R2 image upload), Popular Menu (pick 4 products), Points (earn rate / sign-up bonus), and Locations (enrich synced stores) — plus a Sync catalog & stores action. Orders & Spins + Reward Settings (Phase 2) and Food Delivery (Phase 5) render as “coming soon”. The Spin sections are gated to spin-enabled tenants (Get Coffee only).

Gate 2 evidence (lumiere-coffee, logged-in browser):

✓ SSO-login lumiere-coffee owner
✓ Page renders + reaches the loyalty backend (no “backend unreachable” banner)
✓ Section tabs switch (promotions, points, locations render)
✓ Theme save round-trips THROUGH the UI to the loyalty backend
   (browser save → server action → Fly backend → Supabase, confirmed via the backend’s own /admin/theme API)

Screens

Theme section
Theme — app name, logo, primary/accent colors
Promotions section
Promotions — home banners + slide timer
Points section
Points — earn rate, sign-up bonus, white-list policy
Locations section
Locations — sync stores, then enrich with map coordinates
Theme edited
Theme edited (app name + primary color) before save
Theme saved
Saved — confirmed persisted in the loyalty backend