← Back to Blog
Quantitative MarketingPromo EconomicsFinancial EngineeringPython

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.

SPSantosh Paudel· July 23, 2026· 10 min read
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

QuantityNaive estimateSimulated
Bonus cost$100.00$52.63
Completion rateassumed 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 multipleRequired turnoverDirection of completion rateDirection of bonus cost
10x$2,000much higherapproaches face value
20x$4,000higherrises
30x$6,00052.63% (simulated)$52.63
40x$8,000lowerfalls
50x$10,000much lowerapproaches 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.

Free resource

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.

No spam. Unsubscribe anytime.

Browse all free guides →

Want to implement this with guidance?

Santosh helps founders turn insights like this into real systems.

Promo Economics Audit

External Resources

Further Reading & Tools

Related Posts

01
9 min
Risk ManagementPromo Economics
TodayQuantitative Marketing

Value at Risk and Kill Switches for Live Promotions

A spend cap set at expected payout shuts down 46% of perfectly healthy campaigns. The right multiple is 1.52x. Sizing exposure limits and automated kill switches against a real payout distribution.

Read article
02
8 min
Incentive DesignBehavioral Economics
TodayQuantitative Marketing

The Line Between Motivating and Manipulating: An Incentive Design Ethics Test

Every mechanic in this series works because of a cognitive bias. That makes them powerful and makes some of them indefensible. A six-question test for which side of the line your design sits on, and what regulators have already acted against.

Read article
03
8 min
Price DiscriminationPricing
TodayQuantitative Marketing

Why Promo Codes Beat Sales: Price Discrimination in Practice

A blanket 20% discount earns $20,000 less than no discount at all. The same discount behind a code that only bargain hunters bother to find earns $64,000 more. The friction is the entire mechanism.

Read article