All posts
Under the hood

Trophies, ELO and XP: the honest machine behind your rank.

Every time a match ends, a number moves. Here's the whole mechanism that decides how much — chess math from the 1960s, a hidden rating, and a player-facing number we work hard to keep fair. Nothing hidden.

A cheering arcade cat beside a gold trophy and a rising staircase of coin stacks.

Win a match and your trophy count climbs. Sometimes it leaps; sometimes it barely twitches. Sometimes you win and the reward feels almost insulting. None of that is mood or randomness — there's a small, well-behaved machine deciding exactly how much your rank should change, and it has been running quietly in the background of competitive games for sixty years. This is the whole thing, taken apart on the table.

01Two numbers, one engine

Every Quizzer player actually carries two skill numbers, not one. There's ELO — a hidden, internal rating used to find you a fair opponent — and there are Trophies, the number you actually see on your profile and the leaderboard. They are not really separate systems. They're the same engine read off two different dials.

Trophies are the player-facing skill rating and the competitive leaderboard value. Players never see ELO terminology; the backend keeps a standard ELO rating internally and trophies move with it. — Quizzer game design principles

The two numbers change by the same amount after every match. The only differences are where they start and a single protective rule at the bottom. Internally, every player begins at an ELO of 1600. On the dial you see, every player begins at 0 trophies. From then on, they rise and fall in lockstep.

02The formula

The math is textbook ELO — the same system chess has used since 1960. For a single player in a match, it's two lines:

// win probability the rating gap predicts expected = 1 / (1 + 10 ^ ((opponentRating playerRating) / 400)) // move toward the truth by however much you beat the prediction newRating = max(0, round( oldRating + 32 × (actual expected) ))

Three constants do all the work: a K-factor of 32 (the biggest swing any single match can produce), the classic divisor of 400, and a starting rating of 1600. The actual term is simply your result from your own point of view — 1.0 for a win, 0.5 for a draw, 0.0 for a loss.

The whole idea lives in that last line: your rating moves by how you actually did minus how you were expected to do. Beat the expectation and you gain; fall short and you lose. Which leads to the part that feels intuitive once you see it:

Try itThe match calculator
you favored even opp favored 50/50
Win chance50%
Rating change+16

It's perfectly symmetric. In a 1-vs-1, each side's calculation is run independently against the other player's pre-match rating, so the points one player gains mirror what the other side's math hands back.

03Why you start at zero

If the internal rating starts at 1600, why does your trophy count start at 0? Because trophies are defined as “how far above the baseline you've climbed.” When the system seeds a player, it uses exactly that:

trophies = max(0, elo 1600)

A brand-new player sits at ELO 1600 and therefore 0 trophies. Win a few games and both numbers rise together, the trophy count trailing the ELO by that fixed 1600-point offset. It's the same line on the same graph — just relabelled so the number you see starts at a satisfying, honest zero.

04The floor that protects your number

Here's the one place the two dials deliberately disagree, and it's the most considered decision in the whole system. Trophies can never drop below zero. Internal ELO, however, keeps falling on a loss even when your visible trophies have already hit the floor. That gap is on purpose: it keeps matchmaking honest while protecting the number you care about.

At the floor, worked out
A

A player sitting at 0 trophies loses a match worth −16. Their trophies stay at 0; the result screen shows a delta of 0. Behind the curtain, their hidden ELO still drops the full 16.

B

A player at 10 trophies loses −16. Trophies land on 0, and the displayed delta is −10 — clamped to what they actually had, not the full −16.

Try itThe floor in motion
After the match: 120 trophies
On your screen
-12
Hidden ELO
-16
Clamped — you'd have dropped 4 more, but trophies stop at 0.

So near the bottom of the ladder, your visible trophy losses can be gentler than your true rating losses. Anywhere above the floor, the two move in perfect step: trophy delta equals ELO delta, exactly.

05When the numbers actually move

Ratings change at exactly one moment: a match completing — either both players finishing, or a forfeit. When that happens, the backend does the whole update inside a single, all-or-nothing transaction:

It all runs at the strictest isolation level the database offers, with automatic retries, so two opponents finishing at the very same instant can never corrupt each other's update. Your rating change is atomic: it either happens completely or not at all.

06What doesn't count

It's worth being clear about what cannot tilt the math, because this is where a competitive system earns trust. There are no multipliers. Power-ups never touch the rating calculation:

The only three inputs to a rating change are your ELO, your opponent's ELO, and the result: win, lose, or draw. Nothing you can buy, and nothing you can spend, bends that curve.

07Where the number shows up

You'll only ever meet the trophy side of the machine. The leaderboard is sorted by trophies, highest first. Your profile shows your trophy total. The match result screen shows the journey — trophies before, trophies after, and the delta between them. The word “ELO” appears nowhere in the app.

There are no named leagues or tiers stacked on top. The one tier-like idea is a simple global rank decile — “you're in the top 10%, 20%, and so on” — computed straight from where you sit in the standings:

decile = clamp( ceil(rank / totalPlayers × 10) × 10, 10, 100 )

08XP and levels: the other track

Running alongside all of this is a second, completely separate progression — and it's separate by design. Where trophies measure skill and can fall, XP measures time invested and only ever goes up. You earn it just for showing up and finishing:

base completed game = +100 XP win bonus = +25 XP → a win = 125 XP, a loss or draw = 100 XP

Your level isn't stored anywhere — it's derived from your total XP whenever it's read. The amount needed to reach the next level grows in a straight line, so each level asks a little more than the last:

xpForNextLevel(level) = 1000 + level × 100
TransitionXP needed
Level 1 → 21,100
Level 10 → 112,000
Level 50 → 516,000
Level 100 → 10111,000
Try itXP & level explorer
Level6
Total XP6,825
Lv 6
Lv 7
325 / 1,600 XP to next level · 33W 27L
Lv 1 higher levels →

The split is the whole point. Trophies are zero-sum and can drop — they answer “how good are you right now?” XP and levels are monotonic — they answer “how much have you played?” Neither one pretends to be the other.

09The questions have ELO too

One last, slightly delightful detail: players aren't the only things with a rating. Every question carries its own ELO — same K of 32, same 1600 starting point — to measure how hard it really is. It updates on every answer, with the result flipped relative to the player:

From that self-calibrating number we read the difficulty you see on the card — earned from thousands of real attempts rather than an author's guess:

Easy · below 1450 Medium · 1450 – 1750 Hard · above 1750
The one-paragraph version

Quizzer rates players with a hidden, standard ELO — start 1600, K-factor 32, divisor 400. Every 1-vs-1 match produces a delta from the two players' pre-match ratings and the win / lose / draw result, with no power-up multipliers anywhere. That same delta moves a player-facing trophy count, which starts at 0 and is floored at 0 — and at that floor, displayed losses are clamped while the hidden ELO keeps dropping, so matchmaking stays accurate. Trophies drive the leaderboard and every visible rank. A parallel, non-competitive track grants +100 XP per game (+25 for a win) and derives levels from total XP on a gently rising curve. And the questions carry their own ELO, so difficulty calibrates itself.