Once a league outgrows a single ladder, someone always proposes divisions. It's the most-requested structure in competitive Discord communities and the one most likely to be implemented as something that isn't actually a division system.
The usual attempt: set up tier roles at rating thresholds — Bronze under 1100, Silver 1100–1300, Gold above 1300 — and call them divisions. That gives you coloured names in the member list. It does not give you divisions, because everyone still queues into the same pool and plays everyone else. Nothing about the competition changed.
A real promotion/relegation system needs three things that rating-threshold labels don't provide. This post covers all three, how to build them, and — because it matters more than the mechanics — when you shouldn't.
If you just want ranked badges that update automatically, that's the simpler feature and it's covered in tier roles and rank decay. This post is about the structural version.
Labels vs Divisions
The distinction worth being precise about:
Tier labels are derived continuously from rating. Cross 1300 and you become Gold, immediately. Drop back and you lose it, immediately. There's no event, no fixed membership, and no effect on who you play.
Divisions are a competition structure. Membership is fixed for a period, you play within your division, and you move between them at defined moments. The whole point is that Division 2 is a real competition with its own standings and its own champion — not a waiting room for people who haven't hit 1300 yet.
That difference produces three requirements:
- Fixed-size membership — a division holds N players, not "everyone above a number"
- Segregated play — D1 plays D1
- A movement event — promotion and relegation happen at a boundary, not continuously
Why Rating Thresholds Fail as Divisions
Fixed thresholds have three specific failure modes when you try to use them structurally.
They drift. Ratings inflate or deflate over a season depending on your K-factor, your player mix, and any non-zero-sum modifiers you've enabled. A 1300 threshold that split your league neatly in March can have 80% of the population above it by August. Your divisions silently rebalance into nonsense.
They produce empty divisions. Set a top tier at 1600 and you might have four people in it. Or zero. A division with four players isn't a competition, it's a group chat.
They have no fixed size, so you can't plan around them. "Bottom three relegate" is meaningless when the division's population changes every time someone's rating wobbles across a line.
Rank-Based Tiers Fix All Three
The fix is to define membership by rank rather than rating. Not "everyone above 1300" but "the top 10".
/tiers create_rank rating_type:player_global_all rank:10 role:@Division 1 leaderboard:Ranked
rank:10 means the top 10 players hold that role. Add a second at rank:25 for Division 2, a third at rank:50 for Division 3.
This solves all three problems at once. Fixed size by construction — the top 10 is always ten people. No drift — rank is relative, so inflation doesn't touch it; if every rating rises 200 points, the top 10 is still the top 10. Never empty — as long as you have ten players, D1 has ten players.
It also changes the psychology in a useful way. A rating threshold is a solo challenge against a number. A rank is a competition against people, and the person sitting 11th knows exactly what they need to do.
Set your top division first and work down, and keep the tiers non-overlapping in your own head — rank 10, rank 25, rank 50 gives you 10 / 15 / 25.
Segregating Play — the Honest Part
Here's where I should be straight with you, because it's the requirement most articles gloss over.
There is no queue setting that restricts a queue to a Discord role. You can't create a queue and tell the bot "only Division 1 may join". So there are three real approaches, and the right one depends on how serious your divisions are.
One queue, rating-banded matches
Leave everyone in one pool and cap the rating spread within a match:
max_elo_difference:200
Matches only form between players within 200 rating points. That gives you de facto skill bands without formal divisions — a 1500 player will simply never be matched with a 1000 player.
This is the right answer for most leagues. It gets you the actual benefit of divisions (competitive matches against your own level) without splitting your queue population or adding administration. The cost is that there's no Division 2 title to win.
Separate leaderboards per division
If you want genuine division standings, make each division its own leaderboard — the same way a new season is a new leaderboard. "Ranked D1", "Ranked D2". Each gets its own queue, posted in its own channel.
Access control is then plain Discord channel permissions: the #d1-queue channel is visible only to the @Division 1 role. That's not a bot feature, it's Discord doing what Discord does, and it works perfectly well.
This gets you real divisions — separate standings, separate champions, a genuine D2 competition. It costs you a queue population split (see below) and a manual role-and-permissions step at every promotion window.
Labels only
Rank-based tier roles for status, one shared queue, no segregation. Cheapest, and honestly fine for a lot of communities. People care about the badge more than they care about the structure.
Continuous or Periodic?
Rank-based tier roles update continuously — overtake someone and the role moves the same day. That's the default, and for a label system it's correct.
For an actual division system it's usually wrong. Continuous movement means someone can be promoted and relegated three times in a fortnight, which makes the division meaningless and generates a lot of noise.
Periodic movement — evaluate at the end of a window, move people, then freeze until the next one — is what makes a division feel real. It creates a deadline, which creates the end-of-window scramble that is the best thing about pro/rel systems.
The product doesn't have a "freeze divisions until Sunday" toggle, so periodic movement is a process rather than a setting: you run the league with the roles as labels during the window, and do the actual promotion/relegation — the role and permission changes that determine who plays where next — at the boundary. Monthly is the usual cadence. Weekly is too fast for ratings to settle; quarterly and you may as well use seasons.
Announce the Movement
Promotion is the reward. If it happens silently in the member list, you've built the mechanism and thrown away the payoff.
/channel_config tier_notification enable channel_id:#announcements
Tier changes get posted to that channel. Put it somewhere visible rather than in an admin channel — the person who just made Division 1 should have it announced, and the people below should see it happen.
This is genuinely the highest-return five seconds of setup in the whole structure. A promotion nobody witnessed is just a role colour changing.
How Many Divisions?
Driven by population, and the constraint is harsher than people expect.
A division needs enough active players to fill matches within itself on a typical night. For a 5v5 league that means ten people online simultaneously, from that division alone. If your league has 40 regulars and you split it into four divisions of 10, each division needs its entire membership online at once to play a single match. That league can't run four divisions. It possibly can't run two.
Rough floors, assuming a healthy proportion are active on any given night:
| Format | Players per division | League size for 2 divisions |
|---|---|---|
| 1v1 | ~15 | ~30 |
| 3v3 | ~30 | ~60 |
| 5v5 | ~50 | ~100 |
Below those numbers, use rating-banded matchmaking (max_elo_difference) and rank-based labels. You get the competitive benefit without the queue split.
Start with two. Almost every league that jumps straight to four divisions ends up merging them within a season.
When Not to Do This
The honest summary, because divisions are more often a mistake than not:
Don't, if your queue is ever slow to fill. Divisions split your matchmaking pool, and queue population is the thing small leagues can least afford to lose. A player who waits twenty minutes for a match stops queueing, and that failure compounds much faster than "we don't have a D2 title" ever hurt anyone.
Don't, if the problem is actually spread. If your complaint is that good players stomp new players, that's max_elo_difference and it takes one setting. Divisions are a heavyweight answer to a question that has a light one.
Do, if you have the population and you want the story. Pro/rel produces genuinely great competitive drama — the last-week relegation scrap is the most engaged your league will ever be. It's worth real administrative cost, provided you can pay it.
Putting It Together
For a league with the population to support it:
- Rank-based tier roles for division membership —
rank:10,rank:25,rank:50 - Separate leaderboards per division if you want real standings, or one queue with
max_elo_differenceif you want the benefit without the split - Discord channel permissions to gate each division's queue channel
- Monthly movement, done at the boundary rather than continuously
- Tier notifications posted somewhere public
- Two divisions to start, adding a third only when the second is comfortably full
And keep the escape hatch in mind: if the queue slows down, merge. A single healthy ladder beats three divisions nobody can fill, every time.
Running a league on Discord? Team Up handles Elo, rank-based tier roles, matchmaking queues and season rollovers in one bot. Start with the leaderboard setup guide, or read tier roles and rank decay for the simpler badge-only version.
