Scoreboards Documentation
Everything you need to create and manage Discord leaderboards
- Add the bot — Invite Scoreboards to your Discord server using the invite link on the homepage.
- Run the setup wizard — Use
/get started: one quick form to name your leaderboard, pick a type and optionally a log channel — and it's posted right in the channel. Point, Highscore and Time boards start with a few example entries so you can see the board working; they disappear the moment a real score is added. - Assign roles — Open the dashboard to set the <arg>bot permission</arg> role (users who can manage leaderboards) and the <arg>validator</arg> role (users who can approve submissions).
- Create your first leaderboard — Use
/leaderboard createto set up a leaderboard. Pick a name and type, then set the rest in the form that opens. - Display it — Use
/leaderboard showin a channel to post the interactive leaderboard with submit and pagination buttons.
When creating a leaderboard with /leaderboard create, choose one of six types:
Classic
Adds or subtracts points from a running total. Best for cumulative scoring games.
Highscore
Only stores each player's personal best. Previous lower scores are replaced automatically.
Time (Speedrun)
Submit times as 00:00:00 (hundredths) or 00:00:000 (milliseconds) — the board's display format is a dashboard setting, and new boards default to milliseconds. Use ascending sort for fastest-wins or descending for longest-wins.
ELO - Ranked
Competitive ELO rating system, 1v1 or 2v2–8v8 teams. Submit match results and every participant's rating updates automatically.
Rating
Submit images for community star ratings (1–10). Votes are averaged into a score. Perfect for art contests and creative challenges.
League
Match-based points ranking for sports like football, basketball, and FIFA. Configurable points per win/draw/loss (default 3/1/0) and a match score (e.g. 3-1).
Classic, Highscore and Time can be switched between at any time under Scoring in the dashboard — all three keep one score per player, so nothing is converted and the same number simply reads a new way. ELO, League and Rating store their entries differently and need a leaderboard of their own.
Leaderboard Management
| Command | Description | Permission |
|---|---|---|
/leaderboard create | Create a new leaderboard — pick a name and type, then set sort order and more in the form | Admin / Bot Permission |
/leaderboard show | Display the leaderboard in the current channel with interactive buttons | Admin / Bot Permission |
/leaderboard settings | Opens the dashboard to manage this scoreboard's settings (sort, visibility, headers, view mode, ELO config, and more) | Admin / Bot Permission |
/leaderboard delete | Permanently delete a leaderboard and all associated data (requires confirmation) | Admin / Bot Permission |
Score & Match Submissions
| Command | Description | Permission |
|---|---|---|
/score | Set or adjust a player's score, ELO or time. Pick the leaderboard, then choose Set or Adjust in the form that opens. Image-rating boards are not included. | Admin / Bot Permission |
Configuration
| Command | Description | Permission |
|---|---|---|
/get started | Launch the setup wizard for first-time configuration | Admin |
/help | View interactive help documentation with all available topics | Everyone |
/delete_my_data | Permanently delete the personal leaderboards and scores held under your own workspace (requires confirmation) | Everyone |
Economy (Beta)
The economy has no slash commands. Members open the server’s shop page to see their balance, buy roles, board emojis and name colours, and open any payout to see exactly how it was worked out. Admins turn it on, price the shop and give or take currency in the dashboard, under Economy.
There are two ways to submit:
- In Discord, click the submit button on the posted leaderboard message — it is labelled Submit score on Classic/Highscore/Time boards, Submit result on ELO and League, and Submit image on Rating. The bot opens the right modal for the type: a score input, a player + winner picker, a player + score picker, or a name plus the image itself. On a team leaderboard the pickers ask you to select a full roster for each side instead of one player, and a free-for-all leaderboard carries a Report result button instead.
- From the website, open the leaderboard and click Submit for the same flow — and it is the only route that takes a custom name, for players who are not in your Discord server.
Review Process
- The submission is posted to the configured log channel (if set).
- A validator or admin clicks Approve or Reject. On an ELO or League match the players in it can approve too — the opponent confirming the result is enough, so a server needs no validator role to keep matches moving. Whoever reported the match cannot approve their own report, and only they can reject it.
- If rejected, the submitter receives a DM with the rejection reason.
- If approved, the leaderboard updates immediately.
Auto-Approval
Each leaderboard can be configured to auto-approve submissions after a set delay: Off, Instant, 1 hour, 3 hours, 24 hours, 3 days, or 7 days. The default for ELO leaderboards is 24 hours.
Cancelling a Score
Admins and validators can cancel an already-approved score by right-clicking the submission message and selecting "Cancel Review". This reverts the score change and requires a cancellation reason.
The ELO - Ranked leaderboard type uses an ELO rating system to rank players competitively, either 1v1 or in teams of up to eight a side.
How it works
- Each player starts at a configurable starting ELO (default: 1200).
- Match results can be win, loss, or draw.
- Ratings are calculated using a K-factor of 32.
- Every participant's rating updates simultaneously after approval.
Team matches (2v2 – 8v8)
ELO and League leaderboards can be set to a fixed team size — pick it when you create the leaderboard, or change it later under Match format in the dashboard. Every match on a 3v3 leaderboard then has three players a side, and the leaderboard still ranks players individually.
For ELO, each team's expected result comes from its average rating, and the resulting change is applied to every member of that team — so beating a stronger team earns everyone on the winning side the same gain. For League, every player on the winning team gets the win points, and the whole losing team gets the loss points.
Matchmaking Queue (Beta)
If the queue button is enabled on the leaderboard, players can click it to join the matchmaking queue. The system groups players with similar ELO ratings using an expanding window algorithm. When matched, a thread is created for the match with community voting buttons. If no match is found within 5 minutes, the queue entry expires.
On a team leaderboard the queue waits for enough players to fill both sides — six for a 3v3 — and then splits them into two teams with the closest possible average rating, so the strongest and weakest players end up on opposite sides. Everyone has to click Ready; if someone doesn't, they're dropped and everyone else goes back into the queue with their place kept.
Each team gets its own voice channel so you can talk tactics without the opposition hearing — you only see and can join your own team's channel. Both channels are removed when the match is finalized. A result is locked in once a majority of each team votes for it (two of three in a 3v3), which means one team can never declare its own win; anything else opens a dispute for a validator to settle.
The queue is no longer ELO-only: a League leaderboard can enable it too. Because League points are a running total rather than a skill estimate, League boards match on points per game, so playing more does not by itself move you up the queue.
Fixed teams
A team-size ELO or League leaderboard can also run in fixed teams mode (toggled in the dashboard next to Match format). Persistent named teams sign up once via the leaderboard's Team sign-up button — pick a name, then select the roster, which may hold up to two reserves beyond the team size. The leaderboard then ranks the teams themselves: on an ELO board each team has its own rating and beating a stronger team pays more; on a League board the table ranks teams by points, exactly like a real sports league. League fixed teams record their matches with the leaderboard's Submit result button.
When any member clicks Queue, the whole team is queued and everyone gets a DM. Matching pairs team against team by team rating, and the ready-check doubles as lineup selection: the first team-size members of each roster to click Ready play, the rest sit out that match. Results are voted on by the players who took part, with the same majority-of-each-side rule.
The League leaderboard type ranks players by points accumulated across matches. It's the right format for sports like football/soccer, basketball, futsal, hockey, and any 1v1 or team competition where the season's table is the source of truth.
How it works
- Submit a match with the leaderboard's Submit result button — the bot prompts for both sides and a score for each (e.g. 3 and 1).
- The higher score wins; equal scores are a draw.
- The winning side is awarded points_win, the losing side points_loss, everyone in a draw points_draw. On a team league every player on a side gets that side's points.
- The leaderboard ranks players by total points; W/D/L counts are tracked separately.
Default points
New leagues default to 3 / 1 / 0 (FIFA standard since 1994). All three values are configurable per leaderboard from the dashboard. Use 2 / 1 / 0 for hockey, 4 / 2 / 0 for rugby, or any custom schedule that fits your sport.
Submitting a match
From the website, open the leaderboard and click Submit — enter both sides and the match score. In Discord the leaderboard's own Submit result button opens the same prompt. Same-player matches and negative scores are rejected at submission time.
Team leagues
A League leaderboard can be set to a fixed team size, 2v2 up to 8v8, when you create it or later under Match format in the dashboard. The table still ranks players individually: every player on the winning side gets the win points, the whole losing side gets the loss points, and the match score counts as goals for and against for each of them.
Prefer a classic sports-league table where the teams are the rows? Turn on Fixed teams next to Match format: persistent named teams sign up via the leaderboard's Team sign-up button (rosters may carry up to two reserves), matches are submitted team vs team with a score, and the table ranks the teams by points.
Reviewing & canceling
League matches use the same review queue as ELO matches: a validator approves or rejects each submission, points apply on approval, and approved matches can be cancelled later (which reverts the exact points awarded).
ELO and League leaderboards don't have to be two-sided. In a free-for-all everybody in the match plays for themselves — 3 to 8 players — and the result is where each of them finished. Turn it on with the ffa_players option when you create the leaderboard, or later under Match format in the dashboard. It takes the place of team matches: a free-for-all leaderboard can't also have a team size or fixed teams, and switching it on only affects new matches, so everything already recorded stays exactly as it is.
The result modes
| Result | ELO | League |
|---|---|---|
| Full finishing order — 1st through last | ✓ Yes | ✓ Yes |
| Everybody draws | ✓ Yes | ✓ Yes |
| One winner, everyone else unplaced | — Not offered | ✓ Yes |
Winner-only is a League mode. There it needs nothing more than it says: the winner takes the win points and the rest take the loss points. A rating can't be that relaxed — if the losers are unranked, the only thing it can honestly say about them is that they all drew, and then a low-rated player gains rating from a match their record counts as a loss. So an ELO free-for-all asks for the whole order, or for an all-draw that really happened.
Reporting a result
Free-for-all leaderboards carry a Report result button instead of Submit result. First pick everyone who played — exactly as many as the leaderboard's lobby size, so a 6-player board takes 6 and the form will not submit with 5. The same form can carry the result: name the winner and the match is reported there and then, and on a leaderboard with a placement points table that field widens to the whole finishing order — 1st place first, then 2nd, and so on. Leave it empty and you get the result step instead. Then set the result: a League board asks who won, with Everybody draws in the same menu and Set full order if you'd rather rank the whole field; an ELO board asks straight for the order, one place per tap, with Undo last for a misclick and an Everybody draws button beside it. Submit stays greyed out until the result is one the leaderboard can score. That button is the only way to report a free-for-all in Discord — if your leaderboard doesn't show it, turn it on under Discord display → Submit Button in the dashboard, or report the match from the leaderboard's page on the website.
After that a free-for-all is an ordinary submission. It lands in the review queue, a validator approves or rejects it (or auto-approve does after the configured delay), ratings and points move on approval, and cancelling an approved match reverts every player by exactly what it gave them.
How the rating works
An ELO free-for-all is scored as all of its head-to-head sub-results at once. Every pair of players is compared — the better finish beats the worse one, an equal finish is a draw between them — and each of those mini-results is rated with the same expected-score maths a 1v1 uses. So finishing above players rated far above you pays much more than finishing above the bottom of the lobby. The K-factor is then divided by the number of opponents, which is what keeps one free-for-all worth roughly one match of rating movement instead of the seven duels you technically played.
The whole thing is exactly zero-sum: what the field loses is what the rest gain, down to the last point. Six equally rated players at K=32 come away +16, +10, +3, −3, −10, −16. Records follow the finish — first place, including a tie for it, counts as a win, everyone below it as a loss, and an all-draw as a draw for the entire field.
Placement points on League boards
A League free-for-all can pay the whole field from a placement points table, F1 style: so many points for first, so many for second, and so on down the lobby. You edit it in the dashboard, below the win/draw/loss points, on any League leaderboard that plays free-for-alls. Players who tie each take the points of the place they share, and anyone finishing past the end of the table keeps scoring its last entry.
The table only pays a full finishing order. Leave anyone unplaced — a winner-only report, or an order you stopped halfway — and it doesn't apply at all: first place takes the leaderboard's win points and everybody else the loss points. That is also what you get with no table configured, so the table is opt-in. An all-draw pays the draw points to everyone, whatever the table says.
Free-for-all in the matchmaking queue
With the queue button enabled, a free-for-all leaderboard queues individuals and fires the moment it has exactly the lobby size — six players on a 6-player board, never five and never seven. There are no sides to balance, so the lobby is simply the closest-rated group the queue can put together. Everyone still has to click Ready, and the match gets one shared voice room: in a free-for-all there are no teammates to hide from.
The result is reported rather than voted on — three vote buttons can't express an eight-player finishing order. Any player in the lobby sets the result on the match message and the others press Confirm; it locks in once a majority of the field has agreed (two of three, five of eight), with whoever reported it counting as the first of them. Dispute hands the match to a validator, who sets the right result and confirms it themselves. A queue match settles in its own thread, so it doesn't pass through the review queue.
The Rating leaderboard type lets community members submit images and rate each other's submissions with star ratings.
How it works
- Users submit images with the leaderboard's Submit image button — the form takes a name, an optional description, and the image itself.
- Submissions appear in the configured log channel with a rating dropdown.
- Anyone can rate from 1 to 10 stars. Ratings are averaged into a score.
- Users can change their vote at any time — only one vote per person per submission.
- The leaderboard ranks submissions by average rating.
Rating on the website
On the website, submissions appear in the Entries tab. Click any entry to see the full image and rate it with interactive star buttons. Your existing votes are remembered across sessions.
Control who can see your leaderboards on the Scoreboards website:
Visible to everyone on the website.
Only visible to members of your Discord server (requires login).
Only visible to members with a specific Discord role.
Not shown on the website at all.
Automatically assign Discord roles to players based on their leaderboard ranking. For example, you could give the top 3 players a "Champion" role, ranks 4–10 a "Veteran" role, and so on.
- Configure tiers from the web dashboard under each leaderboard's settings.
- Choose how a tier is defined: by rank (ranks 1–3), by percentile (the top 10% of players), or by score (everyone with 2000+ points). All tiers on a leaderboard share the same mode.
- Assign any existing Discord role to each tier.
- Roles are automatically assigned and removed as rankings change.
- The Scoreboards role must sit above every role it assigns in Server Settings → Roles. Discord blocks bots from managing roles at or above their own, and the bot will post a warning in the leaderboard's channel if it hits this.
Already running a competition somewhere else? A CSV file can fill a whole leaderboard in one go, so you don't have to retype anything.
Open the dashboard, select a leaderboard, and use Import from CSV. It is the same route for a server leaderboard and for a personal one, which has no Discord server behind it. Either way the file is the same — one <arg>name,score</arg> per line:
name,score Alex,120 "Cooney, EM",95 Sam,88
- A header row is detected and skipped automatically.
- Commas, semicolons and tabs all work as separators — whatever your spreadsheet exports.
- Names containing a comma work if they're quoted, like <arg>"Cooney, EM"</arg>.
- If a name is a Discord user id, that entry is linked to the member and shows their display name. Anything else becomes a custom entry.
- The same name twice keeps the last value, so you can re-import a corrected file.
- Rows that can't be read are skipped and listed by line number — the rest still import, so you can fix a couple of lines and run it again.
Times accept <arg>mm:ss</arg>, <arg>hh:mm:ss</arg> and an optional fraction: <arg>1:30</arg>, <arg>1:12:44.081</arg>. A plain number is read as milliseconds. Note that three colon-separated numbers mean <arg>hours:minutes:seconds</arg>, so write sub-second precision after a dot.
Limits: 500 rows and 100 KB per file — split larger exports and import them in parts. Image Rating leaderboards can't be imported, because their entries are uploaded images rather than scores.
Seasons let you draw a line under a competition without losing anything. Schedule an end time (or end it from the dashboard) and the board freezes: a podium is posted and the standings stay exactly as they finished.
- Nothing is reset or deleted — the frozen board is the season's permanent record, visible to everyone.
- A frozen board takes no new submissions, matches or votes; an admin can unfreeze it at any time to resume play.
- Every board type can hold a season — including Image Rating, where freezing a blind-voting board also reveals the results.
- Want a fresh season? Create a new board and let the frozen one stand as the record.
Weekly recaps post a short summary to a leaderboard's channel every Monday: the top three, the biggest climber of the week, and how much was played. Only boards with at least three scores in the past week get one, so a quiet leaderboard stays quiet. You can switch recaps off per leaderboard on the website dashboard.
An economy turns results into a currency. Switch it on from the dashboard under Economy, name the currency and pick a payout preset — after that, every result your server approves pays the players. A payout is a flat base plus a share of a variable pool: half the pool follows the result and half follows the surprise, so beating someone rated well above you is worth more than beating someone below you. On a Classic, Highscore or Time board there is no opponent, so your place on the board plays that part instead. It is one balance per member for the whole server, shared by every leaderboard in it.
- A win streak adds 2% per win on top, up to the cap you set.
- Playing the same opponent again and again pays less every time within a rolling week — two matches a day still pay in full.
- A daily cap limits what one member can take home in a day, and new accounts can be made to wait before they earn anything.
- Cancelling, editing or deleting a result takes the payout back, exactly as it was paid — so a reversal after the currency was spent can leave a balance below zero. Every line of it is visible on the server's shop page.
- Image Rating boards pay nothing — there is no result to price.
Members check theirs on the server's shop page, where any payout can be opened to see exactly how it was worked out. The shop sells Discord roles: add them from the dashboard, and members browse and buy on the page itself. Scoreboards has to sit above every role it sells in Server Settings → Roles.
That page lives at scoreboards.dev/shop/your-server, one per server, linked from its leaderboard pages. Besides roles it sells board emojis: a single emoji that renders next to the buyer's name on that server's leaderboards. Names themselves are stripped of emoji on the boards, so a bought emoji is the only one a name can wear — it cannot be faked by renaming, and that is exactly what makes it worth buying. Members buy and choose which owned emoji to wear on the page itself, logged in with Discord; the emoji items are added from the dashboard.
Admins hand currency out and take it back on the website — from a player's context menu on a leaderboard, or from the Economy panel for a member who is on no board; both are posted to the log channel you pick, so nobody has to take a moderator's word for it. Payouts, caps, who is eligible and the shop itself all live on the dashboard. The currency is not money: it has no cash value, it does not leave the server it was earned in, and it can be reset at any time.