How we calculate EV

Methodology v1 · last reviewed 2026-05-19

Every bonus on Kaching gets a verdict — 🟢 GREEN, 🟡 YELLOW, or 🔴 RED — based on its expected value (EV): how much, on average, you'd end up holding after clearing the wagering requirement. We publish the formula so anyone can audit it.

1. The cap-aware EV formula

For a deposit bonus of face value B, wagering multiplier w, minimum deposit D, max cashout C, and average RTP r across the eligible game mix:

turnover = B × w
expected_loss_on_turnover = turnover × (1 − r)
raw_ev = B − expected_loss_on_turnover
capped_ev = min(raw_ev, C − D)
ev_value_usd = max(0, capped_ev)
ev_score = round(100 × ev_value_usd / B)   // bounded 0..100

The score maps to a verdict:

2. Worked example — a typical welcome bonus

Operator offers $100 deposit match, 30× wagering, $200 max cashout, min deposit $20, mostly slots (RTP ≈ 0.96).

B = 100, w = 30, D = 20, C = 200, r = 0.96
turnover = 100 × 30          = 3000
expected_loss = 3000 × 0.04  = 120
raw_ev = 100 − 120           = −20
capped_ev = min(−20, 180)    = −20
ev_value_usd = max(0, −20)   = 0
ev_score = round(100 × 0/100) = 0   → 🔴 RED

A typical welcome bonus is actually a slow drip of expected loss disguised as free money. We mark it RED even when we earn commission on it.

3. Worked example — a rare GREEN

No-deposit free spins worth $50 face value, 10× wagering, $500 max cashout, slots:

B = 50, w = 10, D = 0, C = 500, r = 0.96
turnover = 50 × 10           = 500
expected_loss = 500 × 0.04   = 20
raw_ev = 50 − 20             = 30
capped_ev = min(30, 500)     = 30
ev_value_usd = max(0, 30)    = 30
ev_score = round(100 × 30/50) = 60   → 🟡 YELLOW

Even a no-deposit promotion lands YELLOW once wagering eats the edge — true GREEN requires w ≤ 5 and a sane cap.

4. What we deliberately don't model

5. Why open this up

Most affiliate sites publish a star rating with no math behind it. We think the reader should be able to recompute the verdict from the published bonus terms. If the formula above gives a different answer for a specific listing, the "Report inaccuracy" link on every bonus detail page sends a structured report to our review queue.

Source code for the calculator: packages/ev-calculator in our monorepo. Verdict thresholds: scoreToVerdict() (GREEN ≥ 70, YELLOW ≥ 40, RED < 40).