Deposit bonuses and restrictions
1) What is a deposit bonus and why is it complicated
A deposit bonus is a monetary or non-monetary incentive tied to a player's deposit. Its complexity is in three planes:- Monetization: real uplift ARPU/LTV vs cost (fees/FX/bonus/frisks/billing risks).
- Compliance and responsible play: transparent terms, betting restrictions, game exclusions, self-exclusion.
- Payment risks: same-method/return-to-source, net deposits (ND), chargebacks/returns and "carousels" of conclusions.
2) Types of deposit bonuses
Matched (interest on deposit): 100% to X.
Tiered: 50% to X1 + 25% to X2.
Sticky/Non-sticky: sticky cannot be displayed separately; non-sticky first plays real.
Cash vs Bonus Credit: cash is credited in stages (unlock), credit - in the "virtual balance."
Free Spins/Free Bets: tied to slots/markets; the cash value equivalent is fixed in advance.
Recurring/Reload: Recurring Scheduled/Event Deposits.
High-roller: increased limits with stricter conditions.
3) Basic limitations (policy core)
Min Deposit: Minimum amount to participate.
Wagering Requirement (WR): оборот = `k × (bonus_amount [+ deposit?])`.
Contribution% for games: slots 100%, tables 10-25%, live games 5-10%, etc.
Max Bet with WR active: e.g. '≤ 5 EUR' or '≤ X% of bonus'.
Timebox: time for WR execution (e.g. 7/14/30 days).
Game Exceptions: Jackpots, freespin buys, some high-RTP titles.
Same-Method/Return-to-Source: output to ND - only back to source.
KYC/RG gating: bonus is activated/payment is allowed only after KYC L1/L2 and no self-exclusion.
Geo/Sanctions/Licenses: whitelists of countries and local methods; prohibition in risk-GEO.
One-per-Person/Household/Device: protection against duplication.
4) Economics and metrics
4. 1. Expected bonus value (operator EV)
EV_bonus ≈ Uplift_GGR − Bonus_Cost − Promo_Fees − FX_Slippage − Chargeback_Losses
where
'Uplift _ GGR = (GGR_with − GGR_without) 'by method A/B or CUPED;
'Bonus _ Cost = bonus paid + FS value (by fair value) ';
'Promo _ Fees = additional payment fees/markup/fixed due to uplift transactions.'
4. 2. Breakage (undisclosed bonus)
Breakage = − accrued (paid + written off at WR + statute of limitations)
Used for valuation of liabilities and net present value of promo.
4. 3. Actual cost (CPA equivalent)
Cost_per_Qualified_Depositor = (Bonus_Cost + related fee + FX )/# of depositors who have executed min dep
5) Anti-abuse and control
Vectors:- Multi-account/household stacking.
- Net-deposit loops: deposit → bonus → partial game → withdrawal/chargeback.
- Method arbitrage: cheap deposit method + expensive withdrawal corridor.
- High-RTP abuse: Playing only titles with a high WR contribution.
- FX circles: benefit from fluctuations in deposit/withdrawal rates.
- CoF/Tokens binding to the user; one bonus per BIN/card/wallet.
- ND guard: As long as' ND <0 '(net-drawals), new deposit bonuses are prohibited.
- Payout lock: before WR execution - inhibit/limit outputs, except for same-method within ND.
- Game-mix control: requires' ≥ M'unique titles or' ≤ X% 'turnover on excluded ones.
- Velocity/Device/Geo-conflict → step-up KYC/SoF или deny.
- Max Bet and banning "hedge" betting in interconnected markets.
6) Communication with payments (Payments × Bonuses)
Same-method/Return-to-source: protection against "cashing out bonuses" through another method.
ND (Net Deposits): bonuses are available if'ND ≥ Threshold'for the period/always.
MoR/Taxes: check/fiscalization at MoR should not include unrealized bonus; accounting in liabilities.
FX: fix the reference rate at the time of bonus accrual; expense/gain - by effective rate.
Reserves/PSP: Consider rolling-reserve and fees in the cost of the promo.
7) UX/Communications
Clear offer card: "100% to 200, min dep 10, WR = 30 × bonus, max bet 5, slots 100%, 7 days."
WR progress bar: turnover amount/balance/deadline; contribution of games (tooltip).
Transparent locks: "Output for the amount of ND is available to the replenishment source. The rest after WR."
Understandable reasons for failure: "Max bet exceeded with active bonus."
Localized T&C + short version on the deposit screen itself.
8) Promo Engine Rules (pseudo-DSL)
yaml promo: "welcome_100_v3"
eligibility:
geo_in: [DE, AT, FI]
kyc_level_min: L1 nd_min: 0 one_per: [person, device, payment_token]
deposit:
min_amount: {EUR: 10}
methods_whitelist: [CARD, A2A, LOCAL_WALLET]
bonus:
type: MATCHED match_pct: 100 cap: {EUR: 200}
wagering:
base: BONUS_ONLY # или BONUS_PLUS_DEPOSIT multiplier: 30 contrib:
slots: 100 tables: 25 live: 10 limits:
max_bet_amount: {EUR: 5}
time_limit_days: 14 withdrawal:
same_method: true allow_nd_withdrawal: true abuse_controls:
one_game_share_max_pct: 80 sticky: false token_binding: true
9) Data model (minimum)
sql
-- ref reference books. promos (
promo_id PK, name, version, geo_whitelist, methods_whitelist, kyc_min, nd_min,
type, match_pct, cap_amount, wr_base, wr_multiplier, max_bet_amount,
time_limit_days, contrib_json, sticky, one_per, enabled, effective_from, effective_to
);
-- Linking bonuses to bonus deposits. grants (
grant_id PK, promo_id FK, user_id, deposit_tx_id, currency,
bonus_amount, granted_at, expires_at, status -- ACTIVE FORFEITED COMPLETED EXPIRED
);
-- Bonus wagering progress. wr_progress (
grant_id FK, user_id, turnover_slots, turnover_tables, turnover_live,
turnover_total, required_total, updated_at
);
-- Violations of bonus rules. violations (
id PK, grant_id, user_id, type, details_json, occurred_at, severity -- INFO WARN DENY
);
-- Betting and bonus game restrictions. session_limits (
grant_id, user_id, max_bet_amount, game_exclusions_json, one_game_share_max_pct
);
-- Net deposits (ND)
finance. net_deposits (
user_id, currency, nd_total, nd_30d, nd_7d, updated_at
);
10) SQL templates
10. 1. Required WR and balance
sql
SELECT g. grant_id,
p. wr_multiplier,
p. wr_base,
g. bonus_amount,
CASE WHEN p. wr_base='BONUS_PLUS_DEPOSIT'
THEN (g. bonus_amount + t. deposit_amount) p. wr_multiplier
ELSE g. bonus_amount p. wr_multiplier
END AS wr_required,
wr. turnover_total AS wr_done,
GREATEST(0, (CASE WHEN p. wr_base='BONUS_PLUS_DEPOSIT'
THEN (g. bonus_amount + t. deposit_amount) p. wr_multiplier
ELSE g. bonus_amount p. wr_multiplier END) - wr. turnover_total) AS wr_left
FROM bonus. grants g
JOIN ref. promos p ON p. promo_id=g. promo_id
JOIN dw. transactions_flat t ON t. tx_id=g. deposit_tx_id
LEFT JOIN bonus. wr_progress wr ON wr. grant_id=g. grant_id
WHERE g. user_id=:uid AND g. status='ACTIVE';
10. 2. Contribution by game (contribution%)
sql
-- Calculation of Daily Turnover Including Curb%
SELECT grant_id,
SUM(CASE game_category
WHEN 'slots' THEN stake1. 00
WHEN 'tables' THEN stake0. 25
WHEN 'live' THEN stake0. 10
ELSE 0 END) AS turnover_weighted
FROM dw. bets
WHERE user_id=:uid AND placed_at::date =:d AND grant_id IS NOT NULL
GROUP BY grant_id;
10. 3. ND gate to participate
sql
SELECT (nd_total >= p. nd_min) AS eligible
FROM finance. net_deposits nd
JOIN ref. promos p ON p. promo_id=:promo
WHERE nd. user_id=:uid AND nd. currency=:ccy;
10. 4. Detection of max bet violations
sql
SELECT b. bet_id, b. amount
FROM dw. bets b
JOIN bonus. session_limits l USING (grant_id, user_id)
WHERE b. user_id=:uid AND b. grant_id=:grant AND b. amount > l. max_bet_amount;
10. 5. One-per token (card/wallet)
sql
SELECT COUNT() > 0 AS already_used
FROM bonus. grants g
JOIN dw. transactions_flat t ON t. tx_id=g. deposit_tx_id
WHERE g. promo_id=:promo AND t. payment_token=:token AND g. status <> 'FORFEITED';
11) Dashboards and KPIs
Promo Take-Rate = share of deposits with promo.
WR Completion %, Time-to-WR p50/p95.
Bonus Cost/GGR Uplift (by cohort/channel/method).
Breakage% and Promo Liability (liability on the balance sheet).
Abuse Rate: share of violations (max bet, game mix, one-per), multi-account flags.
ND Gate Hit% and the impact on the decline in carousels.
Withdrawal After Bonus % (и доля same-method).
Chargeback After Bonus bps by Method/PSP.
FX Slippage bps on deposits/withdrawals as part of the promo.
12) Alerts and thresholds
WR Completion Collapse: Down X bps d/d.
Abuse Spike: max bet/one-per/game-mix> threshold violations on the rise.
CB Surge Post-Bonus: Chargebacks 7-14 days after participation> threshold.
Liability Drift: difference between accrued bonuses and liabilities> Y%.
ND Negative Share: Growth in the share of players with 'ND <0' among participants.
FX Anomaly: bps-jump in FS value/bonus due to course.
Regulatory Guardrail: Attempted self-excluded/unverified.
13) Compliance and responsible play
Transparent T&C (short version in check-out): min dep, WR, max bet, timebox, contribution%, game exclusions, same-method.
Responsible game (RG): limits, cooling-off, self-exclusion → promo not available.
KYC/SoF: payments "after bonus" - only on completed checks.
Geo/Licenses: compliance with local rules (bans on certain types of promotions).
14) UX patterns
Before deposit: calculator "How much will I get" + conditions in 1 line.
After the deposit: a check with a bonus/WR/deadline and a "Start playing" button.
WR progress: sticky widget, game contribution, deadline timer.
Violations: soft banner + link to the rules, automatic forfeit for rough cases.
Output: transparent ND section and same-method hint.
15) A/B and change policy
Test multiplier, max bet, timebox, contrib% and cap with guardrails: CBR bps, Abuse Rate, AR/Take-Rate.
CUPED by pre-GGR/behavior; cluster-robustness (user/household/device).
Evaluation period - minimum WR window + payment log/CB.
16) Implementation checklist
- Promo Reference Rules (DSL) and Validator.
- ND model and same-method/return-to-source in payout.
- Progress WR, contribution%, game exclusions, max bet.
- Detection and violation log, automatic forfeit/blocking.
- Liability and breakage in reporting.
- UX offer cards, progress bar, localized T & C.
- Alerts (WR, Abuse, CB, Liability, ND).
- A/B methodology and data frieze with lag on CB.
- Legal texts by jurisdiction; RG gates; KYC gates.
Summary
Deposit bonuses work only if the economy (EV, breakage, liability), payment rules (ND, same-method, return-to-source), anti-abuse and UX transparency are collected in a single system. Formalize promo policies in DSL, manage WR and ND progress, count actual value (including fees/FX/CB), keep dashboards and alerts - and you get LTV growth without regulatory and payment surprises.