TL;DR
- A rating is three numbers, not one. Glicko-2 tracks the rating itself, how uncertain that rating is (rating deviation, RD), and how erratic recent results have been (volatility, σ). Every team and player carries all three.
- Only real match results move it. Beating a stronger opponent moves a rating further than beating a weaker one, and each move scales with how surprising the result was and how uncertain the two sides were going in.
- Community signals never move it. Sentiment, discussion, and the Pulse feed sit alongside the ladder as a separate, read-only narrative layer. Nothing a crowd says changes a number.
- It refreshes on a short cycle. A completed match is normally reflected within about fifteen minutes. Every run replays the season from the starting values rather than patching yesterday's answer, so a corrected result heals itself on the next cycle.
- Uncertainty is shown, not hidden. A team with an RD above 200, or fewer than five rated matches, is provisional: it appears in a separate provisional band instead of taking a rank on the ladder. Inactivity widens the uncertainty — it never lowers the rating.
- We publish how accurate it is. The rating report scores every win probability the engine has implied against what actually happened, and each match page shows what that specific match was worth to both sides.
Everything below is the long version.
Glicko-2 overview
Glicko.app is built on Glicko-2, a rating system developed by Mark Glickman that extends the classic Elo model with two additional dimensions: rating deviation (RD) and volatility. These extra dimensions let the engine express confidence in a rating, not just its central estimate.
It has a lineage. Glicko-2 is the successor to Glickman’s original Glicko system, published in 1995, which itself improved on the rating system Arpad Elo built for the US Chess Federation and which that federation adopted in 1960. Each step added a way to say how much the number should be trusted.
The algorithm was originally designed for chess but is game-agnostic. Today we apply it to Valorant; the engine is built to extend to other titles on the same terms, so ratings will be structurally consistent across games as they ship — even though absolute values are not comparable between titles.
Rating components
Every team and player carries three values that are updated together after each completed match:
Rating
The central performance estimate. Starts at 1500 for every new entrant. Increases after wins against strong opponents, decreases after losses. The magnitude of the change scales with how surprising the result was.
Rating deviation
How uncertain the rating is. Every entrant starts at 350 and narrows as results accumulate; idle time widens it again. Think of the true rating as lying within roughly two RD of the displayed value. Above 200, the rating is treated as provisional.
Volatility
How erratic the team’s or player’s performance has been. Everyone starts at 0.06. High volatility means results have been inconsistent; the engine responds to upsets more quickly for high-volatility entrants and more slowly for stable ones.
Those three values belong to each team and player. One constant sits above them and is the same for everyone:
System constant — 0.5
Tau constrains how far a rating’s volatility is allowed to move in a single period. It is what stops one shock result from convincing the engine that a steady team has become erratic. We run it at 0.5 for every team and player, in every game and every tier — it is a fixed constant of the system, not a dial we tune per event.
Rating and RD are read together. The same rating means different things depending on how sure of it we are:
| Combination | Illustrative example | What it means |
|---|---|---|
| High rating, narrow RD | 1900 ± 45 | Proven at this level. The engine has seen enough results to be confident, and they were good ones. |
| High rating, wide RD | 1850 ± 180 | Promising but unproven. A strong record so far, on too few matches for us to be sure it holds. |
| Low rating, narrow RD | 1400 ± 50 | Consistently mid-table. Plenty of evidence, and it points at a settled level rather than a slump. |
| Low rating, wide RD | 1350 ± 250 | New or long inactive. Above 200 RD the rating is provisional, so this team sits in the provisional band rather than taking a rank on the ladder. |
The example pairs are illustrations of the four shapes, not observed values.
r′ = r + q·Δ (new rating)
RD′ = √(RD²_pre + σ²) (deviation, pre-period)
RD″ = 1 / √(1/RD′² + 1/v) (after match results)Where q is a scaling constant, Δ is the performance delta, v is the estimated variance, and σ is volatility. Full derivation: Glickman (2012).
Rating ranges & what they cover
Every rating on the site is published with a range, not just a number. The range is rating ± RD — the rating deviation defined above — with a wider ± 1.96 RD available on hover. It is the honest form of the number: a rank that sits inside another team’s range is a rank our evidence does not defend.
We checked whether that range means anything rather than assuming it does. Freezing every team’s rating and range at each point in the season, then looking at where the rating actually was ten matches later:
| Range | Claims | Measured |
|---|---|---|
| ±1 RD | 68% | 75.8% |
| ±1.645 RD | 90% | 93.6% |
| ±1.96 RD | 95% | 97.3% |
Measured on 3,032 checkpoints from the live engine: freeze a team’s rating and range, then check where the rating actually was 10 matches later. Every row covers MORE than it claims, so the range errs wide rather than narrow.
The range is drawn symmetrically, but the moves are not: over the next 10 matches a rating drifts UP by about 0.21 of its own range on average. So the centre of the range is, slightly, a pessimistic guess.
Two things follow, and both are worth stating plainly. The range is wider than it needs to be — it covers more than it claims at every width — and we have left it that way rather than tightening it to hit the textbook figure. And it is not a bootstrap: resampling would only re-derive the sampling error the RD already encodes, and would miss the part that actually moves a rating, which is a team genuinely getting better or worse.
Where a cross-circuit position comes from
Ranges answer “how sure are we of this number”. They do not answer “how did this team end up above a team from another circuit”, which is a different and weaker claim. Circuits play each other a handful of times a year, so most teams have never been measured against another circuit at all. Rankings rows therefore carry one of three markers:
- Direct — the team has played teams from another circuit inside the last 12 months. Its position against those circuits is measured.
- Inferred — it has not, but it shares opponents with a team that has, so its position is inferred along that chain. The number of steps is shown as provenance, not as a confidence score: we measured no accuracy penalty for longer chains.
- No cross-circuit evidence — it has not played across circuits and does not connect to a team that has. Where it sits relative to the other circuits is an assumption we make about its circuit, not a result it earned. We show the marker, and on the Global view we also apply a disclosed adjustment (see “The global board” below) — the marker says how a position is supported, the adjustment says how it was computed. They are complements; nothing is adjusted quietly.
Update cycle
The rating job runs on a short cycle — roughly every 15 minutes in production — and writes fresh r / RD / σ values for every rated team. A match that finishes is normally reflected on the leaderboard within minutes, rather than waiting for a nightly batch.
Each run is a full replay, not an incremental patch: the engine starts every team from the same seed values and walks the season’s completed matches in order. That is deliberate — it means the published rating is always a clean function of the current match record, so when a result is corrected upstream the rating self-heals on the next cycle instead of carrying the error forward.
Ratings are scoped to the current season. Matches played before the season boundary are not carried into the rating, which is why a team that dominated a previous year still has to re-establish itself each season. The cadence is operator-configurable and a run can also be triggered by hand.
Rating decay
Glicko-2 handles inactivity by widening the rating deviation over time. When a team or player has not played for an extended period, their RD grows toward its starting value. This means a historically strong team that has gone inactive will show a wider confidence interval, signaling that their current strength is uncertain — not that they have become weaker.
RD inflation is continuous, not a discrete calendar step: it widens in proportion to the time elapsed since an entrant’s last match. We measure that gap against a rating period of roughly 4.67 days (derived from the Lichess periodsPerDay constant), so the longer the idle stretch, the wider the confidence interval grows.
Decay touches the deviation only. The rating and the volatility are left exactly where the last real result put them — nothing about sitting out changes what we believe a team’s strength was, only how sure we are that the belief still holds. A long enough idle stretch pushes RD back above the provisional threshold, at which point the team drops out of the ranked ladder and into the provisional band until it plays again.
Data sources
Match data is assembled from several publicly available upstream feeds and normalised into a single schema before the rating engine reads it. The feeds are ranked field by field, not merged blindly: every reconciled field carries its own explicit priority list, and when two feeds disagree the higher-ranked one wins. That ordering lives in code, so it is applied the same way every time rather than being decided case by case.
| Category | Games | Notes |
|---|---|---|
| Official publisher & league data | Valorant | Riot’s published competitive data — schedule, results, league structure, and the contracted-roster record. It leads the authority order on the fields it owns best: team identity, scheduling, match status, and contract/roster detail all resolve to the official value when one exists. |
| Public community databases | Valorant | Publicly maintained esports result databases. They cover events the official feeds don’t publish and carry the per-map and per-player detail the official feeds omit. On team identity and scheduling they rank below official data; on the handful of fields the official feeds describe less precisely — series format, player in-game names — they are the ranked authority instead. |
| Public news & discussion | All | Articles, forum threads, and community posts. Read for sentiment and narrative only, never for results. Entity-tagged by a language model and linked to teams and players via ContentTag. |
| Public video feeds | All | Titles, descriptions, and comments from public esports video channels; sentiment-analysed on the same path as news. |
Only the first two categories can move a rating, and only the first two are treated as a record of what happened. Everything in the bottom half of the table feeds the narrative layer described below and is structurally incapable of changing a number.
Glicko.app is an independent project. It is not affiliated with, endorsed by, or licensed by any publisher, league, or upstream source, and every feed it reads is one those sources publish publicly.
Community signals & Pulse
Beyond match ratings, we surface a Pulse feed of community signals — concise narrative moments derived from sentiment, match scores, news coverage, and public community discussion. Pulse sits alongside the leaderboard as a separate narrative layer: it captures what people are talking about, not just who is winning.
Signals are classified into 29 archetypes — TEAM_MOMENTUM, SENTIMENT_SWING, UPSET, ROSTER_CHANGE, TOURNAMENT_MILESTONE, REGION_SHIFT, PLAYER_BREAKOUT, HEAD_TO_HEAD, EVENT_PREVIEW, COMEBACK, FREE_AGENCY, BRACKET_FINALIZED, QUALIFICATION_CLINCH, VIRAL_TAKE, FAN_OUTCRY, HYPE_WAVE, DIVIDED_COMMUNITY, FORUM_DEBATE, MEME_MOMENT, BOARD_MOVE, FORM_DECAY, CALL_SETTLED, WIN_STREAK, RATING_RECORD, ROSTER_MOVE, BENCHING, CONTRACT_EXPIRING, ORG_CONFLICT, and STORYLINE_BEAT — and ranked by an importance score that combines normalised magnitude, community upvote rank, and freshness.
Signals are read-only: they do not move Glicko ratings. They are auditable, too — each signal links back to the underlying piece of content it was derived from, so a claim can always be traced to the thing that was actually published.
Cross-game comparisons
The Glicko-2 engine uses the same initial values and scale regardless of game, so the shape of ratings will be consistent as additional titles ship — a rating of 1800 will mean "significantly above average" in every game. Absolute numbers will not be directly comparable across games, though: when a second title launches, a Valorant team rated 1800 cannot be said to be "as good" as a team rated 1800 in that other game because match pools, activity levels, and team counts differ.
Within a single game, ratings are directly comparable inside a circuit — VCT teams against VCT teams, Challengers against Challengers — and per-circuit ranks are computed on those raw ratings. Across circuits the evidence is thinner: the circuits play each other only a handful of times a year. The Global view therefore ranks circuits head-to-head on an adjusted scale — described in the next section — rather than pretending the raw numbers line up. Percentile ranks and leaderboards are always scoped to a single title.
The global board (cross-circuit)
The Global view ranks every circuit head-to-head on one adjusted score. Each circuit has a level — where its ladder sits once the circuits are anchored to the cross-circuit matches that do happen — and a weight between 0 and 1. A team’s global score starts at its circuit’s level and moves toward the team’s own rating by that weight:
global = level + weight × (rating − level)A weight of 1 passes a circuit’s ratings through untouched; a smaller weight means points earned against that field count for less on the global scale — a strength-of-schedule weighting.
The weights, and where each one comes from — because part of this is measured and part is our judgement, and we will not blur the two:
- Fitted from results: the Challengers weight (0.527) and the Game Changers weight (0.382), estimated by maximum likelihood on 430 real cross-circuit matches across three seasons. Out of sample, the weighted board predicts those cross-circuit matches better than the unadjusted board. The fit was computed before any board was assembled; the check that the resulting board looked right came after.
- Stated judgement: VCT’s weight of 1 (a definition — everything is measured relative to VCT); the weight for teams outside the three circuits (set equal to Game Changers’); and a guard on the Challengers weight, which we keep between 0.43 and 0.575. The lower bound keeps the top of the board reachable by play; the upper bound is an editorial call about the top of the board that the data alone does not decide. If a future refit pushes against either bound, we will say so here and on the board itself — the guard is disclosed, never a silent clamp.
This is the same blend of team strength and league strength that Riot’s Global Power Rankings use — think of it as an improved Global Power Rankings for the whole scene: every rated team in every circuit, with the weights fitted where the data can decide and published either way.
Three properties worth stating plainly. First, the map pulls toward a circuit’s level from both sides: a rating below its circuit’s level is pulled up as well — losses against a weaker field also count for less. It is a re-scaling, not a cap: within a circuit, order is always preserved, and no rating is ever clamped. Second, for a team ranked against another circuit the dominant uncertainty is not its ± band but the weight itself — the fitted weights carry wide confidence intervals, so a cross-circuit position can move more at a refit than from a match. Third, a team’s circuit label is itself recomputed from its recent schedule, so a relabelled team’s global score can jump without a match being played; when that happens the board carries a dated change note rather than smoothing the jump away.
One level deeper sits regional strength. Within a circuit, regions mostly play among themselves, so the machinery for per-region level offsets exists but ships dormant — every offset is zero, and the published board is identical to the no-offset board — because today’s cross-region evidence cannot yet price those offsets. At the VCT level, league strength is largely priced through international play itself; the exception under audit is China, where early evidence says the engine over-rates Chinese VCT teams at international events. If that audit confirms, any correction will be disclosed here before it moves a rank.
Tier system
Glicko organises Valorant competition into four tiers: VCT (Tier 1 — the top international league and its regional Americas, EMEA, Pacific, and China stages), VCL (Tier 2 — the Challengers regional leagues that feed into VCT), Game Changers (the women's and marginalised genders circuit), and Tier 3 (the broader open and community circuit).
A team’s tier is resolved by a fixed ladder of signals, each consulted only when the one above it does not fire. An explicit operator override wins outright. Failing that, a team that appears on the franchise-league roster and is confirmed against the contracted-roster record is Tier 1 — both conditions are required, so a relegated org does not linger on T1. Failing that, the team’s league assignment decides it (a Game Changers league gives GC; a Challengers or Ascension league gives Tier 2). Failing that, the team’s own recency-weighted tournament participation decides it — the tiers of the events it has actually played, weighted so recent results count far more than old ones. That rung is what keeps a genuine pro team with no league record on file, but a real history of top-flight matches, from being filed at the bottom. Only a team with no usable signal at any rung falls through to Tier 3. Academy and affiliate rosters are held out of the franchise and participation rungs so they never inherit a parent org’s tier.
Tiers group the ladder; they do not cap the number. The public rating applies no tier ceiling — a Tier 2 team that beats Tier 1 opposition keeps the full rating it earned. What tiers do is decide which ladder you are ranked on: each circuit keeps its own ladder, ranked on raw ratings, and the Global view ranks all circuits together on the adjusted scale described above. Cross-tier results still update ratings normally.
Leaderboard sort order
Team leaderboards sort by raw rating — the pure-Glicko number shown on the team detail page — inside each circuit: VCT, Challengers, and Game Changers each rank their own ladder. The Global view instead ranks every circuit head-to-head on the adjusted score described in “The global board” above. Open and community (Tier 3) teams are outside the rated pool entirely; the engine only processes matches where both sides and the event belong to those three circuits.
Teams the engine has flagged provisional — an RD above 200, or fewer than five rated matches — are held out of the ranked ladder rather than penalised in the sort. They appear in a separate provisional band, collapsed behind a toggle, with a dash instead of a rank and the rating carrying its ± RD and an asterisk, so the ladder stays readable without distorting any one team’s number.
Player rankings sort by lower-bound rating (rating − RD), not raw rating. This penalises high-uncertainty entrants and rewards consistent performance over flash-in-the-pan runs. Player ratings are also the one place individual performance is weighted directly: a player’s share of the credit for a map scales with how they performed on it relative to the other nine players in that lobby, rather than everyone on the winning side taking the same amount.
For example, for players: one with rating 1850 and RD 200 (after 5 matches) has a lower bound of 1650. One with rating 1750 and RD 50 (after 200 matches) has a lower bound of 1700. The second player ranks higher even though their raw rating is lower.
This is intentional. It matches how confidence intervals work in any statistical estimator — we list the conservative read. In every case the raw rating is still displayed on the detail page.
Accuracy & the rating report
A rating system should be judged on whether its predictions come true. Before every rated match the rating implies a win probability, and we keep those predictions and score them against the real results. The rating report publishes that measurement in public: a reliability diagram (do our 65% picks win 65% of the time?), the standard scoring metrics, the uncertainty spread across every rated team, and the all-time rating records.
That page is measurement only — it reports on the model and never retunes it. Its numbers come from values the engine already stored when it rated each match, so what it reports is exactly what the leaderboard was built from. Records there exclude provisional, not-yet-converged ratings and state the exact history window they cover, because “all-time” is only honest when the window is named.
The same accounting is available one match at a time. Every rated match page shows what that match was worth: the rating and rank each side carried into it, and the rating and rank they came out with. Those values are frozen at the moment the match was rated, so the card keeps reading “what this result was worth when it happened” even though the engine replays the season on every cycle.
Limitations
- Team ratings reflect series outcomes only — map scores and individual player stats are not factored into the team update. (Player ratings do weight individual per-map performance; team ratings do not.)
- Ratings are scoped to the current season. Results from before the season boundary are not carried into the number, so early-season ratings are thinner than they look.
- Roster instability is not modelled. A team that replaces all five players carries the same rating as before, which may overstate or understate true strength during transition periods.
- Very new teams have high uncertainty (wide RD) and can appear misleadingly high or low after only a few results. That is what the provisional band is for.
- Only the three professional circuits are rated. Open and community teams are outside the rated pool, and data completeness varies by region and tier even inside it.
Questions or data corrections? [email protected]