Guide

League schedule generator: how to build a fixture list

Round-robin maths, byes, pool draws, and the constraints that turn a fixture list into a calendar. With a checklist to run before you publish.

What a fixture list has to get right

Writing a fixture list looks like a small job until you try it. Eight teams playing each other home and away is 56 matches. Every team has to appear exactly once per matchday, nobody should play three away games in a row, two teams cannot use the same pitch at the same hour, and the one referee who is available on Saturday morning cannot be in two places at once.

Most clubs solve this in a spreadsheet, discover a clash in week three, and spend the rest of the season patching it by email. The patching costs more than the original schedule ever did.

Round-robin: the format behind almost every league

A single round-robin has every team play every other team once. With n teams that is n × (n − 1) ÷ 2 matches, spread over n − 1 matchdays. Ten teams gives 45 matches across 9 matchdays.

A double round-robin — the normal league format — repeats it with the venues reversed: 90 matches across 18 matchdays for those same ten teams. The second half is usually the mirror of the first, so matchday 10 replays matchday 1 with home and away swapped.

Odd numbers of teams and the bye

With an odd number of teams, one team sits out each matchday. That is a bye, and it is arithmetic, not a problem to solve. Eleven teams means 11 matchdays with five matches each and one team resting, not 10 matchdays with a squeezed fixture somewhere.

What matters is that the bye rotates fairly, so no team rests twice before another team has rested once. The standard construction (the "circle method") does this automatically: fix one team in place and rotate the rest around it, adding a dummy team when the count is odd. Whoever draws the dummy that round has the bye.

Home and away balance

The circle method balances the totals — over a double round-robin every team plays half its fixtures at home — but it does not spread them evenly through the season. One team can still draw four consecutive home games while another travels three weeks straight. Nobody notices in a friendly competition; everybody notices in one with a trophy at the end. It is worth scanning the generated list for long runs and swapping a fixture or two by hand before you publish.

How long a season do you need?

Before you promise anyone a format, check the calendar can hold it. The matchday count is fixed by the team count. You cannot compress it, only spread it wider.

TeamsSingle round-robinDouble round-robinWeeks (playing weekly)
615 matches, 5 matchdays30 matches, 10 matchdays10
828 matches, 7 matchdays56 matches, 14 matchdays14
1045 matches, 9 matchdays90 matches, 18 matchdays18
1266 matches, 11 matchdays132 matches, 22 matchdays22
16120 matches, 15 matchdays240 matches, 30 matchdays30

Sixteen teams playing home and away is a thirty-week commitment before a single postponement. If your season is shorter than that, you need pools rather than one flat league.

Splitting into pools

A pool division — a poule, a group, a division — is how you fit a large field into a short season. Sixteen teams in one league is 30 matchdays; sixteen teams in four pools of four is 6 matchdays for the group stage, then a knockout between the qualifiers. The same field, a quarter of the calendar.

Three rules make a pool draw work:

  • Keep pools the same size. Unequal pools mean unequal matches played, which makes the qualifying table incomparable. If the numbers do not divide evenly, use points per match rather than raw points to rank across pools — or add a filler team.
  • Seed rather than draw blind. Rank the teams on last season's result, then deal them out in snake order — strongest into pool A, second into B, and back down the line. A blind draw regularly puts the two best teams in the same group, and one of them goes home in week three.
  • Decide the tiebreakers before you start. Head-to-head result, then goal difference, then goals scored is the usual ladder. Writing it down afterwards, when it already decides who qualifies, is how competitions end in arguments.

In Tornia each pool is its own tournament inside the season, so the teams register once and the standings are kept per pool.

Knockout brackets are a different problem

A knockout draw is not a round-robin with fewer games. It is a binary tree: 16 teams give 8 first-round ties, then 4, then 2, then a final — 15 matches, and every result determines who appears in the next slot. Two consequences follow.

First, only the first round can be scheduled in advance with real team names; everything after it is "winner of tie 3 versus winner of tie 4" until the results land. Second, if your team count is not a power of two, some teams need a first-round bye straight into round two — 12 teams means 4 byes and 8 teams playing in round one.

Turning a fixture list into a calendar

A generated fixture list has no dates on it. It says who plays whom in which round. Turning that into a calendar is a second, separate step, and it is where most of the real-world constraints live:

  • Recurring matchdays. Most amateur leagues play a fixed slot — every Saturday from 09:00, or every other Sunday afternoon. Rounds map onto those slots in order.
  • Venue capacity. One pitch fits one match at a time. Five simultaneous fixtures need five pitches, or staggered kick-off times, or both.
  • Blackout dates. School holidays, the national cup weekend, the week the clubhouse is booked for something else.
  • Referees. Usually the binding constraint in amateur sport, and usually the one discovered last.

Keeping these two steps separate matters. When a match is postponed you want to move that one fixture to a new date, not regenerate the whole competition and renumber every round.

How Tornia does it

Tornia generates the fixture list and places it on the calendar as two steps, so you can redo either one without losing the other.

  • Pick league or knockout and the teams. A league is generated as a single or double round-robin by the circle method described above, byes and all. A knockout is padded to the next power of two, so the byes are distributed for you, drawn at random, or in the order you registered the teams.
  • Give it a start date, the weekdays you play on and the kick-off times, and it places every round on the next matching slot, rotating through your pitches if you list them.
  • Assign venues and referees in bulk, or reschedule a batch of fixtures at once, rather than editing one match at a time.
  • Move a single postponed fixture without touching the rest of the schedule.

Holiday and blackout dates are not part of the generator today. Place the schedule first, then shift the affected round with the bulk reschedule.

From there the competition runs itself: scores get submitted and approved by whoever you gave that authority to, and the standings and player statistics recalculate on approval.

A checklist before you publish a schedule

  1. Confirm the team count. Adding a team afterwards changes every matchday.
  2. Decide single or double round-robin, and check the season is long enough for the result.
  3. Check nobody has more than two consecutive home or away fixtures.
  4. Check the bye rotation if your team count is odd.
  5. Overlay the blackout dates before you publish, not after.
  6. Confirm every simultaneous fixture has its own pitch.
  7. Confirm referee coverage for the first four matchdays at least.

Get those seven right and the season mostly runs itself.

Running a one-day event rather than a season? How to organise a tournament works the same problem backwards, from the clock.

Ready to kick off your season?

Set up your competition, invite your teams, and let Tornia handle the rest.