00Leagues

A season, not a tournament
you run again.

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

A cycle ends on your word.

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.

Three levels that stay separate

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.

Set the season's shape up front

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

The public page can't rank your players.

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.

Box 24 of 10 matches played
  • Amrita S.
  • Dev P.
  • Joanne M.
  • Marcus T.
  • Priya R.
Neutral boxes
Box 1 to Box N, and no tier words. When you move, your surfaces say “moved up to Box 2” — a direction between two neutral boxes, never promoted, relegated, better or worse.
Bands are peers
In a team league the court bands are factual — Court 1 to Court N. Court 4 plays its equals; it is not the B team, and nothing in the product calls it one.
Nobody is quietly benched
Availability is the player's to set and the player's to retract, the whole team can see the grid, and it records who marked each answer. “Unsure” is a legitimate answer, and “hasn't answered yet” is kept separate from it — because one you persuade and the other you remind.
Captaincy needs consent
A player-captain is designated, invited, and captain only once they accept — including when you set it yourself. There is no route that makes someone responsible for a team without their say.

03Box ladders

Both movement modes, in a browser.

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.

Stay in box

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.

Cross box

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

Singles, pairs, or rotating

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

Time bands, or players' own time

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

Substitutes that don't corrupt it

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 season that finishes honestly

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.

On paper, for the wall

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

A draft, a roster, and a lineup every week.

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.

The draft
A turn-ordered snake pick over the rating-seeded pool. It picks by slot — Team 1 to Team N — so it works before any team has a captain or a name. You can pick for any team at any time; a captain can pick for theirs on their turn. Every pick is one row appended, so undo removes exactly the last one.
Asynchronous on purpose
Not a live draft room. A pick is a single server write and the board polls, which is what makes it survive one laptop on club wifi. Round one’s order is a seeded shuffle whose seed is stored — so “who picked first” is fair, and re-checkable afterwards.
Bands, per player
Every drafted player gets a home band, and you can widen the set of bands they’re allowed to play in, player by player. The default is their home band alone — you open it up where it makes sense, rather than the product assuming a rule.
The lineup
The roster is the season; the lineup is the fixture. The picker answers “who can play Court 3 this week?” by joining three facts — who is available, which bands they’re allowed, and whether they’re already down on another court. Gaps get filled from the sub pool, and the points still go to the team.

Scoring that matches how your club actually plays

One configuration shape, three models, chosen by how a match ends. No migrations, no per-club forks.

Squash

Played to completion, flat

A point for winning the match, and nothing else, ever.

Pickleball

Played to completion, per game

A point for every game won inside the match.

Club tennis

Time-boxed

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

A season you can follow from your phone.

Every one of these opens from an email link, on a phone, without an account.

/box

Which box am I in, how does my box stand, and who do I still owe a match. Single column, phone-first.

/team

Your 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.

/captain

Asked to captain: decide first, set up after. Accepting hands over to a real account, because captaining is a weekly job.

/me

Every competition you're in, with the league-shaped facts — your box, the cycle, what you owe — and your season trajectory across the cycles.

.ics

One 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

One subscription. Every league your club runs.

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.

See pricing in full →

Running leagues

$64.99 CAD / month

Your first league is free.

  • Renews monthly until you cancel. Finishing a league doesn't end it — you do.
  • Cancel any time and you keep access to the end of the period you've paid for.
  • Enrolment fees are charged on your own Stripe account, so the money is yours and a refund debits you.

07Shared with Tournaments

Not a lighter version of anything.

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.

Your first league is free.

Set up the divisions, plan the cycles, and publish when the checklist says you're ready.

Create a league →

Or browse competitions near you.

Running a one-off event instead? Tournaments.