00Leagues
Enrolment, cycles and the season are three separate things here, and they never borrow each other's words. A cycle closes when you say it's over — not when the last two people finally play. Then the ladder moves, and you approve the move before anyone sees it.
Box ladders, team leagues and round robins. Pickleball, tennis and squash. First league free.
01The season model
There is no completion gate anywhere in the season module, and that is deliberate. Two people never got round to their match; the night still ends; the ladder still moves. Any tool that waits for 100% of matches has never run a club league.
01
You close the cycle
Whenever it is done. A washed-out week is marked void; a holiday is skipped. Both are first-class, neither is a workaround.
02
The engine proposes
It works out the reseed from the cycle's records — and a cycle nobody finished is exempt from movement, so bad data can't shuffle the ladder.
03
You ratify it
Nothing moves until you approve it, and you can override any of it. Movement is proposed, never applied behind your back.
04
The next cycle activates
With the new boxes in place. Close the last one instead and the season finalises: standings freeze, and the league completes.
Enrolment is the league's own window, with an early close if you want one. A cycle runs planned → active → closed, and exactly one cycle per division is ever active — the database enforces it, so “the current cycle” is never ambiguous. The season runs until no division has a playable cycle left.
Plan the cycles and their date ranges before you publish. For a team division, the schedule draw turns two numbers — how many teams, how many complete meetings — into the season's weeks, and shows you the shape first: how many weeks, how many fixtures, how many nights each team plays, and whether anyone gets a bye.
02Player dignity
A league ranks people by ability. Published carelessly, that is the cruellest thing a piece of software can do to a club — so the protection here is structural, not a note in a style guide.
The page's data has nowhere to put a position. No rank, no win-loss, no point differential — not hidden, not permissioned. Absent from the shape. A test holds it there, so it survives every refactor.
What a stranger sees instead is activity: who is in the box, alphabetically, and how much of it has been played. Nobody is ever rendered as last. You see your own position and record when you're signed in, because that is yours to see.
03Box ladders
Players are tiered into boxes of about five. Each cycle, everyone in a box plays everyone in that box. At the close, the box reseeds — and you choose what reseeding means.
Membership holds; only the order inside the box changes. Your finishing position is your last cycle's standing in your box. The quieter league, and the default.
Movement between boxes at every reseed, with a ceiling on box size — proposed by the engine, ratified by you, and overridable row by row before it takes effect.
01
A box ladder can run as singles, as fixed pairs who enrol as one entrant, or as a scramble where partners rotate every match and each person is ranked on their own record.
02
Set waves — time bands — and assign boxes to them, with advisory checks for court capacity and for the same person in two divisions. Or run the division self-scheduled and let players arrange it.
03
A stand-in fills a slot for one cycle, and the result belongs to the slot, never to the sub — so the reseed can’t mistake a guest for a movement. The reserve pool is free, and walk-ups work.
A box-ladder season finalises as a tiered ladder — Box 1 down to Box N, each box in its own final order — and deliberately does not crown a champion. Five people in Box 3 had a good season in Box 3. That is the true result, and it is the one the product reports.
Print the cycle layout as a poster — the boxes, who is in them, the wave times — and a grid score sheet per box, on the same masthead, sport pill and QR as everything else the product prints.
04Team leagues
Players enrol on their own and are drafted onto teams. A week's fixture is team against team, played as one court match per band. This is the part players talk about, and nothing else in racquet sports ships it.
One configuration shape, three models, chosen by how a match ends. No migrations, no per-club forks.
Squash
A point for winning the match, and nothing else, ever.
Pickleball
A point for every game won inside the match.
Club tennis
Sets won, plus a point for leading or being level in the set still going when the buzzer sounds, plus a deciding-tiebreak point — capped per court.
The at-the-buzzer fields exist only in the time-boxed model. They are dropped rather than zeroed, so a squash division can never reach that arithmetic at all. And a team league does end in a champion: a single-elimination playoff on one finals day, seeded from the frozen final standings, won on fixture points across the courts so a team advances.
05For players
Every one of these opens from an email link, on a phone, without an account.
/boxWhich box am I in, how does my box stand, and who do I still owe a match. Single column, phone-first.
/teamYour team, this week's fixture, the lineup, the availability grid. Same cards in the same order whoever you are — only the actions change.
/join“How do you want to join?” — asked before enrolment and aware of capacity, so a full division offers you the waitlist or the sub pool instead of a dead end.
/captainAsked to captain: decide first, set up after. Accepting hands over to a real account, because captaining is a weekly job.
/meEvery competition you're in, with the league-shaped facts — your box, the cycle, what you owe — and your season trajectory across the cycles.
.icsOne calendar subscription that keeps updating, with league round names respected — a week-five fixture is never labelled “Semifinal”.
Enrolling checks whether a division actually fits you as you go: gender is a gate, age is a floor and nothing more, and your rating is advice rather than a barrier. A missing detail never forces you to disclose it. The point is to route honest players to the right division, not to police them.
06Pricing
Leagues is a monthly subscription on your organisation, not a charge per league. While it is active you can publish as many as you like — the Tuesday box ladder, the winter team league, the summer round robin.
Running leagues
$64.99 CAD / month
Your first league is free.
07Shared with Tournaments
Leagues is the same platform, kind-aware — so none of this is thinner for a season than it is for a weekend.
Which means a club runs its whole year in one place: the Tuesday-night ladder and the summer open, the same members, the same money, the same emails, one public page listing both.
Set up the divisions, plan the cycles, and publish when the checklist says you're ready.
Or browse competitions near you.
Running a one-off event instead? Tournaments.