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:
| Your ELO | Opponent ELO | If You Win | If You Lose | What This Means |
|---|---|---|---|---|
| 1200 | 1200 | +10 | -10 | Even match — fair trade |
| 1200 | 1400 | +14 | -6 | Underdog — more to gain, less to lose |
| 1400 | 1200 | +6 | -14 | Favored — less to gain, more to lose |
| 1500 | 900 | +2 | -18 | Heavy favorite — almost nothing for winning |
| 900 | 1500 | +18 | -2 | Massive underdog — huge reward for the upset |
| 1600 | 800 | +1 | -19 | Farming 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.
| Setting | Default | Range | What It Does |
|---|---|---|---|
| Provisional K-Factor | 40 | 1-100 | ELO multiplier for new players |
| Established K-Factor | 20 | 1-100 | ELO multiplier for established players |
| Provisional Threshold | 5 | 1-50 | Number 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 | Win | Loss | Good For |
|---|---|---|---|
| 10 | +5 | -5 | Very stable, slow changes |
| 20 | +10 | -10 | Default — balanced |
| 30 | +15 | -15 | More volatile, faster calibration |
| 40 | +20 | -20 | Default for new players |
| 60 | +30 | -30 | Very 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:15or 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:40or 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
| Setting | Default | Effect |
|---|---|---|
| Starting ELO | 1200 | Where new players begin (0-3000) |
| ELO Mode | Standard | Standard (dynamic) or Flat (fixed gain/loss) |
| K-Factor (Provisional) | 40 | Rating multiplier for new players |
| K-Factor (Established) | 20 | Rating multiplier for experienced players |
| Provisional Threshold | 5 | Games before switching from provisional to established K (server-wide) |
| Flat ELO Amount | 25 | Fixed points per win (Flat Mode only) |
| Flat ELO Loss Amount | Same as win | Fixed points per loss (Flat Mode only); if not set, uses win amount |
| Flat Provisional Amount | Off | Higher points per win/loss during provisional period (Flat Mode only); if not set, all games use the same amount |
| MVP Bonus | 0 | Bonus ELO for MVP awards (0-100) |
| Rematch Limit | 0 | Max 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
| Tier | Min ELO | Color |
|---|---|---|
| Bronze | 0 | #CD7F32 |
| Silver | 1000 | #C0C0C0 |
| Gold | 1200 | #FFD700 |
| Platinum | 1400 | #00CED1 |
| Diamond | 1600 | #B9F2FF |
| Master | 1900 | #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
| Setting | Default | Description |
|---|---|---|
| Inactivity Period | 168 hours (7 days) | How long before decay starts |
| Decay Amount | 10 points | Points removed per decay tick |
| Minimum ELO | 1200 | Decay 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
- Go to the Settings tab on the dashboard
- Choose a reset type (Hard or Soft) — this controls what happens to player ELOs when a season ends
- Optionally turn on Automatic Season Reset to end seasons on a schedule (1-12 weeks)
- You can always end a season manually with the End Season button or
/season-reset confirm:truein 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.
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) × FactorThe 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):
| Current ELO | New ELO | Change | What Happened |
|---|---|---|---|
| 1800 | 1500 | -300 | Moved 50% back toward 1200 |
| 1600 | 1400 | -200 | Moved 50% back toward 1200 |
| 1200 | 1200 | 0 | Already at starting ELO |
| 900 | 1050 | +150 | Moved 50% up toward 1200 |
| 600 | 900 | +300 | Moved 50% up toward 1200 |
What Happens During a Season Reset
- All players who played matches this season are ranked by ELO and their standings are permanently archived
- ELOs are reset according to the reset type (Hard or Soft)
- Season match stats are zeroed (wins, losses, MVPs)
- Tier roles are reassigned based on each player's new post-reset ELO
- Discord nicknames are updated with new ELO values
- Season number increments and a new season begins immediately
- 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:trueRunning /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] PlayerNameThis 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:
- Players are sorted by ELO (highest to lowest)
- Round 1: Best player goes to Team 1, next to Team 2
- Round 2: Next player goes to Team 2, then Team 1 (reversed)
- 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:2Players 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.