Phase 5 of the NIX Loyalty Platform — delivery integration. Orders from delivery
platforms (Foodpanda / WOW NOW / E-GETS / Grab / Nham) are captured into a virtual
“Food Delivery Apps POS” register; each becomes a customer-claimable
spin chance. This ship is the merchant-facing register view inside nix-cafe
(“Loyalty Mobile App Settings” → Food Delivery): list delivery orders with a status filter and
void an order (which cancels its unspun chances). It is an API client of the separate loyalty
backend (GET /admin/delivery-orders, POST /admin/delivery-orders/:id/void).
/pos/delivery/ingest/delivery/claim (1h anti-fraud window)demo.staging.nixtech.app, wired to the
staging loyalty backend (Fly) on Neon loyalty_staging (migration 0004 rehearsed there
first). A delivery order was ingested on staging demo, rendered in the register, filtered by status,
and voided through the UI (server action → loyalty backend → the order flips to
voided). Content-Type: application/json with an empty body, which Fastify 400’d — so
Void (and the existing cancel spin chance) silently failed. Fixed backend-side with an
empty-body-tolerant JSON parser (1255c89), redeployed to staging, re-verified green. staging awaiting the scheduled prod promote; the full narongix regression
sweep runs at that promote. Prod still needs migration 0004 + a backend Fly deploy.
Gate 2 evidence (demo, logged-in browser on staging):
STG-5001 row renders (Foodpanda · 3 spins)voided filter hides an ingested order)POST /admin/delivery-orders/:id/void) — order now voided

voided in the loyalty backendnix-cafe ece1508 (dev + staging) · loyalty backend 602f95d…1255c89
(dev; migration 0004, ESC/POS parser, ingest/claim/OCR, virtual-printer daemon) · no nix-db migration.