Bonus engine is the second hardest module after wallet. Wagering bugs = direct P&L leak and bonus hunter paradise.

Types
- Deposit match
- Freebet / freespin
- Cashback
- Loyalty points
Wagering
- Multiplier × bonus amount
- Game contribution % (slots 100%, live 10%)
- Max bet cap while bonus active
Lifecycle
grant → active → wagering → completed/forfeited/expired

Anti-abuse
- One bonus per household/device
- Stacking rules
- Withdraw block until wager done
Checklist
- Spreadsheet edge cases
- Separate bonus_wallet in ledger
- CRM segments
Testing bonus rules
- Spreadsheet 10 edge cases: grant → wager → outcome
- Separate bonus_wallet in ledger
- Unit tests for max bet and contribution %
- Dashboard bonus cost / GGR by campaign
