Leaderboards That Do Not Drive Off 95% of Your Players
On a global leaderboard of 1,000 players with 10 prizes, 5% have a realistic shot at winning. Split the same field into brackets of 10 and it becomes 48.7%, with no change to the prize budget. Simulated across 4,000 seasons.
Table of contents
Tournament theory has known since the 1980s that effort collapses when a competitor's probability of winning approaches zero. A player who cannot win does not try harder. They stop playing.
Most leaderboards are built as a single global ranking, which guarantees that outcome for almost everyone in the field.
The short answer
On a global leaderboard of 1,000 players where the top 10 win, only 5% of players have at least a 5% chance of winning. The median player's win probability is 0.05%. Split the same 1,000 players into 100 brackets of 10 with one winner each, keeping the prize count identical, and 48.7% of players clear that same 5% threshold. The median player's chance rises from 0.05% to 4.73%.
Why a global leaderboard is a churn mechanic
A leaderboard is a contest, and a contest allocates effort according to the marginal return on that effort. If you are ranked 640th and the prize goes to the top 10, no plausible amount of additional effort changes your outcome. The rational response is to disengage, and the leaderboard has spent every day since launch reminding you of that.
The design is a daily, personalised notification of futility delivered to the majority of your users. It is difficult to think of another product surface that would survive that description.
The simulation
Give 1,000 players a latent skill drawn from a standard normal. Each season, observed score is skill plus noise, so outcomes are neither pure skill nor pure luck. Run 4,000 seasons under two structures with identical prize counts.
import numpy as np
def leaderboard_sim(n_players=1000, noise=1.0, trials=4000,
global_winners=10, bracket_size=10, seed=42):
rng = np.random.default_rng(seed)
skill = np.sort(rng.normal(0, 1, n_players))
wins_global = np.zeros(n_players)
wins_bracket = np.zeros(n_players)
n_brackets = n_players // bracket_size
for _ in range(trials):
score = skill + rng.normal(0, noise, n_players)
top = np.argpartition(-score, global_winners)[:global_winners]
wins_global[top] += 1
score = skill + rng.normal(0, noise, n_players)
order = rng.permutation(n_players)
for b in range(n_brackets):
idx = order[b * bracket_size:(b + 1) * bracket_size]
wins_bracket[idx[np.argmax(score[idx])]] += 1
return wins_global / trials, wins_bracket / trials
p_global, p_bracket = leaderboard_sim()
print(f"{'decile':>8} {'global':>10} {'bracketed':>12}")
for i in range(10):
lo, hi = i * 100, (i + 1) * 100
print(f"{i+1:>8} {p_global[lo:hi].mean():>10.4f} {p_bracket[lo:hi].mean():>12.4f}")
for label, p in (("global", p_global), ("bracketed", p_bracket)):
print(f"{label:>10}: {(p >= 0.05).sum():>4}/1000 players above 5%, "
f"median {np.median(p):.4f}")
Output:
decile global bracketed
1 0.0000 0.0019
2 0.0000 0.0069
3 0.0000 0.0147
4 0.0001 0.0253
5 0.0002 0.0389
6 0.0006 0.0598
7 0.0015 0.0884
8 0.0039 0.1350
9 0.0118 0.2140
10 0.0817 0.4151
global: 50/1000 players above 5%, median 0.0005
bracketed: 487/1000 players above 5%, median 0.0473
Reading the deciles
On the global board, deciles 1 through 5 have win probabilities that round to zero. Half the field has no measurable chance across 4,000 simulated seasons. Decile 7, which is well above average, sits at 0.15%.
Bracketed, the bottom decile has a 0.19% chance, which is small but no longer zero. The median player sits at 4.73%. Decile 7 is at 8.84%, roughly a one-in-eleven shot at winning something, which is a live proposition rather than a rounding error.
The top decile drops from 8.17% to 41.51%, which looks like the strong players gained. They did, in the sense that a strong player now reliably wins their bracket. What actually happened is that the same number of prizes got distributed across a far wider set of plausible winners.
Prize budget is unchanged. Ten winners globally, 100 bracket winners, so if you want identical spend the bracket prizes are a tenth the size. Whether that trade is right depends on whether you are trying to create ten highly motivated players or five hundred moderately motivated ones.
Brackets are one option among several
Random bracketing is the simplest fix and it is what the simulation tests. Others work on the same principle of shortening the distance between a player and a plausible win.
| Design | How it shortens the distance | Main cost |
|---|---|---|
| Random brackets | Field size drops from 1,000 to 10 | Winners are less impressive |
| Skill-matched brackets | Opponents are near your level | Needs a rating system, and sandbagging |
| Relative-improvement ranking | Compete against your own past | Weak players can win by starting low |
| Percentile tiers | Rewards for top 10% of each tier | Tier boundaries become gameable |
| Time-boxed seasons | Everyone resets to zero | Long-run progress feels erased |
The one design that reliably fails is the permanent, global, all-time leaderboard. It maximises the number of players who can see, precisely, that they will never win, and it never resets.
What to measure if you already have one
You do not need a simulation to check your own board. Take last season's results and compute, per player, the probability they would have finished in a winning position given their observed score distribution across previous seasons. If more than half your active players are under 1%, the leaderboard is functioning as a disengagement surface for the majority of the people who see it.
Then check the correlation between leaderboard rank and subsequent churn among players outside the prize positions. In most implementations it is the wrong sign, and nobody has looked.
The general principle
Every competitive mechanic allocates motivation according to perceived win probability. That probability is computable before you ship, from nothing more than field size, prize count, and how much of your outcome is skill versus variance. A design that leaves the median player at 0.05% is not a motivational tool. It is a very efficient way of telling most of your users that this part of the product is not for them.
Loyalty tiers have a similar structural flaw, and it hides better. A tier threshold looks like a target the customer is chasing, and the incremental spend it generates is real and measurable. What almost nobody measures is what the perk costs on the other side of the line.
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