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 in the admin area 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.
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.