Appearance
Promotions, wheels & loyalty
Two related areas drive how players are rewarded: the bonus templates that define individual offers, the wheels that grant spins, and the loyalty program that defines the VIP ladder those offers often hang from.
Bonus templates
A bonus template is a reusable definition of an offer — what the reward is, when it fires, and who qualifies. The templates list supports searching and filtering by status and trigger, duplicating an existing template as a starting point, and the usual create and edit flows.
Every template is built from a few decisions:
- When it fires — registration, a deposit, a promo code, a manual grant from admin, segment membership, or a calendar window. Minimum deposit is available for Deposit, Promocode, and Manual (not only deposit/promo).
- What it gives — a fixed amount, a percentage match, free spins, or cashback.
- The wagering rules — how much the player must wager before bonus funds unlock.
- Who qualifies — conditions like country, segment membership, deposit thresholds, frequency caps, and an availability window.
- Where it applies — which game collections count, and any contribution overrides for wagering.
Promo-code templates add their own settings: the code itself, a usage cap, and a redemption history so you can see who used it.
A stats panel summarizes performance — active codes, redemptions, and total bonus amount issued — behind the bonuses.report.view permission. Managing templates needs bonuses.templates.manage; viewing them needs bonuses.templates.view. Operators can issue a template to a specific player from the bonus detail page (Issue to player).
Issue to player creates a pending offer; it is not an eligibility override. When the player activates it, the current template validity window, top-level minimum deposit, and nested eligibility conditions are checked before any bonus balance or free spins are credited. For deposit-triggered (and other non-promo-code) templates, minimum deposit / deposit-amount rules are checked against the single qualifying deposit for that offer — the deposit pinned when the bonus was earned on a real deposit, or else a deposit made at/after the pending grant was created. Lifetime deposit totals are never used for those gates. Promo-code templates keep their separate “min lifetime deposit” meaning. Rewards already earned through quests, wheels, the bonus shop, cashback, or loyalty progression are pinned as earned entitlements and are not requalified at activation.
Loyalty program
The loyalty page configures the VIP ladder, in two tabs.
Levels
Each level has a unique points threshold, localized titles, an optional linked bonus template, a cashback percentage, and perk flags — a VIP manager, accelerated payouts, a birthday gift, and a level image. Creating or editing a level with a threshold that another level already uses is rejected (conflict). Level numbers are derived from ascending points order, so a duplicate threshold would also silently renumber peers — uniqueness prevents that. Levels can be reordered, and a Synchronize action recalculates every player's level from their current points, which is how you apply a changed ladder to the existing base.
Rules
The rules tab controls how wagering turns into points. There's a global accrual setup — whether only real bets count, a maximum counted spin amount, and a base currency rate — plus per-currency rate exceptions and per-category or per-provider rates for fine-tuning which games earn at which speed.
Admin money fields (birthday gift, max counted spin) are labeled UZS. Values are stored as entered and converted at the live FX rate when points or gifts are applied — they are not frozen to the USD rate from the day you saved the form. See Admin money vs ledger USD.
Viewing the program needs loyalty.view; changing levels or rules needs loyalty.manage.
How they connect
The link between the two is deliberate: a loyalty level can point at a bonus template, so climbing the ladder unlocks the periodic offers a player sees on their VIP page. Configure the template once, attach it to a level, and the reward flows automatically as players progress.
Wheels
Wheels live at /wheels (wheels.view / wheels.manage). Each wheel has sectors (bonus template or no-win), targeting (segments and loyalty levels), a frequency window, and a trigger.
Triggers
| Trigger | How spins are granted |
|---|---|
once_per_period | One spin when the frequency window opens. |
deposit_count | Spins from how many deposits fall inside the lookback window. |
deposit_sum | Spins from deposit volume in that window. |
bet_sum | Spins from wager volume in that window. |
Event triggers (deposit_count / deposit_sum / bet_sum) reconcile from the ledger on deposit/bet and whenever the player loads wheels. Meeting the threshold credits availableSpins; availableSpins: 0 with no progress is not shown as a playable wheel (a new account does not see a deposit_count=4 wheel with a dead Spin button).
You can AND a second event trigger on the same wheel (for example 4 deposits and 100 000 UZS in the last 7 days). A single primary trigger cannot express that combination by itself — use the extra trigger field, or a segment if you need more.
Frequency vs spin lifetime
- Frequency period is the lookback / reset window (for example 7 days).
nextResetAtis that duration from the period start, not the next UTC midnight. - Spin TTL (default 24 hours) is how long an unused granted spin stays available. Expired unused spins count as consumed so they are not immediately re-granted in the same window.
Shop-linked wheels are excluded from promotional grant. Guest promo tiles only advertise periodic (once_per_period) wheels.
Money thresholds are admin UZS, stored as entered, and compared at the live FX rate. After changing a wheel, open/save it once if older rows still hold frozen USD leftovers.
Player-facing modal chrome (title, Spin, next-prize refresh) is localized, including Uzbek.
Admin money vs ledger USD
The player ledger is still USD. Admin forms that ask for som (segment deposit sum, wheel deposit/bet sum, quest money tasks, loyalty birthday gift / max spin) persist the UZS figure you type. Evaluation converts at the current exchange rate so a 100 000 UZS threshold does not drift when the daily FX rate moves. Percentage deposit bonuses are computed in the deposit’s native currency (an 81 000 UZS deposit at 50% credits 40 500 UZS, not a round-tripped 40 526.25).