Scoreboards Documentation

Everything you need to create and manage Discord leaderboards

  1. Add the bot — Invite Scoreboards to your Discord server using the invite link on the homepage.
  2. 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.
  3. 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).
  4. Create your first leaderboard — Use /scoreboard create to set up a leaderboard. Pick a name and type, then set the rest in the form that opens.
  5. Display it — Use /scoreboard show in a channel to post the interactive leaderboard with submit and pagination buttons.

When creating a leaderboard with /scoreboard 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).

Leaderboard Management

CommandDescriptionPermission
/scoreboard createCreate a new leaderboard — pick a name and type, then set sort order and more in the formAdmin / Bot Permission
/scoreboard showDisplay the leaderboard in the current channel with interactive buttonsAdmin / Bot Permission
/scoreboard settingsOpens the dashboard to manage this scoreboard's settings (sort, visibility, headers, view mode, ELO config, and more)Admin / Bot Permission
/scoreboard deletePermanently delete a leaderboard and all associated data (requires confirmation)Admin / Bot Permission
/scoreboard season endEnd a season by freezing the board — the standings stay as the permanent record, and you can unfreeze from the dashboard to resumeAdmin / Bot Permission
/importImport scores into a leaderboard from a CSV file (migrating from another bot or a spreadsheet)Admin / Bot Permission

Score & Match Submissions

CommandDescriptionPermission
/submitSubmit to any leaderboard. The bot opens the right next step based on type — a score modal (Classic/Highscore/Time), a player + winner picker (ELO), a player + score picker (League), or a name modal (Rating, with an image attached to the slash command). On a team board the pickers ask for a full roster per side.Everyone
/setManually set a player's exact score or ELO ratingAdmin / Bot Permission
/adjustAdd or subtract a value from a player's score (use negative values to subtract)Admin / Bot Permission
/player removeRemove a player from a leaderboardAdmin / Bot Permission

Configuration

CommandDescriptionPermission
/get startedLaunch the setup wizard for first-time configurationAdmin
/helpView interactive help documentation with all available topicsEveryone

There are two ways to submit:

  • Use the /submit slash command and pick a leaderboard. The bot opens the right modal/flow based on the leaderboard's type — a score input for Classic/Highscore/Time, a player + winner picker for ELO, a player + score picker for League, or a name input for Rating (with the image attached to the slash command). On a team leaderboard the pickers ask you to select a full roster for each side instead of one player.
  • Click the Submit button on the posted leaderboard message to open the same submission flow.

Review Process

  1. The submission is posted to the configured log channel (if set).
  2. A validator or admin clicks Approve or Reject.
  3. If rejected, the submitter receives a DM with the rejection reason.
  4. 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 Score/Match". 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 /submit.

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 /submit — 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. The bot's /submit command opens the same prompt in Discord. 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

ResultELOLeague
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 — anywhere from 3 up to the lobby size, so a 6-player board can still record the night five people showed up. 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 /submit — attach the image to the slash command, then enter a name in the prompt.
  • 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:

Public

Visible to everyone on the website.

Hidden

Only visible to members of your Discord server (requires login).

Private

Only visible to members with a specific Discord role.

Disabled

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? /import takes a CSV file and fills a leaderboard from it, so you don't have to retype anything.

You can do it two ways: in Discord run /import, pick the leaderboard and attach the file; or on the website open the dashboard, select a leaderboard, and use Import from CSV. Personal leaderboards have no Discord server, so the dashboard is the way in for those. 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 in /scoreboard settings or the website dashboard.