All Posts

How to Schedule a Round-Robin League (and a Free Generator That Does It for You)

The arithmetic behind a fair round-robin schedule, how to build one by hand in five minutes, and a free generator that does it instantly.

Every rec league starts in the same place. You have a list of teams, a field booked for eight Saturdays, and a captain already asking who they play first.

The format almost everyone lands on is the round robin: every team plays every other team once. It is the right default — no seeding arguments, no team eliminated in week one, and the final table means something because everybody played the same slate.

It is also more arithmetic than it looks, and the mistakes are the kind nobody notices until week six, when two teams have somehow played each other twice and a third has sat out three weekends in a row.

Here is how to build one properly by hand, and where to get one generated for free if you would rather skip to the schedule.

Start with the arithmetic, not the calendar

Two numbers fall straight out of your team count, and both of them decide things about your season before you pick a single date.

Games. Every pair of teams meets once, so a league of t teams plays t × (t − 1) ÷ 2 games. Ten teams is 45 games. That number is fixed — no amount of scheduling cleverness reduces it, and if your venue cannot host 45 games, the answer is fewer teams or divisions, not a better spreadsheet.

Rounds. A round is one slate in which every team plays at most once. With an even number of teams you need t − 1 rounds. With an odd number you need t rounds, because somebody has to sit out each time.

Teams Rounds Games per round Byes per round Total games
4 3 2 0 6
5 5 2 1 10
6 5 3 0 15
7 7 3 1 21
8 7 4 0 28
9 9 4 1 36
10 9 5 0 45
11 11 5 1 55
12 11 6 0 66

Read that table before you promise anyone a season length. Ten teams playing one round a week is nine weekends. Add an eleventh team and you are at eleven weekends for a league that is barely bigger — an odd count always costs you an extra round while playing fewer games per round. If your season is a fixed number of weeks, an even team count is worth recruiting for.

The circle method, by hand

There is one classic technique and it takes about five minutes with a pen.

Write your teams in two rows, the top row left to right and the bottom row right to left. Each column is a game. With six teams — Riverside Ravens, Harbor Comets, Northside Bolts, Eastway Titans, Lakeside Foxes and Midtown Miners — round one looks like this:

Ravens    Comets    Bolts
Miners    Foxes     Titans

Ravens play Miners, Comets play Foxes, Bolts play Titans.

Now the trick. Pin the top-left team and rotate everybody else one step clockwise around the loop: the rest of the top row shifts right, the team on the top right drops down to the bottom right, the bottom row shifts left, and the team on the bottom left comes up beside the pinned team. Round two:

Ravens    Miners    Comets
Foxes     Titans    Bolts

Read the new columns and rotate again. Repeat until you have t − 1 rounds.

Round Matches
1 Ravens vs Miners · Comets vs Foxes · Bolts vs Titans
2 Ravens vs Foxes · Miners vs Titans · Comets vs Bolts
3 Ravens vs Titans · Foxes vs Bolts · Miners vs Comets
4 Ravens vs Bolts · Titans vs Comets · Foxes vs Miners
5 Ravens vs Comets · Bolts vs Miners · Titans vs Foxes

Fifteen games, every pair exactly once. Two checks catch almost every hand-made mistake: each team should appear exactly once in every round, and exactly t − 1 times in the whole table. If a name shows up twice in one round, you rotated the pinned team by accident.

Odd numbers: invent a team that never shows up

If you have seven teams, add a ghost eighth called BYE and run the method on eight. Whoever draws the ghost that round sits out.

This is better than picking byes by hand, and not just because it is faster. The ghost rotates like a real team, so it meets each of your seven exactly once — every team gets precisely one bye, and no team ever gets two in a row. Handing out byes manually is exactly how you end up with the team that had three weekends off in a season.

What the circle method does not solve

The pairings are only half a schedule. Four things it will not do for you:

Home and away. Look again at the table above: the pinned team is listed first in all five rounds. The circle method balances opponents, not sides. If home really means something in your league — a home field, a home kit, first bat — swap the sides in roughly half the rounds after you generate, or the pinned team plays a full season at home.

Dates. A round is not a date. With two fields you can play two rounds on one Saturday, and your nine-round season becomes five weekends.

Constraints. The team that cannot play before 6pm, the field that is booked for a wedding on the 14th, the referee who works alternate weeks. No pairing algorithm knows about any of these; they are the reason the last 20% of scheduling takes 80% of the evening.

Double round robin. If everyone plays everyone twice, run the method once and then run it again with home and away flipped: t × (t − 1) games, over 2 × (t − 1) rounds with an even team count or 2 × t rounds with an odd one. Six teams becomes 30 games across 10 rounds — check that against your field time before you promise it.

Or let the free generator do it

We built the free round-robin generator so nobody has to do the pen-and-paper version unless they want to. Paste your teams one per line, up to 40 of them, and you get the full round-by-round schedule immediately.

  • No account, no email, nothing to install.
  • Byes are spread evenly, using the ghost-team trick above.
  • Download the whole thing as CSV, or print it — the page drops its navigation when it prints.
  • The result URL contains your team list, so you can paste it into your captains’ group chat and everyone sees the same schedule.

It runs the same pairing code LeagueHero uses to build real league schedules, so what you see is not a watered-down demo. If your season ends in a playoff, the bracket generator does the other half.

When a list of pairings stops being enough

A generated list is a fine season plan right up until the first change. Then someone has to retype it, and the version in the group chat and the version on the clipboard start to drift.

That is the part LeagueHero automates. It takes the same pairings and puts each game on a real date, time and field: you give it a start date and how many days apart the rounds are, it reads your venue’s availability windows, slices them into slots the length of your games, and fills them in. It will not double-book a field or put the same team in two places at once, and you see a full preview before anything is saved. Regenerate later and completed games keep their results.

After that, entering a score is the whole job — standings recalculate immediately, tiebreakers included, on a public page your players can check themselves.

Start with the free generator. If you find yourself pasting its output into three different places, that is what the platform is for.

Get the next one

One email when we publish

League-management tips and launch updates. No spam, unsubscribe anytime.

Run your next season on LeagueHero

Free to start · No credit card