Glossary
Terms used across the platform.
| Term | Meaning |
|---|---|
| 30-day claim | claimRecentOrdersForUser stamps a buyer's paid, unrewarded orders from the last 30 days, matched by the email and phone that buyer has verified, when their profile is created or gains an email, phone or Shopify customer id |
| Campaign node | The single Shopify discount node backing a voucher template; all of the template's voucher codes attach to it |
| Claim code | A printed QR code (Duit Raya/seasonal) that issues a voucher when scanned |
| Cycle | One complete stamp card; completedCycles is a lifetime counter, redemptions consume redeemedCycles |
| Duit Raya | The seasonal QR claim-code campaign module (also the generic pool storage layer) |
| Field firewall | toMobileFormat() — mobile only sees fields explicitly mapped |
| Fingerprint | EAS runtime-version policy hashing native deps (+ mobile package.json scripts); mismatched fingerprints break OTA |
| The publication | The projectR Shopify publication — the sole source of truth for what the app sells |
| Shake-to-win | Instant rewards drawn from probability tiers when a special stamp position is crossed |
| Sharded counter | Convex component counter (e.g. activeVouchers:<userId>) that must be kept in lockstep with table state |
| Silent corruption | The failure mode of forgetting an aggregate update — stats drift with no error |
| Stamp outcome | orders.stampOutcome, the recorded reason an order did or did not earn stamps (awarded, below_min_spend, no_active_campaign, not_awarded, no_app_user, awaiting_payment, needs_review) |
| Subtotal rule | evaluateStampEligibility tests a campaign's minimum spend against the order subtotal after discounts, before shipping and tax. The workflow arg that carries it is misleadingly named orderTotal |
| Account stage | Mobile auth state from deriveAccountStage: guest, loading, unknown, closed, needs-details or ready |
| Sign-in sheet | The auth route group, opened as a modal over the screen that asked for sign-in |