courtScore

How It Works

Why courtScore?
Running a pickleball session by hand means spreadsheets, uneven matchups, and someone constantly doing the maths. courtScore handles all of that automatically: the schedule is generated instantly, standings update live as scores come in, and results are emailed to every player at the end. No accounts, no setup friction. Just open the app and play.
Rotating Partners: how scheduling works
The Rotating Partners schedule is built around three guarantees:
  • Every partnership, once. Each player partners with every other player at least once before anyone repeats a pairing (within their own group, if the tournament is split into groups). No two players are stuck together all session.
  • Every matchup, once. Each pair of players faces every possible opponent pair at least once before the same opposition is repeated. The competitive variety is maximised.
  • Balanced court time. Game counts stay as equal as possible across all players. Nobody watches from the sidelines while others play five games in a row. When players do sit out, they are given priority in the very next game.
  • You choose the length. Where a complete round robin works out to exactly the same number of matches for everyone, that is the default, so every pair partners exactly once (within their own group, if the tournament is split into groups). Where it would not - some players a match ahead of others - the app doesn't offer it as the default; instead it defaults to the lowest match count that splits your group exactly evenly. Either way, with Custom setup you can set Matches per player yourself - fewer for a shorter session, or more than a complete round robin, in which case partnerships start over in a fresh balanced pass rather than repeating at random.

A note on exactly equal game counts: a complete round robin works out to the same number of matches for everyone only when the group size divides evenly. At any other size some players would end up a single match ahead of others in a plain round robin, and that is a matter of arithmetic rather than a flaw - the matches simply cannot be split any more evenly at that exact match count. It usually isn't the last word, though: going past the round robin, into a fresh balanced pass, reaches an exactly equal count at most group sizes, and the setup screen defaults you straight to the lowest such number rather than asking you to hunt for it. It also tells you which numbers land exactly even for your group, up to 20 matches per player, in case you want a different one. The rare group size with no equal split available at all still runs a plain round robin, with the uneven split stated plainly rather than glossed over.

Guided setup (Custom, with Rotating or Fixed Teams) works out that whole picture from the constraints you'd actually know before an event: how many players, how long you have the venue, how many courts, and how long a match takes. It multiplies how many rounds fit by the number of courts to get total matches, divides that by four to get a per-player budget, and finds the highest exactly-equal match count within that budget - the same table used for the "exactly equal" default above, so the two can never disagree. Splitting into groups doesn't change how many matches fit, since courts are shared across every group, but it does change which count comes out exactly equal - sometimes higher, sometimes not at all - so Guided checks every reasonable group layout and only suggests one when it clearly beats a flat pool. A playoff bracket is only suggested by default when it costs the round robin nothing; anywhere it would trade away matches, Guided leaves the choice to you rather than asserting a pick it can't fully justify. If you'd rather set the actual dates and times than guess at a total, Guided lets you - it derives the time budget from the sessions themselves (a session running 8 to 11pm reads as 180 minutes), so there is never a total on screen that could disagree with the calendar under it.

Fixed Teams is the same idea solving for a different unknown. There is no matches-per-team budget to search, because a group of teams plays every pairing exactly once: a group of 6 is 15 matches and 5 each, and the size decides both. What Guided works out instead is how many groups the time allows, and the arithmetic is steeper than it looks - a flat field of 12 teams is 66 matches, which is more than eight hours on two courts. It walks the splits from largest groups down and takes the first whose whole round robin fits, so you get the most play the hall actually affords. Only even splits are considered, for the same reason Rotating refuses an uneven round robin: 12 teams as 5 + 4 + 3 would have teams playing 4, 3 and 2 matches. Where no even split fits, it says so rather than handing some teams an extra match. A playoff bracket follows the same "only when it is free" rule, though here it is simpler, since a Fixed Teams round robin cannot shrink to make room - the bracket either fits alongside it or it doesn't.

When the numbers give a real but thin tournament, courtScore says so plainly, that "2 matches each is what your numbers actually allow", and still lets you create it, since a small tournament is still a tournament. Only when no split reaches an exactly-equal count at all does it stop you: that message says plainly that it isn't possible with the numbers given, and what would change it - another court, more time, or shorter matches - rather than describing a real, playable outcome and an impossible one in the same tight language.

Fixed Teams: how scheduling works
Fixed Teams uses a true round-robin: every team plays every other team exactly once, in a randomised order. The schedule is generated once when the tournament is created, with nothing to configure and no team getting an easier draw than another.
Manual: no algorithm at all
Manual mode skips scheduling entirely. There's no roster step and no automatic pairing; the organizer adds every game by hand from the fixtures page, picking all 4 players each time from the same player search used elsewhere. This suits sessions where the organizer wants full control over who plays whom, or where players show up gradually rather than all at once.
Playoff seeding: how it's built
The Playoffs tab offers a Direct Final, Semifinal + Final, Quarterfinal + Semifinal + Final, Round of 16, or Round of 32 depending on how many players or teams are in the tournament. Every round up through the semifinal shows up there; the championship match itself lives in its own Final tab. In Rotating mode, entrants are ad-hoc teams built from the standings: for a playoff field of N teams drawn from the top 2N players, team i gets rank i and rank i+N as partners (a Direct Final's Team 1 = rank 1 + rank 3, Team 2 = rank 2 + rank 4). Fixed Teams mode uses the top N existing teams directly.

Matchups follow standard tournament seeding, so the strongest entrants can't meet until the final (in an 8-team field, seed 1 faces seed 8 first, not seed 2). Winners advance to fixed playoff positions with no re-seeding between rounds - and importantly, they advance as the same pair. Round robin is where partners rotate; the playoffs are different on purpose. Once a team is formed for the quarterfinal, that partnership is locked in for as long as they keep winning - the same two players play the semifinal together, and the final too, if they get that far. Only the opponent changes each round, never the partner. Think of it as: round robin decides the seeding, then it becomes a mini fixed-teams tournament for whoever made the playoffs.

Example with an 8-team field: Team A (seed 1 + seed 9) beats Team H (seed 8 + seed 16) in the quarterfinal. Team A - the exact same two players - then plays the semifinal, and the final if they keep winning. Each round must be fully scored before the next one generates, and quarterfinal/semifinal results don't affect the live standings - only round-robin games count there.
Best of 3 / Best of 5: how matches work
During Custom setup, round robin and each playoff round can independently be set to a single game, best of 3, or best of 5. A matchup is scheduled with every game it's guaranteed to need already in place, grouped together in one card: best of 3 gets both of its two guaranteed games up front, best of 5 gets its three. Only the conditional decider games are created as the match actually calls for them - a third game for best of 3 only if the first two split 1-1; a fourth for best of 5 if it's 2-1, a fifth only if it reaches 2-2.

The match stops as soon as one side has won enough games to make the outcome certain - a best-of-3 swept 2-0 never gets a third game, and a best-of-5 decided 3-0 or 3-1 never plays out the remaining games. In the playoffs, the side that wins the match (not any single game) is the one that advances to the next round. The round robin's format can be changed later from Tournament Settings, as long as no match has a second game scored yet - see the How To Use guide.

How each game counts toward standings depends on a choice made alongside the best-of format at creation: Each game (the default) records every game played as its own win or loss - a 2-0 sweep is two separate wins, a 2-1 split is two wins to one, and points difference is the total across every game played. Whole match instead records the whole match as a single win or loss for whichever side won it, with points difference still summed across every game actually played - so that same 2-1 split becomes one win, one loss, with the combined points difference of all three games. This choice is locked in at creation, applies to the whole tournament, and can't be changed afterward.

A round robin game (including an individual game inside a best-of-3/5 match) can also end in a tie - equal scores are allowed there, just not in the playoffs, where a bracket match always needs a winner to advance. A tied game contributes no win and no points difference to either side; if a whole best-of-N match runs out of games without either side reaching a majority, the match itself is recorded as a tie.
Courts: how rounds are derived
The round robin generator schedules matches as one flat sequence - it doesn't group games into batches that are guaranteed to be conflict-free if played at the same time. Turning on "Assign courts to games" runs a separate step on top of that sequence: matches are walked in schedule order and packed into "rounds" of up to however many courts you set, skipping a match into the next round whenever one of its players is already in the current one. That's what guarantees no player is ever shown on two courts at once - it's derived after scheduling, not baked into it.

Courts apply to both the round robin and the playoffs, but round numbering in each stage is independent - Playoffs' court-rounds for the Quarterfinal stage, say, have nothing to do with the round robin's, and restart fresh for the Semifinal stage too. If the round robin is split into groups, every group shares the same pool of courts instead of each getting its own - Group A's next match and Group B's next match can run on different courts at the same time, so a court never sits idle just because one group ran out of players to fill it alone. The Final is always a single match, so it never gets a court label. A best-of-3/5 match's games all share one court and one round - it's the match, not the individual game, that's the scheduling unit.

Turning courts on or off, or changing the count, from Tournament Settings only touches matches that haven't been scored yet - anything already decided keeps its original court as a historical record, and newly-affected matches get renumbered starting after the highest round any of that history holds, so the two never collide.

Court numbers can also be given a name - a venue that hands out courts 5 and 8 rather than 1 and 2 needs a way to say so. This is purely cosmetic: it changes what a court's badge displays, never which court a match is actually assigned to or how rounds are packed. Shrinking the court count from Tournament Settings drops any name past the new count; growing it never renames an existing court or shifts a name onto a different one.

Once there are two or more of these derived rounds, the Round Robin tab offers a Round filter alongside the group tabs, so you can jump straight to what's currently on court instead of scrolling the whole list. It only ever filters within one group's own games at a time, since a group's round numbers are the only ones drawn from that group's own shared pool of courts - see the group-sharing point above.

Add Game follows the same logic: a new match can only ever join the round currently being played or start the next one, so it only appears on All or on the last round's own tab, never an earlier one. Once that last round already holds as many matches as there are courts, Add Game is replaced by Add Round, which fills the entire new round in one action instead of one match: it repeats the single-match generator once per court, each pick excluding whoever a previous pick this round already used, so the fairness algorithm can never double-book a player within the round on its own. The only way a pick doesn't join the round is the shared court pool itself running out of room (a grouped tournament pools courts across every group for the group stage, the same sharing described above) - when that happens, or when no more non-conflicting pairing exists for the remaining players, it stops rather than opening a second round, so one Add Round click is always scoped to exactly one round. It then jumps your view to that round, so nothing it created is left invisible behind whatever you were looking at.
Schedule: how times are worked out
A scheduled tournament is a list of sessions, each one a date and a time window, such as four Tuesdays from 8pm to 11pm. Slots come straight from the same rounds the courts feature already produces: a round is a set of matches that can be played at once without anyone being double-booked, so a round is exactly what a time slot is. Rounds are laid into the first session until it is full, then the next, and every match in a round shares its start time because they are played simultaneously. With courts turned off there is one match at a time, so matches simply run one after another.

Times are worked out from the length you set per match, which covers a whole matchup rather than a single game, so a best of 3 needs no separate arithmetic. If your sessions can't hold everything, the setup screen says so while you are still planning and suggests either more sessions or a shorter match length, whichever is actually sensible: squeezing 33 matches into one evening technically means five-minute matches, which is not a real answer.

Session times are stored as the local time at your venue together with your timezone, not as fixed moments. That is what keeps an 8pm session at 8pm every week even if the clocks change partway through a tournament running over several weeks. Match times are shown in each viewer's own local time, so a player travelling still sees the right moment, while the printed PDF uses the venue's time since that is where it is read.

The schedule is a guide and never a gate. Scores can be entered at any time in any order, nothing unlocks or locks at a slot time, and times are not silently rewritten if an evening overruns, because a schedule that quietly changes is worse than one everyone knows is an estimate. Changing the match length from Tournament Settings re-times every match that hasn't been played yet; if a longer match length no longer fits your sessions, you're told exactly how many matches lost their time rather than finding out silently, and can adjust from there. Changing courts, or generating a playoff round, re-times the schedule the same way. A session's own date or time window can be edited too - tap it in Tournament Settings - and that re-times the schedule the same way as any other change, including reporting a shortfall if the new dates hold less than the old ones did.
Groups: pools and qualification
For Rotating and Fixed Teams tournaments, the organizer can split the field into named groups using Custom setup (off by default). Each group plays its own independent round robin - group members only ever face other members of their own group, with their own live standings. Groups can be filled in by hand, one roster per group, or - with Randomly assign into groups turned on - filled automatically: the organizer keeps typing one flat list, picks how many groups, and the app splits it as evenly as possible and shuffles who lands where, previewed on the Review step before creation. Fixed Teams keeps whole teams together in a random split - a team's two players are never separated into different groups.

Once a playoff size is set - either picked on the Playoffs tab when the group games are done, or locked in upfront during Custom setup - a set number of entrants qualify from each group by that group's own finishing position, guaranteed regardless of how the groups compare to each other. Any remaining playoff spots go to wildcards: the best remaining records tournament-wide, ranked by wins, then point differential, then head-to-head where the tied entrants met, then a fixed tiebreak as a last resort. Every group's winners are seeded ahead of every group's runners-up, and so on, so a strong second-place finish never outranks a weaker group's winner. Where possible, the bracket also avoids pairing two entrants from the same group in the very first round.

The Overall tab on Standings shows the combined ranking across every group, live from the start of group play. Once a playoff size is set, every tab - Overall and each individual group - marks who's currently qualifying: Q for a group-guaranteed spot, Q | WC for a wildcard - live off the current standings, well before the bracket is actually generated. A tournament without groups shows the same Q badge for whoever's currently in the qualifying spots by overall rank; without groups there's no guaranteed-slot vs. wildcard distinction to make, so it's always plain Q.
Scores sync across all devices
Every open fixture page checks for updates every few seconds. When any player or co-admin enters a score, all other views refresh automatically. A version check runs on every save: if two people try to score the same game at the same moment, the second submission is rejected and the screen shows the latest confirmed scores instead. No double-entries, no overwrites.
Fairness by design
Because every player faces the same spread of partners and opponents, the final standings reflect skill, not a lucky or unlucky draw. You can compare scores and rankings with confidence that the schedule didn't tilt the result.