Skip to main content
Documentation

ELO & Ranking System

A complete guide to how ratings work, why they change the way they do, and how to configure them for your server

How ELO Works

ELO is a rating system originally created for chess. The core idea is simple: beating strong players proves more than beating weak players. Your rating goes up when you win and down when you lose, but how much it changes depends on who you played against.

The Basic Idea

Before every match, the system calculates an expected outcome based on the rating difference between the two sides. If you're rated much higher than your opponent, the system expects you to win. If you do win, your rating barely moves because the outcome was predictable. But if you lose, your rating drops a lot because it was a surprise.

The reverse is also true — if you're the underdog and pull off an upset, you get a big rating boost.

The Formula

You don't need to memorize this, but it helps to understand why ratings change the way they do. Two steps:

Step 1 — Expected Score:

Expected = 1 / (1 + 10 ^ ((opponent_rating - your_rating) / 400))

Step 2 — Rating Change:

Change = K × (actual - expected)

"actual" is 1 for a win and 0 for a loss. "K" is the K-Factor (explained below).

The 400 in the formula sets the scale — a 400 point rating difference means the higher-rated player is expected to win about 91% of the time.

Show Me the Numbers

Here's what actually happens with default settings (K-Factor 20, starting ELO 1200). These are the exact numbers the bot calculates:

ELO change examples
Your ELOOpponent ELOIf You WinIf You LoseWhat This Means
12001200+10-10Even match — fair trade
12001400+14-6Underdog — more to gain, less to lose
14001200+6-14Favored — less to gain, more to lose
1500900+2-18Heavy favorite — almost nothing for winning
9001500+18-2Massive underdog — huge reward for the upset
1600800+1-19Farming territory — literally +1 per win

Key takeaway: The bigger the rating gap, the less a favored player gains from winning. A 1600 player beating an 800 player gains just 1 point. But if they lose? They drop 19. The system makes farming weaker players a bad strategy.

Team Matches (2v2, 3v3, 5v5)

In team modes, the ELO calculation uses the average rating of each team. If Team 1's average is 1400 and Team 2's average is 1100, every player on Team 1 is treated as the "favored" side and every player on Team 2 is the underdog — regardless of individual ratings.

Example — 2v2 where a duo farms weaker players:

Team 1: Jack (1600) + Pesta (1500) = avg 1550

Team 2: Player A (1100) + Player B (1000) = avg 1050

Rating gap: 500 points

If Jack & Pesta win: each gets +1 to +2 ELO

If Player A & B pull the upset: each gets +18 to +19 ELO

The duo gains almost nothing from stomping weak players. They'd need to win 10 games to get what one even match would give them.


Real Scenarios

These are the situations server owners ask about most. Here's how the ELO system handles each one.

"Two good players are duo-queuing and stomping everyone"

The ELO system naturally punishes this. When high-rated players consistently beat low-rated players:

  • They gain almost nothing per win (+1 to +3)
  • The weak players they beat barely lose anything (-1 to -3)
  • If the duo ever loses, they drop a lot (-15 to -19)
  • Their ELO will plateau because wins give so little, and any loss is devastating

Meanwhile, players who solo queue against evenly-matched opponents gain +10 per win — five to ten times more per game. Over a season, consistent solo queue players earning +10/game will outpace duo farmers earning +1/game.

"A new player is clearly better than 1200 but it's taking forever to climb"

This is what the provisional period fixes. New players start with a higher K-Factor (default 40 vs 20), so their rating moves twice as fast for the first few games. You can make this even more aggressive:

  • Increase the provisional K-Factor to 50 or 60
  • Increase the provisional threshold to 15-20 games

This keeps new players in "calibration mode" longer, so they find their true skill level faster.

"Rankings feel stale — the same people are always on top"

You have several options:

  • Increase the established K-Factor (e.g., 25 or 30) — makes all ratings more volatile, so upsets matter more
  • Enable seasons — periodic resets give everyone a fresh shot
  • Use soft reset — partial reset preserves some skill separation but compresses the leaderboard
  • Enable ELO Decay (Pro) — inactive players slowly lose rating, opening up the top spots

"Everyone is bunched around the same rating"

This usually means the K-Factor is too low or players haven't played enough games. In ELO, ratings spread out over time as stronger players win and weaker players lose. To speed this up:

  • Increase K-Factor — bigger swings per game = faster separation
  • Extend the provisional period — new players calibrate faster with higher K
  • Give it time — ELO needs about 20-30 games per player to produce meaningful separation

"We just want casual fun, not sweaty rankings"

Switch to Flat Mode. Everyone gains/loses the same amount per game regardless of opponent rating. It's simple, predictable, and doesn't punish people for losing to better players.

"Players are dodging matches they think they'll lose"

Remind them: the ELO system protects underdogs. If you're expected to lose, you risk very little rating (-2 to -6) and stand to gain a lot (+14 to +18) if you win. Dodging a match against a better player is actually giving up a great opportunity.


K-Factor: How Fast Ratings Change

The K-Factor is a multiplier that controls how many points are at stake in each match. Think of it as the "volatility dial" for your leaderboard.

  • Higher K = bigger swings per match = ratings change fast = more volatile
  • Lower K = smaller swings per match = ratings change slowly = more stable

Provisional vs Established

Every player starts as provisional (higher K) and becomes established (lower K) after playing a certain number of matches. This means new players find their true skill level quickly, while experienced players have more stable ratings.

K-Factor defaults
SettingDefaultRangeWhat It Does
Provisional K-Factor401-100ELO multiplier for new players
Established K-Factor201-100ELO multiplier for established players
Provisional Threshold51-50Number of matches before switching from provisional to established K (server-wide setting)

Same Match, Different K-Factors

To see the impact, here's the same 1200 vs 1200 even match with different K-Factors:

K-Factor comparison
K-FactorWinLossGood For
10+5-5Very stable, slow changes
20+10-10Default — balanced
30+15-15More volatile, faster calibration
40+20-20Default for new players
60+30-30Very fast calibration

K-Factors are configured per-queue from the web dashboard or with /setup. The Provisional Threshold is a server-wide setting configured in your server settings.


ELO Modes

Each queue uses one of two ELO modes, set during /setup or via the dashboard.

Standard / Dynamic (Default)

This is the mode described throughout this guide. Rating changes are calculated using the ELO formula — beating better players gives more, beating weaker players gives less. This is the recommended mode for competitive servers.

Flat Mode

Simple fixed gain/loss. Every win gives +X and every loss takes -X, regardless of opponent ratings.

  • Default amount: 25 per win (losses default to the same)
  • Wins and losses can be set separately — e.g., +25 for a win, -15 for a loss
  • Configurable via /setup flat-amount:25 flat-loss-amount:15 or the dashboard
  • Good for casual servers that want straightforward rankings
  • Downside: No protection against farming — a 1600 player beating an 800 player gets the same +25 as beating another 1600

Flat Provisional Bonus

Even in Flat Mode you can make new players calibrate faster by enabling a provisional bonus. During their first N games (configured by the server's Provisional Games setting), new players earn more points per win/loss. After the provisional period, they switch to the normal flat amounts.

  • Set via /setup flat-provisional-amount:40 or the dashboard queue settings
  • Provisional loss amount defaults to the provisional win amount, but can be set separately in the dashboard
  • Example: First 5 games earn +40/-40, then +25/-25 after
  • If not configured, flat ELO works exactly as before — same points for every game

If players are farming weaker opponents, make sure you're using Standard ELO mode, not Flat Mode. Flat Mode gives the same points regardless of opponent strength — that's what enables farming.


Server Owner's Tuning Guide

Every server is different. Here are recommended settings for common server types.

Competitive Server (Ranked Queues)

  • ELO Mode: Standard
  • Provisional K-Factor: 40-50
  • Established K-Factor: 20
  • Provisional Threshold: 10-15 games
  • Seasons: Enabled (4-8 week soft reset)
  • ELO Decay: Enabled (Pro)

Longer provisional period lets players calibrate. Seasons keep the ladder fresh. Decay prevents inactive players from camping top spots.

Casual / Community Server

  • ELO Mode: Standard or Flat
  • Provisional K-Factor: 40
  • Established K-Factor: 25-30
  • Provisional Threshold: 5 (default)
  • Seasons: Optional (8-12 week hard reset)

Higher established K keeps things exciting. Hard reset gives everyone a clean slate. Flat mode works if you don't care about farming.

Small Community (Under 20 Active Players)

  • ELO Mode: Standard
  • Provisional K-Factor: 50-60
  • Established K-Factor: 25-30
  • Provisional Threshold: 5-7 games
  • 1v1 Rematch Limit: 2 per 24h

Higher K across the board because fewer games are played. Rematch limit prevents the same two people from farming each other.

Large Tournament Server (100+ Players)

  • ELO Mode: Standard
  • Provisional K-Factor: 40
  • Established K-Factor: 16-20
  • Provisional Threshold: 15-20 games
  • Seasons: Enabled (4 week soft reset, factor 0.50)
  • ELO Decay: Enabled — 168 hours, -10 points

Lower established K for stability at scale. Long provisional period for accurate calibration. Active decay keeps the leaderboard competitive.

All Configurable Settings

All ELO settings
SettingDefaultEffect
Starting ELO1200Where new players begin (0-3000)
ELO ModeStandardStandard (dynamic) or Flat (fixed gain/loss)
K-Factor (Provisional)40Rating multiplier for new players
K-Factor (Established)20Rating multiplier for experienced players
Provisional Threshold5Games before switching from provisional to established K (server-wide)
Flat ELO Amount25Fixed points per win (Flat Mode only)
Flat ELO Loss AmountSame as winFixed points per loss (Flat Mode only); if not set, uses win amount
Flat Provisional AmountOffHigher points per win/loss during provisional period (Flat Mode only); if not set, all games use the same amount
MVP Bonus0Bonus ELO for MVP awards (0-100)
Rematch Limit0Max rematches within a time window (1v1 only)

Rank Tiers

Players are assigned a rank tier based on their ELO rating. Tiers are displayed on leaderboards, stats cards, and in the dashboard.

Default Tiers

Default rank tiers
TierMin ELOColor
Bronze0#CD7F32
Silver1000#C0C0C0
Gold1200#FFD700
Platinum1400#00CED1
Diamond1600#B9F2FF
Master1900#FF4500

Customizing Tiers

From the dashboard (Settings tab), you can:

  • Rename tiers — call them whatever fits your community
  • Change ELO thresholds — adjust min ELO for each tier
  • Change colors — pick any hex color
  • Add or remove tiers — have as many or few as you want
  • Assign Discord roles — optionally link a Discord role to each tier

Auto-Role Assignment

If you assign a Discord role to a tier, the bot automatically manages role assignment:

  • When a player's ELO crosses into a new tier, the bot removes the old tier role and assigns the new one
  • This happens after every match result, manual ELO change, and season reset
  • Use Sync Roles on the Players tab to bulk-assign the correct tier role to all registered players at once
  • The bot needs the "Manage Roles" permission for this to work

Role hierarchy required: The bot can only update nicknames and roles for users whose highest Discord role is below the bot's role. Go to Server Settings > Roles and drag the GotNext Bot role above all player and moderator roles.

Tier Promotion Announcements

When a player's ELO crosses into a new rank tier after a match, the bot announces the promotion in the match channel. This is enabled by default and can be toggled in the dashboard under Settings.

  • Only triggers on promotions (moving up), not demotions
  • Posted in the same channel as the match result
  • Toggle off in Settings if your server prefers less chat noise

ELO DecayPRO

ELO Decay prevents inactive players from sitting at the top of the leaderboard without playing. After a configurable period of inactivity, players slowly lose rating until they play again.

How It Works

  • If a player hasn't played for X hours (default: 168 = 7 days), they start decaying
  • Each decay tick removes Y points (default: 10) from their rating
  • Decay stops when the player's rating reaches the minimum ELO floor (default: 1200 / starting ELO)
  • Playing any match immediately stops decay and resets the timer
ELO Decay settings
SettingDefaultDescription
Inactivity Period168 hours (7 days)How long before decay starts
Decay Amount10 pointsPoints removed per decay tick
Minimum ELO1200Decay stops at this rating (prevents dropping to 0)

Enable ELO Decay from the dashboard under Settings > Season & Decay. Requires a Pro subscription.


Seasons

Seasons let you periodically reset the leaderboard so rankings stay competitive. When a season ends, all player standings are permanently archived and ELO ratings are reset. Past seasons are always viewable.

Quick Start

  1. Go to the Settings tab on the dashboard
  2. Choose a reset type (Hard or Soft) — this controls what happens to player ELOs when a season ends
  3. Optionally turn on Automatic Season Reset to end seasons on a schedule (1-12 weeks)
  4. You can always end a season manually with the End Season button or /season-reset confirm:true in Discord

Auto-reset vs Manual: The "Automatic Season Reset" toggle only controls whether seasons end automatically on a timer. You can always trigger a season reset manually at any time, regardless of this setting. The reset type (Hard/Soft) applies to both automatic and manual resets.

Hard Reset

Every player returns to the starting ELO (default: 1200). Clean slate — everyone is equal at the start of the new season. Best for servers that want a completely fresh start each season.

Example: With starting ELO of 1200, a player at 1800 resets to 1200. A player at 900 also resets to 1200.

Soft Reset

Players are moved partway back toward the starting ELO. High-rated players drop, low-rated players rise, but skill differences are partially preserved.

New ELO = Starting ELO + (Current ELO - Starting ELO) × Factor

The soft reset factor controls how much of a player's distance from starting ELO is preserved:

  • Factor 0.00 = full reset, same as hard (nothing preserved)
  • Factor 0.25 = aggressive reset, only 25% of rating distance kept
  • Factor 0.50 = balanced (default) — halfway between current and starting ELO
  • Factor 0.75 = gentle reset, most of the rating is preserved
  • Factor 1.00 = no change at all (not recommended)

Examples (starting ELO: 1200, factor: 0.50):

Soft reset examples
Current ELONew ELOChangeWhat Happened
18001500-300Moved 50% back toward 1200
16001400-200Moved 50% back toward 1200
120012000Already at starting ELO
9001050+150Moved 50% up toward 1200
600900+300Moved 50% up toward 1200

What Happens During a Season Reset

  1. All players who played matches this season are ranked by ELO and their standings are permanently archived
  2. ELOs are reset according to the reset type (Hard or Soft)
  3. Season match stats are zeroed (wins, losses, MVPs)
  4. Tier roles are reassigned based on each player's new post-reset ELO
  5. Discord nicknames are updated with new ELO values
  6. Season number increments and a new season begins immediately
  7. A summary embed showing top 5 players is posted to the summary channel (or scores channel if none is set)

Important: Players who did not play any matches during the season are not ranked in the archive, but their ELO is still reset. All-time stats (total games, total wins/losses) are preserved — only the current season counters are zeroed.

Ending a Season

Manually — Use the "End Season" button on the dashboard Settings tab, or run:

/season-reset confirm:true

Running /season-reset without confirm:true shows a preview of what will happen before you commit.

Automatically — Turn on "Automatic Season Reset" in Settings and choose a duration. The bot checks hourly and will automatically end the season when the timer expires.

Viewing Past Seasons

  • In Discord: /season-leaderboard season:3 — shows the top 15 players from Season 3
  • On the dashboard: The Season History tab shows all past seasons with full leaderboards, final ELO, peak ELO, win/loss records, MVPs, and reset ELO
  • Check current season: /season-info — shows the current season number, reset type, and when the season ends

Other Features

Starting ELO

New players start at 1200 ELO by default when they /register. You can change this in the dashboard under Settings (range: 0-3000).

Nickname Display

The bot updates each player's Discord nickname to show their current ELO:

[1350] PlayerName

This updates automatically after matches, manual ELO changes, and season resets.

Role hierarchy required: The bot can only update nicknames for users whose highest Discord role is below the bot's role. The server owner's nickname can never be changed by any bot (Discord limitation).

MVP Bonus

Admins can award MVP to standout players after a match using /mvp. If an MVP bonus is configured (via /set-mvp-bonus), the player receives bonus ELO on top of their normal match gain.

  • Default bonus: 0 (disabled)
  • Maximum: 100 ELO per MVP
  • Multiple MVPs can be awarded in the same match
  • MVP awards are reversed if the match is voided

Win/Loss Streaks

The bot tracks current and peak win/loss streaks for every player. Streaks are shown on the /stats card.

  • Current streak — resets when the result flips
  • Peak win streak — the longest win streak ever, persists across seasons
  • Streaks are tracked per-server across all queues (not per-queue)
  • Voiding or overturning a match recalculates streaks

Win Streak Bonuses

Server owners can configure bonus ELO awarded at specific win streak milestones using /streak-bonus. This rewards players who go on hot streaks.

/streak-bonus streak:3 bonus:5
/streak-bonus streak:5 bonus:10
/streak-bonus streak:10 bonus:25
  • Bonus fires once when hitting the exact streak count — not on every subsequent win
  • Set bonus to 0 to remove a milestone: /streak-bonus streak:5 bonus:0
  • Bonuses are included in the total ELO change and reversed if a match is voided or overturned
  • Streak bonus announcements show the bonus amount alongside the streak message

Head-to-Head Records

Use /h2h player:@someone to see your record against another player:

  • Versus record — wins/losses when on opposite teams, with win rate
  • Teammates record — wins/losses when on the same team, with win rate
  • Recent matches — last 5 matches you both appeared in

Custom Display Names

Admins can override a player's display name with /rename-player. The custom name appears on leaderboards, stats cards, match embeds, and in the nickname format. Useful when a player's Discord username doesn't match their gamertag.

Team Balancing

In AUTO_MATCH mode, the bot creates balanced teams using a snake draft:

  1. Players are sorted by ELO (highest to lowest)
  2. Round 1: Best player goes to Team 1, next to Team 2
  3. Round 2: Next player goes to Team 2, then Team 1 (reversed)
  4. This alternating pattern continues until all spots are filled

With team queue: Pre-made teams are placed together on the same side and only match against other pre-made teams. Solo players are balanced separately.

1v1 Rematch Limit

For 1v1 queues, set a rematch limit to prevent the same two players from being matched too many times within a time period. Configure the time window in hours and the maximum number of matches allowed against the same opponent within that window.

/setup team-size:1 mode:AUTO_MATCH rematch-window-hours:24 rematch-window-max:2

Players can only face the same opponent 2 times within 24 hours. If there aren't enough players in queue to avoid a rematch, the bot falls back to normal matchmaking — no one gets stuck waiting forever.


ELO Gate

Restrict who can join a queue based on their server-wide ELO rating. Use this to create skill-specific queues — for example, a beginner-friendly queue capped at 1100 ELO, or a competitive queue requiring 1300+.

Configure with /elo-gate min:1300 or /elo-gate max:1100 or both. Use /elo-gate off to remove restrictions. The gate checks a player's current server-wide rating at the time they join — if their rating later changes while in queue, they are not removed.

Available on all subscription tiers. Also configurable from the web dashboard under queue settings.


Matchmaking Modes

Matchmaking mode controls which players get selected when the queue fills. Team balancing (snake draft) always runs after — this determines who is in the match, not which team they're on.

Standard (Default)

The first available players are matched as soon as the queue fills. Teams are balanced using a snake draft — the highest and lowest rated players are distributed evenly across teams for fair matchups. This gives the fastest queue times.

8 players join a 4v4 queue:

[1400] [1100] [1200] [1150] [1250] [1100] [1200] [1300]

→ Match fires immediately with all 8

→ Snake draft balances teams: ~1213 avg vs ~1187 avg

Skill Range (Pro)

The queue checks whether the skill gap between all matched players fits within a configurable ELO range. If the spread is too wide, the queue holds and waits for closer-skilled players. The acceptable range expands over time based on how long the longest-waiting player has been queued, so matches always eventually fire.

When there are more players than needed, the system can skip outliers and match the tighter skill group first. The outlier player waits for a better match or until the range expands enough to include them.

9 players in queue, 8 needed, elo-range: 150:

[1100] [1150] [1200] [1100] [1200] [1250] [1150] [1500] [1200]

→ 1500 is outside the 150 range — skipped

→ Match fires with the 8 closest players (1100-1250)

→ The 1500 player waits for the next match

Only 8 players, elo-range: 150, expansion: 50/min:

[1100] [1150] [1200] [1100] [1200] [1250] [1150] [1500]

→ Spread is 400 > 150 — queue holds

→ After 1 min: range = 200. After 3 min: range = 300. After 5 min: range = 400

→ At 5 min, match fires with all 8 players

Configure with /matchmaking mode:skill-range elo-range:150 expansion:50. Use /matchmaking mode:standard to switch back.

Tip: For small communities (under 20 active players), use a wider range (300+) or stick with Standard. Skill Range matchmaking works best with 30+ active players where there is a real skill spread.

Note: Skill Range matchmaking only applies to AUTO_MATCH solo queues with 2+ team size. 1v1 queues use the rematch limit feature instead. Team vs team matching stays first-come-first-served.


Frequently Asked Questions

Can players game the system by only playing weaker opponents?

No — this is the whole point of ELO. Beating weaker players gives almost no rating (as low as +1), and losing to them is devastating (-19). A player farming weak opponents will plateau quickly because they gain so little per win. Meanwhile, a player who competes against evenly-matched opponents gains 5-10x more per game. Over time, the solo queue grinder will always outpace the farmer.

Why did I only get +3 ELO for winning?

Your team's average rating was much higher than the opponent team's. The system expected you to win, so the reward is small. To gain more ELO, you need to beat opponents closer to or above your rating.

Why did I lose so much ELO (-15)?

You lost to someone (or a team) rated significantly below you. The system expected you to win, so the loss is treated as a big surprise and your rating drops accordingly.

How many games does it take to reach my true rating?

With default settings, about 15-25 games. The first 5 games use the higher provisional K-Factor (in Standard mode) or the provisional bonus amount (in Flat mode), which moves your rating fast. After that, changes slow down and your rating stabilizes around your true skill level. Server owners can adjust the provisional threshold (in server settings) and K-Factors or flat provisional amounts to speed this up.

What's the difference between server ELO and queue ELO?

Server ELO is your main rating across the entire server — it's what shows in your nickname, stats card, and the main leaderboard. Queue ELO is tracked per-queue for servers with multiple queues (e.g., a 1v1 queue and a 5v5 queue). Your server ELO updates from all queues; your queue ELO only updates from that specific queue.

Do I need to enable auto-reset to use seasons?

No. Seasons are always tracked (Season 1 starts when you first set up the bot). Auto-reset just controls whether the season ends automatically on a timer. You can run manual resets any time with /season-reset.

What if I change the reset type mid-season?

The new reset type takes effect on the next reset (manual or automatic). It doesn't affect the current season retroactively.

Can I undo a season reset?

No. Season resets are permanent. The archived standings are preserved, but ELO changes cannot be reversed.

Should I use Hard or Soft reset?

Hard reset if you want a completely fresh start each season — good for casual or smaller servers where the leaderboard should feel new. Soft reset if you want skill to partially carry over — good for competitive servers where high-ranked players shouldn't have to re-prove themselves from scratch every season.

My server has both 1v1 and 5v5 queues. Do they share ELO?

Yes — all queues contribute to the same server ELO. A win in 1v1 and a win in 5v5 both update your server-level rating. Each queue also tracks a separate per-queue rating for its own leaderboard, but the main rating is shared.