Retailer Rewards
Instant airtime rewards for retail shoppers — scan QR, verify invoice, get a voucher via SMS.
Overview
Retailer Rewards is a mobile web app that lets retail customers claim airtime rewards from in-store purchases. After scanning a QR code, customers validate their invoice against the retailer’s ERP, review a digital receipt, and receive a prepaid airtime voucher by SMS.
Built with Next.js, TypeScript, MySQL, and Zod — including eligibility rules (minimum spend, product filters, one claim per invoice), a multi-step claim wizard, and adapter-based airtime/SMS integrations for production providers.
Problem
The retailer needed a simple, mobile-first way to reward in-store spend with prepaid airtime — without manual voucher handling — while validating every claim against live ERP invoices so rewards stay fair and fraud-resistant.
Solution
Scan, verify, claim
A guided claim wizard that ties each reward to a real ERP invoice, then issues airtime via SMS.
1. Claim wizard (Next.js)
App Router + Server Actions flow: invoice entry, receipt review, contact capture, claim confirmation
2. ERP eligibility
MySQL (mysql2) validation against the retailer’s ERP sales headers/lines with spend tiers and one-claim rules
3. Airtime + SMS adapters
Pluggable HTTP providers for voucher issue and SMS delivery (mock-ready for demo/dev)
Key features
- QR-driven entry from in-store bags
- Live ERP invoice validation
- Receipt-style summary with computed reward
- Spend tiers / percent of ex-VAT total (min spend default R500)
- One claim per invoice
- Prepaid airtime voucher delivered by SMS
- Zod validation, signed eligibility tokens, rate limiting hooks
Tech stack
| Layer | Stack |
|---|---|
| Web | Next.js (App Router), TypeScript, Server Actions, shadcn/ui, Tailwind |
| Data | MySQL (mysql2) — retailer ERP invoice eligibility |
| Integrations | Zod, signed eligibility tokens, pluggable airtime + SMS HTTP providers |
Role
Full-stack build — claim wizard, ERP eligibility, reward rules, and adapter-based airtime/SMS integrations.