Catalog at a glance
| Coupon | Value | Mode | Stock |
|---|---|---|---|
| Loading… | |||
Coupon catalog
Coupon stock
The backend stores only a number — how many codes players can claim. Each claim reserves one and waits for you to grant the real code in Approvals. Rejecting an approval returns one unit here.
Setting the count to 0 shows the coupon as OUT OF STOCK in the app. The ± buttons adjust immediately; “Set count” writes the exact number you type.
Pending approvals
Coins are already deducted. Type the coupon code and Approve to deliver it to the player; Reject returns the reserved stock — coins are not refunded.
| Coupon | Player | Check | Face | Coins | Claimed | Code to grant | |
|---|---|---|---|---|---|---|---|
| Loading… | |||||||
Approval history
Every admin-gated claim that has been resolved — who approved/rejected it, for which player and code, and when.
| When | Action | Coupon | Player | Code | Admin |
|---|---|---|---|---|---|
| Loading… | |||||
Player lookup
players/{uid}Enter a Firebase UID to load the player's Firestore data.
Update Live Game Data
games_catalogue/{gameId}Upload a JSON file with an array of entries. Each entry must have a gameId plus at least one of currentlyPlaying or gameLikes (both numeric). Only the supplied fields are touched.
[{"gameId":"MagicForest","currentlyPlaying":142,"gameLikes":500},…]
Parsed 0 game entries — review before uploading:
| Game ID | Currently Playing | Game Likes |
|---|
Results:
| Game ID | Currently Playing | Game Likes | Status |
|---|
Send a notification
players/{uid}/notifications
Pick a template from the approved copy library, fill in its variables, preview the real
reach and text, then send. Required variables with no value block the send — a
player must never see {discount} in a message.
Leave the template empty to write a one-off message yourself.
Writing this by hand skips the approved copy library, so nothing checks the wording but you. Everything else still applies — the store broadcast cap and the clear rules below.
Stored as sourceEvent
so this send can be grouped later. It is never shown to the player.
Merged into the action's payload, after the fields above. Only needed for keys the form doesn't cover.
Audience
A multi-field segment may need a composite Firestore index. If the send fails, the error carries a console link that creates it.
Recent sends
notification_campaigns| When | Template | Audience | Sent | By |
|---|---|---|---|---|
| Nothing sent yet. | ||||
Sent is every player the card reached. There is no per-player daily cap, so this matches the audience the send resolved.
Announce winners
raffle_winnersPaste the winning UIDs from the draw. Each winner gets a pinned card asking them to reply to the confirmation email, and that card cannot be dismissed until you mark them confirmed below. Emails are read from each player's own record and always shown masked — never type an address in here.
Confirmations
reply received → send the code| Raffle | Winner | Status | Deadline | ||
|---|---|---|---|---|---|
| No winners announced yet. | |||||
Marking a winner confirmed unpins their card, cancels the pending 48-hour reminder, and delivers the reward code. The code goes into the card's payload, never into its text — a push preview would otherwise show it on a lock screen.
Game is live
“Notify me” subscribersTells the players who tapped “Notify me” on this game that it has launched. Send this first, then send the general new_game broadcast with this same game set as the exclusion, so nobody is told twice.
Send a coin gift
coin_gift templateThe player sees the card in their inbox with a Claim button. Coins are credited via PlaySuper when they tap Claim — do not credit them separately, or the player is paid twice.
Store tunables
store_config/tunablesCoin cost is derived: face value × coins-per-₹. Threshold is the fallback that makes a coupon use timer when its approval mode isn't set.