Organiser Manual
Last Updated: October 9, 2026
The Core Decision: Which Engine Runs Your Event
Everything else in this manual branches off this one choice.
TOM Import
TOM generates the pairings and holds the results. The tournament state travels as a .tdf file, Web → TOM → Web. Official reporting is unchanged from how you do it today.
Built-in Engine
BracketOps generates the Swiss pairings and the top cut itself. Players report results from their phones and standings update live. No TOM, no .tdf file.
You pick this in Manage Tournament → Pre-Tournament → Tournament Configuration → General → Tournament Engine.
1. Getting Started
Sign in with Google. You will be prompted to complete an onboarding profile (Name, Birth Year, and POP ID). Ensure your POP ID is correct — the system links tournament permissions to it. If your Player ID has played at BracketOps events under a different name, it waits for an in-person check before it is linked to your account (see Check a Player ID in section 4).
2. Creating the Tournament
This part is the same whichever engine you plan to use. Do not start in TOM.
Go to My Tournaments and click Create Tournament. The wizard runs Basics → Registration → Review, with an optional Advanced step you can open from the Registration step.
- Tournament Type: League Challenge, League Cup, Prerelease, Custom, VGC Premier Challenge, or Pokémon GO Tournament. Picking a type sets the game and a sensible set of defaults. Whatever you save becomes your default for that type next time you create one. Custom is for drafts, friendlies and other store events; TOM files it under the same type as a Prerelease, so these two are the only types you can switch between after creation, during and after the event too.
- Basics: name, date, start time, city, country, Sanction ID (TOM UID) and Organiser Player ID.
- Divisions & Capacity: an overall cap plus per-division caps for Juniors, Seniors and Masters. Division birth-year cutoffs are pre-filled for the season the event date falls in (a season runs September to August), and follow the date if you change it, until you edit them yourself.
- Lists: require submission and set a cutoff in hours before start. The wording follows the game — Deck List for TCG, Team List for VGC and GO.
- Advanced: payment and outbound webhooks.
Under Advanced (or the Payment tab in settings afterwards):
- Choose a provider — Stripe (Payment Links) or Generic / Custom.
- Give each division its own payment URL. While payment is required every division needs one; a division without a link can't take registrations.
- Registering on a paid event holds a seat for the player until the payment is confirmed. Confirm it with Mark paid in Roster Management, or set a webhook secret so successful payments confirm automatically. Held seats don't expire unless you set Release unpaid holds after N hours in Settings → Waitlist & seating. Players can tap I've paid, which keeps their seat while you check.
- In the Payment tab, set the Currency and each division's price, as the division's link charges it. With Stripe, also set each division's Payment Link ID (in the Stripe Dashboard under Payment Links; it starts with
plink_). A payment confirms automatically only when it is in that currency and at least that price, and a Stripe payment only when it came through that division's Payment Link. - Anything else is not confirmed: a declined payment; a payment for less (a cheaper link or a discount code), in another currency, or through another Stripe link (another event's, or anything else you sell in the same Stripe account); a free Stripe checkout; and any payment for a division with no price, or with Stripe no Payment Link ID, set. While the player holds the seat it shows as Payment not confirmed on their row. If their hold has already ended (expired, released or withdrawn), it shows in an alert at the top of Roster Management and on their row instead. Check it with your payment provider, since the money may have been taken: refund it, or accept it with Mark paid while they hold a seat. While players hold seats, Settings won't change the currency, raise a division's price or change its Payment Link ID, since they may already have paid.
- With Generic / Custom, your payment system POSTs JSON to the webhook endpoint, signed with the webhook secret (HMAC-SHA256 of the raw body, hex, in the
X-Webhook-Signatureheader):callback_tokenfrom the player's payment link,status(successorfailed), an optionalreference, and for a success theamountpaid in minor units (1500 for 15.00) and itscurrency(such as NZD). Only sign payments your system actually took.
A calendar for planning the season across your venues, which can turn a planned date into a draft tournament. For now it is admin-only: it sits in the avatar menu under Admin Functions as Schedule Planner, and ordinary organiser accounts do not see it yet.
- Stores: on the Stores tab, add each venue you schedule for with a name and a region. Active stores become the rows of the Quarter view, and entries attached to a store inherit its region and venue name.
- Play! Pokémon League ID: optional, digits only. Enter the number from the end of the league's page address on pokemon.com (for example 6241858). A store name is not enough on its own, because one shop can host several separate leagues; the ID is the stable key back to the right one. As soon as you type an ID the dialog builds an Open the official page link so you can check it. Leagues registered from 2025 on have 8-digit IDs and no public page, so for those the link will not open anything useful.
- Entries: a planned event on the calendar with a title, date, event type, store (or an external venue) and optional times and notes. Add one with New entry, or hover a day in the Month view, or an empty day in a store row in the Quarter view, and click its plus. Tick Share with other organisers to let them see the title, date, time, kind, venue and region; private notes are never shared.
- From entry to tournament: open a saved entry, pick a Tournament type in its Linked tournament section and use Create tournament from this entry. The type starts empty and the button waits for it: it is not taken from the event type of the entry, because a tournament cannot change type later (except between Prerelease and Custom). It creates a private draft (not published, registration closed) that copies the title, date, start time and store from the entry, takes the city from the store's City field (or, failing that, the entry's region group and then its region), and takes capacities, list requirements and online reporting from your saved defaults for the type you picked. Only entries for events you run qualify (League Challenge, League Cup, Gym Leader Challenge, Prerelease, Custom, VG Cup, VG Challenge, VGC Premier or GO Premier). The Sanction ID (TOM UID) is left blank for you to fill in once the event is sanctioned. The same section can instead link an existing tournament of yours to the entry.
3. The Tournament Dashboard
Manage Tournament is split into four tabs. Knowing which tab holds what saves a lot of hunting on event day.
Pre-Tournament
During Event
Announcements
Post-Tournament
Quick settings, under the status widgets, open or close online registration and switch required deck or team lists on or off in one tap. Each switch saves the moment you flip it, with no Save button. They show while the event can still be set up, and go away once it has matches, finishes or is cancelled. Registration can only be opened before TOM starts the event. Turning lists on sets their deadline from the start time and the cutoff in Tournament Configuration.
The header of the page also carries Print QR Poster, Print Team Sheets (VGC events only), Original TDF (TOM events only), and Cancel Tournament — which becomes Restore Tournament once an event is cancelled.
4. Before the Event
Get every player onto the roster before you export or pair anything.
- With registration open, players get their answer when they register: a seat, a held seat (paid events), or a place on the waitlist with their number in line. Waitlisted players are moved in automatically, in order, when a seat frees up or you raise a cap.
- Roster Management groups players into Seated, Held, unpaid, Waitlist (in line order) and Out. Use Seat to move a waitlisted player in yourself; on paid events this holds a seat until they pay.
- Adding a player by hand: under Add New Player, type the player's complete Player ID and press Look up. Ask the player for it — it's on their BracketOps profile page. A match shows their first name and last initial, with Add to roster; a partial or wrong ID finds no one. Only a player with a BracketOps account and a complete profile can be added this way, in the age division their year of birth gives at this event. Players without an account come in with the TOM file.
- Removing a seated or held player seats the next person in line automatically, and the toast says how many moved up. Removing a player also deletes their submitted list.
- A player in Out cannot be put back by you. Withdrawing and removing are one-way for the organiser: the roster's status button is only the check-in toggle now, and adding the player by hand fails because they already have a registration for this event. The way back is for the player to register again on the event page, which re-activates their row — but it takes a new number at the back of the waitlist line, so they lose their old place and are seated only when a seat is free. Tell the player that before you remove them.
- The widgets at the top of the tab track seats taken (held seats count), checked in, lists submitted, held unpaid, waitlisted and not attending.
- Pause automatic seating (Settings → Waitlist & seating) stops the waitlist from moving on its own. New registrations then join the waitlist, and you seat players by hand.
Before round 1, the public tournament page is the player roster itself (the Roster view that appears once there are pairings has no check-in). As an organiser you get a Check In button per player, with Undo if you tap the wrong row.
Use Staff on the Pre-Tournament tab. Judges get a dedicated dashboard where they can issue penalties, grant time extensions, record deck checks and review submitted lists.
To add a judge, type their complete Player ID under Add Judge and press Look up. A match shows their first name and last initial, with Add as judge. A judge needs a BracketOps account with their Player ID on their profile. You can add yourself.
Judges can help with check-in, but only you or an admin can seat or remove players and confirm payments.
Link a player's Player ID after you have seen their Play! Pokémon ID in person.
- Why a player needs it: when a player enters a Player ID that has played at BracketOps events under a different name, BracketOps doesn't link it automatically. Their home page and profile show Player ID check pending with a 6-character code, such as K7P-2QX. Until the Player ID is linked, their registration card says they can't register online yet, and Add New Player can't find them. Check their Player ID, then add them by Player ID; at a TOM event you can also enter them in TOM, like a player without an account.
- Where: the Check a Player ID card at the top of the right-hand column of the Pre-Tournament tab. It shows from the day before the event's date to the day after (New Zealand dates), and not once the event is cancelled. Only you and admins can use it; judges can't. It still works once rounds are running, but the dashboard then opens on During Event, so switch to Pre-Tournament.
- How: look at the player's Play! Pokémon ID yourself. Type the Player ID from it, not from their BracketOps screen, and the code from their BracketOps screen (capitals and the hyphen don't matter), then press Check. The card says it too: Only after you have seen their Play! Pokémon ID in person. If you are not sure the Play! Pokémon ID belongs to the person in front of you, don't check it.
- The answer is one of three:
- Linked — they can now be added by Player ID: the Player ID is on their account now. They can register online while registration is open, and Add New Player finds them.
- Recorded — an admin will finish this: the Player ID can't be linked here, for example because another account already holds it. A BracketOps admin settles it; there is nothing more for you to do.
- That Player ID and code don't match a check waiting here. The same answer for a wrong code and for a Player ID with no check waiting.
- The card never shows who is waiting: no name, email or year of birth, and no hint whether anyone has asked for that Player ID at all.
- Type carefully. After five checks of a Player ID that don't match, the player's code stops working and the check passes to an admin. A Player ID or code in the wrong format is refused before it counts.
5a. Running the Event with TOM
- Open the Export Tournament File card on the Pre-Tournament tab.
- The card tells you exactly how many players will be written to the file. Read that number before you click.
- Click Download .tdf File and save it to your computer.
Three things about this button that are easy to miss:
- Downloading the file closes online registration for the event.
- If anyone has been checked in, the export contains only the checked-in players — everyone else is silently left out. Either check everyone in first, or undo the check-ins before exporting.
- Held and waitlisted players are not in the file. Pause automatic seating when you export (the dialog offers it), or players seated afterwards won't be in TOM.
- Open the TOM desktop software.
- Select File -> Open Tournament and pick the downloaded
.tdffile. - CRITICAL: go back to Step 1 in TOM and confirm these are right before you proceed:
- Tournament Mode
- Game Type
- Name
- Sanctioned ID
- City, State, Country
- Verify all players appear with the right POP ID and birth year, then Create Pairings for Round 1 and Save in TOM.
Publish your pairings online, and keep them updating for as long as TOM keeps saving.
- Use desktop Chrome, Edge or Opera on the computer that runs TOM. Other browsers cannot watch a file on disk, so the card shows Browser Not Supported instead of a file picker.
- Return to the dashboard and open the During Event tab. Switching between the dashboard tabs does not interrupt the sync; leaving the page does, although the file stays remembered.
- In the Auto-Sync Uploader, click Select TDF to Auto-Sync and pick the active
.tdffile you are using in TOM. Before the first file is chosen a short privacy notice reminds you that competitor names and age divisions go on a public page; that is a one-time confirmation per event (it comes back if you restore a cancelled event). - Keep this browser tab alive.
- Pin the tab, or add the site under Chrome's Settings > Performance > Always keep these sites active. Covering the browser with TOM is fine: the file is checked every second even while the tab is hidden.
- Every time TOM saves the file, the change is uploaded and players see the new pairings and results on their phones. A result you have typed into TOM reaches the site when TOM next writes the file — its 5-minute autosave, a round action or File > Save.
- If Chrome pauses the tab, the sync pauses with it. Open the tab again and it catches up at once, with a banner saying how long the pause lasted. If Chrome unloads the tab altogether, the page reloads with a red banner and either resumes on its own or offers a Resume button.
- A reload during the event picks up the same file without choosing it again, and the sync usually resumes on its own with a toast saying so. Coming back the next morning (more than 12 hours after you chose the file) never restarts the sync by itself: the card offers to resume the remembered file, and Chrome may ask you to allow reading it again.
- Check on the sync from the tab strip: while it is healthy the tab title starts with Sync OK and the time of the last successful upload (or of the last TOM save that needed nothing sent), and it switches to SYNC RETRYING or SYNC STOPPED when something needs a look. The status line on the card shows when the file was last checked and when the last upload went through. Update sent means the refresh signal went out, and the open pages of signed-in players and staff refresh at once. If it says the update was not sent, viewers still refresh within seconds through the fallback: signed-in players and staff through the change events on their live channel, and spectators on their next poll (about ten seconds).
- Read the banners: an amber Waiting for another sync or TOM has not finished saving the file banner means auto-sync is waiting on something and will recover on its own. An amber Connection Issue banner keeps retrying for about a minute (six tries); if the connection is still down after that, the version is parked and the red This TDF version was not applied banner appears, and nothing is sent again until you press Retry with the connection back, or save again in TOM. Other amber notices (an older TDF ignored, another tab already syncing, the file not found) tell you what to do. Whatever the reason for the red banner, Retry or a fresh save in TOM clears it. A Sync Error means the sync has stopped, most often because the wrong file was picked, file access was lost, or you were signed out; fix the cause, then resume or select the file again.
- Only one tab can sync a tournament at a time. If a second tab starts syncing the same event (it resumes on its own, or you press Resume there), that tab says another tab is already syncing; click Take over to move the sync to the tab in front of you.
- When the event is over, click Stop Syncing. The file stays remembered, so a later visit offers to resume it, but the sync never restarts by itself.
.tdf from wiping your waitlist and the deck lists you have collected.Let players report their own results, then scan the agreed result into TOM instead of typing it.
- Turn on Enable Online Match Result Reporting before any pairings exist: in Tournament Configuration → General under Match Reporting, or in the wizard's Registration step. Once the event has matches the setting is read-only.
- Players report from the Dashboard view of the public tournament page with I Won, I Lost or Tie. The Tie button is hidden for Pokémon GO events and for top-cut matches, where TOM has no tie slip either.
- When both players have reported and their reports agree, and TOM does not yet hold a result for that match, the match card in the Pairings view shows a green box with the agreed result — the winner's name followed by Wins, or Match Tied — and a barcode under it. Only organisers, admins and assigned judges see it, on the public tournament page (choose the division, then the round); players and spectators do not. Confirmed matches are sorted to the top of the round for staff.
- The barcode is the same match-slip code TOM prints on its own slips, so scan it into TOM exactly as you would a paper slip. The key is printed underneath in case the scan fails and you need to type it.
- Once TOM's own result for the match arrives through auto-sync the green box disappears and the match card stays in the list, now showing TOM's result. Until TOM next saves the file and that save syncs, the barcode is still shown, so do not scan a slip you have already scanned. The green box also goes away if either player retracts or changes their report, in which case the row shows that it is waiting for the opponent or that the reports conflict.
- Top cut is excluded: a confirmed top-cut match still shows the agreed result, but without a barcode, and you enter it in TOM by hand.
- If you would rather type every result into TOM yourself, turn off Match-slip barcodes at the top of Tournament Configuration, under Publish. The green box still shows the agreed result, without the barcode. The switch appears on a TOM event with online result reporting on, it is on by default, and it can still be changed once the event has matches.
The Upload TOM page sends one .tdf file to BracketOps, once. It is the exception to starting in BracketOps: for a tournament you have not set up here, the file creates the event.
- Where: Upload TOM in the bar under the page header (on a wider screen; a phone does not show it there), or Organiser TOM Upload under Organiser Functions in the avatar menu, on any screen.
- Your Player ID: BracketOps accepts a file from you only when TOM lists your Player ID as the tournament's organiser. The page shows the Player ID it checks the file against. With no Player ID on your profile it accepts no file: add it on your Profile first.
- An event already set up in BracketOps: use the Auto-Sync Uploader on its Manage page instead (Step 3). It sends the file to that event, and every save after it. The Upload TOM page updates an event of yours only when that event already has the file's Sanction ID, or exactly the file's tournament name and start date. Any other file creates a new event.
- How: choose the file and set Publish Tournament. It applies to a new event, or one that has not started yet; later uploads keep the event's current visibility, except that turning it off still hides it. Tick the box to confirm you have told the competitors in the file that their name, division, pairings and results will be on a page anyone with the link can view, then press Upload Data. After a successful upload the page links to the event's Manage page, where you carry on as usual.
- If it is refused: when the file lists a different organiser Player ID, correct it in TOM, save the tournament, and upload the file again. A Sanction ID that is already on another organiser's event stays with that event, and no upload can move it to you.
- Nothing is sent again when TOM saves the file later. To keep the event updating during play, use the Auto-Sync Uploader on its Manage page.
5b. Running the Event with the Built-in Engine
No TDF, no TOM. Everything happens on the During Event tab.
In Tournament Configuration → General, set the engine to Built-in Engine and fill in Swiss Rounds:
- 0 — straight single elimination, no Swiss.
- 3 or more — that many Swiss rounds, optionally followed by a top cut.
Turn on Enable Online Match Result Reporting if you want players entering their own results.
The Round Control card walks one round at a time, and its badge always shows where you are:
- Generate Pairings — builds the round. Badge: Pairings Ready.
- Start — releases the round to players. Badge: Round Active.
- End Round — stops accepting results. Badge: Finalizing.
- Finalize Round — the finalisation card sorts every match into Auto-confirm, Penalty Review, Conflict and Missing. Auto-confirm matches are pre-resolved; you decide the rest. The Finalize button unlocks once nothing is outstanding. Badge: Finished.
Repeat until the last Swiss round is finished.
After the final Swiss round you get two choices, both on the Round Control card:
- Generate Top Cut — shows the standings that will make the cut, and lets you set the base bracket size and an asymmetric bracket where the player count needs one. Then Advance Bracket after each cut round.
- Finish Tournament Without Top Cut — closes the event on Swiss standings alone.
A single-elimination event skips Swiss entirely: Start Single Elimination, then Advance Bracket round by round.
The Players card below Round Control lists everyone with their W-L-T record, and separates active players from dropped players and people not in the event. Drop a player from there — a mid-event drop is recorded as a drop, not as a withdrawal.
6. Announcements and the inbox
The Announcements tab publishes a banner to players during the event. Give it a title, a type, one line of banner text, and optionally a longer description in Markdown that players can expand. The description keeps bold, italics, lists and headings, but images are not shown and links appear as plain text. You can show it to everyone, or only to participants, spectators, organisers or staff; BracketOps applies that choice on its server, so nobody outside the audience you pick is shown it. Only one announcement is active at a time.
Your own inbox
BracketOps writes to your inbox when something happens to you: registration changes for events you play in, being added as a judge, an admin cancelling an event you run, an admin changing the type, Player ID or year of birth of your account, replies to requests you have sent the admins, and announcements from the BracketOps admins. It is not a messaging system — nobody can send you a message, and you cannot send one to a player.
You cannot message your players. The banner above is the only thing you can publish to them. Changes to an event's date, time or deadlines are not notified to anyone, so if you move an event, say so in the banner and tell people yourself.
Cancelling. Players who still had a place (including the waitlist) and your judges are told in their inboxes; you are told only when an admin cancels your event. That covers only account holders — about a third of players imported from a TOM file have no BracketOps account — so tell your registered players yourself. Restoring a cancelled event notifies nobody.
Your event's name appears in players' and judges' inbox notices, and updates there if you rename it. Don't use the name to send people a message.
Ask the BracketOps admins from your inbox (My requests › New request) for anything you cannot do yourself: deleting an event, handing one to another organiser, a Sanction ID already in use, a template you cannot remove, or setup that looks wrong. A hand-over also needs the receiving organiser to send their own request — “Hand an event to another organiser”, with no event attached — quoting your request number; without it the admins decline. For a problem during a live event, keep running it from TOM: the admins are not on call.
7. Decks, Teams and Printables
Deck Lists (TCG)
Team Lists (VGC)
Team Lists (Pokémon GO)
QR Poster
8. After the Event
Final Standings
Once the event is complete, its page opens on the Results view (the final standings) for everyone who can see the event. A signed-in competitor sees their own division's tab first and is scrolled to their own placing; everyone else starts on the Master tab, or on the first division that has players when there are no Masters. A Pokémon GO event has no age divisions, so its standings are a single Open tab. The Auto-Sync Uploader stays available after completion, so a result you correct in TOM and save goes online as well. People already looking at the page while the event completes see the final results by themselves; after that, a completed event's page no longer updates by itself, so a result you correct later shows for them when they reload the page. A completed event stays complete, unless TOM pairs a new round (for example the first round of a top cut you set after Swiss had ended); a correction to results, standings or the roster never re-opens it.
Who can see it is up to the Publish switch at the top of Tournament Configuration, which still works after the event has finished. A published event and its results are public: listed on the site and open to anyone with the link. Open registration also makes an event public (listed and open to anyone with the link), but only until it finishes, and finishing never publishes it. Otherwise, an unpublished event is visible only to staff (you, your judges and admins) and registered players. For a TOM event, the first TOM sync publishes it, however far the event has got in TOM, and so does the first sync after a restore; turn Publish off afterwards to hide it, and later syncs keep your choice.
Penalty Log
Original TDF
Cancelling an Event
9. Privacy and Data
- Uploaded TDF files are archived privately and unchanged, so the organiser can download the file and report results with it. The file carries a year of birth per player and nothing more precise: TOM writes a fixed placeholder for the month and day.
- Archives stop being downloadable seven days after the last sync and are deleted by a daily automatic clean-up, normally within a day after that.
- Public pages show reduced player names. Full names stay visible to the organiser and judges only.
- Player IDs are not shown on public pages. They are visible to the player, to the organiser and judges of an event the player is in, and to BracketOps admins. You can look someone up only by typing their complete Player ID, to add them to your event or make them a judge; you see only their first name and last initial, and a partial or wrong ID shows nothing. Email addresses and years of birth are visible only to the person and to BracketOps admins; a player's year of birth reaches you only inside the tournament file you export to TOM. If you set up a registration webhook, it also receives registrants' Player IDs.
- When you check a Player ID with Check a Player ID, BracketOps records who checked it and at which event. Section 3 of the privacy page tells players the same.
- A cancelled event keeps its page, but its roster and pairings are no longer shown.