A custom Discord tournament bot runs the parts of a league or cup that happen in your server: registration, a role and private channels for every team, check-in, a room per match, the map veto, result reporting and the alerts around it. I build it as one bot on your own Discord application, connected to the bracket you already use, whether that is start.gg, Challonge, FACEIT or a Google Sheet.
It fits leagues that have outgrown free bots: a hundred teams or more, rosters that carry over between seasons, or staff tired of building 300 channels by hand. For a single evening cup, a free bot is usually the better choice.
What the bot does
Before the season. You hand the bot a roster from your sign-up form, sheet or start.gg event. It first shows a dry run: every role, category and channel it would create, and how close that puts your server to Discord's caps of 250 roles and 500 channels. When staff approve, it builds everything in one go: a role for each team, a private voice and text channel per team, division and group channels, and staff access on all of them. For Rivals League that meant 7 divisions, 18 groups and 154 teams, each with its own role and private voice channel. For a Swedish online league's season, the registration bot I co-built created 138 channels and 123 roles in under half an hour.
Registration. A captain runs /register and gets a team card with buttons to add players and request subs. Each button opens a short form for in-game name and tracker profile. The data lands in the bot's database and, if you like, back in the sheet your admins already work in.
Match day. Check-in opens at the time you set, as a button in the team's channel or a shared check-in channel. When it closes, the bot lists the teams that missed it, and staff decide who is dropped or replaced. For each match the bot opens a private room for the two teams and your referees, and posts the format, the deadline in every reader's own time zone, and the veto. Captains ban and pick maps by button in the right order for best-of-1, 3 or 5, choose sides, and the decider is picked automatically. Try the flow in the map veto tool, or see the veto bot I co-built. After the match one captain reports the score, the other confirms, and the result goes to your bracket. A disagreement opens a referee ticket with the match room's history attached.
Around the matches. Go-live alerts post in the right game's channel when a team starts streaming. Standings go out after each round. At the end of the season, a reset command removes everything the bot created so the next season starts clean.
Provisioning, registration cards, map vetoes, stream alerts, Discord login and ticket systems are things I have built for real leagues and organizers, two of them with other developers; the case studies below say who built what. Check-in and score reporting are built the same way and tested in a private server before your season starts.
What it connects to
Checked against each provider's documentation in September 2026.
| System | What the bot can do with it | What to know |
|---|---|---|
| start.gg | Read events, sets and entrants; report confirmed results with reportBracketSet; match players to Discord accounts |
GraphQL API; tokens expire after one year; limit of 80 requests per 60 seconds and 1,000 objects per request; registration can require a Discord connection |
| Challonge | Create tournaments, add participants, update match scores (API v2.1) | 500 requests a month on the free plan and 2,000 with Premier; heavier use needs a paid API plan, and apps over the limit get a 429 error |
| FACEIT | Read championships, matches and results; react to match_status_ready, match_status_finished and tournament_status_checkin webhooks |
The Data API only reads; webhook subscriptions are created in FACEIT's App Studio and can cover all of your organizers |
| Riot Games (League of Legends) | Generate tournament codes and receive results automatically through the Tournament API | Needs a production key, and Riot wants to see a working app, a prototype or clear mockups first; its tournament policies include at least 20 participants, at least 70% of entry fees to the prize pool, and no gambling. Events run on start.gg get tournament codes and result fetching from start.gg itself |
| Riot Games (VALORANT) | Match history and ranked leaderboards | Production keys only, and players must opt in through Riot Sign On |
| Challengermode | Browse tournaments, sign players up and follow live updates through the Client API | Bot or user-token auth; Challengermode recommends a caching backend to stay inside its rate limits |
| Twitch | Post go-live alerts per team or per game | EventSub's stream.online event needs no user authorization; polling also works (Rivals checks the league's own channel every minute, with a six-hour cooldown per game) |
| Google Sheets | Seeding in, rosters and results out | Good when admins already live in a sheet |
Whichever bracket you pick, one system should own each fact. If start.gg owns check-in, the bot reads it; if Discord owns check-in, start.gg should not run its own.
Free Discord tournament bot, builder or custom?
Ready-made tournament bots are cheap and good. Prices are from each product's own page, as of September 2026.
| Option | Price | Best for | Watch out for |
|---|---|---|---|
| BattleBot | Free | Single elimination or first-to-X brackets, 4 to 32 players | Brackets must be 4, 8, 16 or 32; double elimination and round robin are listed as roadmap |
| Tourney Bot | Free (3 tournaments a month, 8 participants); $1.99, $2.99, $4.99 or $15.99 a month for 32 to 512 participants | Many formats, check-in, match threads, proof screenshots | Team tournaments need a paid tier; its docs say submitted proof images are used to train Joyn's own AI model |
| Team Up | Free; Pro $1.99/mo; Unlimited $4.99/mo; White Label $19.99/mo | Elo ladders, matchmaking queues, tournaments seeded by rating | Players sign up one by one and are seeded by Elo, not by league roster |
| start.gg, Battlefy or Challonge plus Discord | Battlefy is free, Challonge is free up to 256 participants, start.gg adds 6% to paid online registrations | Brackets, check-in and match pages on the web | Anything inside your server still needs staff or a bot |
| A custom bot | From $590 (see below) | Leagues, rosters across seasons, 100+ teams, your own data | Costs more and needs lead time before the season |
Pick a free bot if your event fits inside its limits. Pick custom when the job touches your own rosters, website, stats or sponsors, when you need team channels for more than a hundred teams, or when you want one bot instead of four. For scale, Arionis Games lists tournament and match bots at $16,000 to $28,000 with a two to four month timeline, as of September 2026.
What it costs
My packages, in USD, excluding VAT where it applies.
| Package | Price | Fits |
|---|---|---|
| Starter bot | from $590, 1 to 2 weeks | One system on its own, such as a map veto bot, team provisioning from a roster file, or stream go-live alerts |
| Community bot | from $1,490, 2 to 4 weeks | Up to three systems that share data, for example registration, team channels and match rooms with check-in, plus one integration such as start.gg, Twitch or Google Sheets |
| Platform bot | from $3,500, 4 to 8 weeks | A league platform: web dashboard or standings site, Discord login, several game or bracket APIs, more than one server |
Most league bots land in Community. What pushes a quote up: more games and map pools, a Riot production key (Riot wants to see the product or mockups before it approves one), an admin dashboard, several servers, or importing old seasons. What keeps it down: letting start.gg or Challonge own the bracket, one game, and a server structure you are happy to keep.
If you want a fixed price before committing, the Bot Blueprint is $249 for a call and a written spec, credited in full if you order the build within 30 days. During the season, Care is $49 a month and Care Plus $149 a month with up to 2 hours of changes and a reply within one business day. That is not someone on call during your Saturday playoffs, so the build includes admin commands and a written runbook your own staff can use on match night. Extra changes are $90 an hour in prepaid 5-hour blocks.
How the build works
- Brief. Your rulebook, team count, games and where the bracket lives. A spec template helps.
- Spec and fixed quote. Commands, permissions, data and integrations, with an acceptance checklist.
- Private test server. Fake teams at your real scale, so the dry run, the caps and the veto order are tested before any player sees them.
- Launch on your application. You hold the token and get the source code and setup docs. I take a limited number of builds each month, so plan back from registration day.
- Care during the season. Hosting, monitoring and library updates, so the bot is still online in week eight. See hosting and Care plans.
Technical notes
- Intents. Slash commands and buttons need no privileged intent, and fetching one member by ID to give them a role is a plain API call. The privileged Server Members intent is only needed to list every member or to react when someone joins, for example to hand a late player their team role.
- Permissions. The bot needs Manage Roles and Manage Channels, and Discord only lets a bot allow or deny channel permissions it has itself. Its role must sit above every team role it hands out. The permissions calculator builds the invite link.
- Caps. 250 roles and 500 channels per server, categories included, 50 channels per category. Past about 200 teams, give teams one channel each and put match rooms in private threads, which only invited members and staff with Manage Threads can see.
- Data. Team names, Discord user IDs, in-game IDs, results and an audit log of staff actions, in a database you own.
- Rate limits. discord.js queues requests and waits out Discord's rate limits, so a 150-team setup takes a while. Run it the day after registration closes, not an hour before round one.
To see how the pieces fit before you decide, read how to host a tournament on Discord. When you are ready, send me your league's details and I will reply with a quote.