What a 100% Match Bonus Actually Costs: Wagering Requirements, Simulated
A $100 bonus with a 30x rollover is not a $100 cost. Simulated across 200,000 players it costs $52.63, because only 52.63% survive the turnover requirement. Here is the path-dependent math and why closed-form estimates get it wrong.
Table of contents
A bonus with a wagering requirement is a path-dependent option. Its cost does not depend on where the player ends up. It depends on the entire sequence of their balance along the way, because the contract terminates the moment that balance touches zero.
That single property breaks every back-of-envelope estimate operators use, in both directions.
The short answer
A $100 match bonus with a 30x rollover on deposit plus bonus does not cost $100. Simulated across 200,000 players at a 3% house edge, 52.63% complete the turnover requirement and 47.37% bust first. The expected bonus cost is $52.63, and expected house profit per bonus issued is $59.17.
The two wrong answers
Ask an operator what a 100% match on a $100 deposit with 30x rollover costs, and you get one of two answers.
The finance answer is $100. The bonus is credited, so book the liability at face value. This is conservative, it is what the accounting usually forces, and it overstates the cost by $47.37 per bonus, which is 90% too high.
The floor answer is "nothing, nobody clears rollover." This is folklore, and it is wrong in the more expensive direction. More than half of players cleared it in this simulation.
Both answers come from treating a path-dependent instrument as a static one.
Setting up the actual contract
Deposit $100, bonus $100. Rollover is 30x on deposit plus bonus, so required turnover is 30 x $200 = $6,000. Eligible games carry a 3% house edge. Bets are $1.
The naive calculation looks reassuring. Expected loss over $6,000 of turnover is $6,000 x 0.03 = $180. The bonus cost $100. So the house nets $80 per bonus.
That number assumes every player survives to place all 6,000 bets. Starting balance is $200. Expected loss over the full requirement is $180. The player is expected to finish with $20, and the standard deviation of a 6,000-bet random walk at $1 per bet is roughly $77. A large fraction of that distribution is below zero, and a player who touches zero stops betting permanently.
The ruin barrier is the entire problem, and it has no clean closed form once the drift, the barrier and the turnover target interact. So simulate it.
The simulation
import numpy as np
def simulate_bonus(deposit=100.0, bonus=100.0, rollover=30, house_edge=0.03,
bet=1.0, n_players=200_000, seed=42):
rng = np.random.default_rng(seed)
turnover = (deposit + bonus) * rollover
n_bets = int(turnover / bet)
p_win = (1 - house_edge) / 2 # even-money bet carrying the stated edge
bal = np.full(n_players, deposit + bonus)
alive = np.ones(n_players, dtype=bool)
for _ in range(n_bets):
if not alive.any():
break
draw = rng.random(n_players) < p_win
bal = np.where(alive, bal + np.where(draw, bet, -bet), bal)
alive &= bal > 0 # ruin is absorbing
completed = alive
comp_rate = completed.mean()
mean_final = bal[completed].mean() * comp_rate if completed.any() else 0.0
return {
"turnover_required": turnover,
"completion_rate": comp_rate,
"mean_balance_of_completers": bal[completed].mean() if completed.any() else 0.0,
"expected_final_balance": mean_final,
"house_ev_per_bonus": deposit - mean_final,
"effective_bonus_cost": comp_rate * bonus,
}
for k, v in simulate_bonus().items():
print(f"{k:28} {v:>12,.4f}")
Output:
turnover_required 6000.0000
completion_rate 0.5263
mean_balance_of_completers 77.5836
expected_final_balance 40.8299
house_ev_per_bonus 59.1701
effective_bonus_cost 52.6300
Reading the result
| Quantity | Naive estimate | Simulated |
|---|---|---|
| Bonus cost | $100.00 | $52.63 |
| Completion rate | assumed 100% | 52.63% |
| Mean balance of a completer | $20.00 | $77.58 |
| House profit per bonus | $80.00 | $59.17 |
Two things are worth sitting with.
Completers finish with $77.58 on average, not the $20 the drift calculation predicts. That is survivor bias, and it is not a modelling artifact. Conditioning on having never hit zero across 6,000 bets selects for players who ran above expectation, so the ones who make it to the cashout are systematically the ones who cost you most. The players who cost you the most are, by construction, the only ones who get paid.
Busted players placed 4,537 bets on average before running out. They did not fail at the start. They got roughly three quarters of the way through a 6,000-bet requirement and then hit zero, having generated real turnover the whole time.
Where the term structure bites
The completion rate is the lever, and it is extremely sensitive to terms you might change casually.
| Rollover multiple | Required turnover | Direction of completion rate | Direction of bonus cost |
|---|---|---|---|
| 10x | $2,000 | much higher | approaches face value |
| 20x | $4,000 | higher | rises |
| 30x | $6,000 | 52.63% (simulated) | $52.63 |
| 40x | $8,000 | lower | falls |
| 50x | $10,000 | much lower | approaches zero |
Raise the multiple and your bonus gets cheaper, because fewer players survive. That is exactly why rollover inflation is a race to the bottom in the category. It reduces cost by reducing the number of customers who ever experience the benefit, and the players who notice are the ones with the highest lifetime value.
The house edge moves it just as hard in the other direction. A 2% edge instead of 3% cuts the drift by a third and pushes far more players across the line. Operators who change eligible game weighting without rerunning the model are changing bonus cost without knowing it.
What to do with this
Rerun the simulation whenever any term changes: match percentage, rollover multiple, eligible game weighting, minimum bet, expiry window. All five move the completion rate, and the completion rate is the cost.
Book the liability at the simulated cost, not face value, and state the assumption explicitly. Finance will want a conservative number. The honest version is the simulated cost plus a stated confidence interval, which you get free by rerunning across seeds.
Do not optimise the completion rate toward zero. A bonus nobody clears is cheap and worthless. The point of the model is to choose terms where the cost is known, not to make the cost disappear.
The same path dependency shows up anywhere a reward requires sustained behaviour before it pays out. A streak is the same instrument with days instead of bets. So is a loyalty tier with an annual qualifying window. In each case the interesting number is not the reward, it is the fraction of people who reach it.
Get the Promo & Bonus Economics Workbook
Every formula for pricing a promo before you launch it: expected value, wagering cost, breakage, breakeven conversion. Worked examples with real executed numbers.
Browse all free guides →Want to implement this with guidance?
Santosh helps founders turn insights like this into real systems.
External Resources
Further Reading & Tools
Investopedia — Financial Engineering
Reference on the field, its three pillars, and its primary applications
CFA Institute — Refresher Readings
Curriculum material on derivatives valuation, probability, and risk measurement
QuantLib
Open-source quantitative finance library, reference for how pricing models are structured
arXiv q-fin
Preprints in quantitative finance covering pricing, risk management, and market microstructure