Two codes, two rewards, one set of checks. Here is the simple build, the loopholes, and how each one is covered so every reward is real and every consumer is tracked.
Every code is pre-generated in a master table, long and random so it cannot be guessed, and tied to one of two types.
A master table of unique, random codes, split into the sample pool and the pack pool. Each row holds the code, its type, batch, status and, once claimed, the consumer it belongs to.
Pack codes go on or inside the pack at the print run, under a scratch panel or the inner flap. Sample codes go on the sachet and on booth material.
The consumer enters the code in the chatbot, or scans the QR at a booth. We read the type and decide the reward: coupon for a sample, cashback for a pack.
For a pack, the code is the primary check and the bill is the secondary check. The bill is read for store, date, amount and product, and matched to the code.
Cashback pays to UPI through a gateway like Razorpay, or the coupon is issued. Every event writes back to the consumer record and the dashboard.
Offline activations leak the most, so each risk has a specific control.
The phone number and UPI ID are the stable keys. Everything attaches to them.
The first scan sets a first-party id, even before sign-up. Registration links it to the phone number, and the payout links it to the UPI ID. From then on it is one consumer record.
The code and the bill capture the platform and store, so a buy on Amazon, Zepto, Blinkit or in a kirana shop all land on the same record. No need for each platform's own data.
Because sample, code, bill and consumer all connect, the dashboard shows a real acquisition cost. The same record drives WhatsApp and email follow-ups, and consented segments for ads.
The same checks run behind the two workflows.