Invite & join codes
There are two ways to get players onto a season's roster. They work side by side — use whichever fits, or both.
You build the roster ahead of time — add each player as a slot — and the app gives every slot its own one-time code. Hand the right code to the right person; when they sign in and claim it, that slot becomes theirs. Best when you already know exactly who's playing and want their name/seed set up in advance.
One shareable link for the whole season. Post it in your Discord, a group chat, wherever — anyone who opens it signs in and lands on the roster as their own slot. Best when you're opening sign-ups and don't want to chase people one code at a time.
Using the join link
Open a season under Organize → Players and find the Join link on the roster. Copy it and share it. A player who opens it sees the league name, signs in with Discord (or email), and joins. Their roster name comes from their profile name; if someone already has that name in the season, the app adds a number so names stay unique.
Managing the link is organizer-only. Players never see the code itself — only the link does the work.
Approval (optional)
Off by default: people join instantly. Turn on Require approval and each join waits as a pending request instead. Pending players appear nowhere but your approval queue — not in standings (including the public standings link and the weekly Discord digest), the schedule, matchups, or finals — until you approve them on the roster. Decline removes the request entirely. If a Discord channel is connected, you get a ping for each new request (and the player isn't told when declined).
The cap
Every season has a join cap (default 48) so a stray link can't flood your roster. It counts every slot in the season — players who joined, slots you pre-made, pending requests, and your own organizer slot — so with the default you have room for 47 players plus yourself. Raise or lower it any time.
Someone signed up with the wrong account
It happens — a player claims their slot on an alt Discord account, or on whichever account the browser happened to be signed into, and nobody notices until they've played a few games. Fix it from the roster: find their row under Organize → Players and press Release in the Invite column. That unlinks the account holding the slot and gives the slot a fresh invite link — send them that link, they sign in with the right account, and claim it.
Everything on the slot survives the hand-off: their results and record, their photos, quest claims, faction, seed and groups all belong to the roster slot, not to the account that was signed into it. That's why releasing beats having them join again — a second sign-up makes a brand-new slot and leaves the games behind on the old one.
Their old invite link stops working the moment you release, so a leaked or misdelivered link can't be used twice. Their Discord handle and email stay on the row as your way to reach them; their avatar comes back when the new account claims the slot. You can't release your own slot.
Turning it off, rotating, expiring
Toggle Open for joining off to close sign-ups without losing the link. Set an optional expiry date and the link stops working after it. Rotate generates a fresh code — the old link immediately stops working, so use it if a link leaked or you want to cut off sign-ups for good.
Discord pings for joins post through the deployed site, so they fire on the live league, not local previews.