How to run a fair alliance train rota

Almost every alliance ends up building the same spreadsheet: names down one side, the date each person last conducted, plus 21 days, and a column working out who's up next. It works until it doesn't. This is what the rules should actually be, and the three things that quietly break the sheet.

1. Start with a cooldown, not a queue

A queue looks fairer and is worse. The moment three people are on holiday, a queue has to be rewritten by hand — and whoever rewrites it is now the person deciding who rides, which is exactly the suspicion you were trying to avoid.

A cooldown says only: once you've had a train, you can't have another for N days. Twenty-one is the common choice. Everyone past their cooldown is eligible, and the rota picks from that set. Nobody has to maintain an order.

Two decisions are worth making explicitly, because a sheet usually makes them by accident:

2. Weight the draw by how long people have waited

Among everyone eligible, a flat random pick is fair across a year and infuriating across a month: somebody rides twice while somebody else sits through three cycles. The fix is to weight the draw. The weight that works is time past the cooldown wall:

weight = max(1, days_waiting − cooldown_days + 1)

The subtraction is the whole point. Counting from the last ride compresses everything, because with a 21-day cooldown every eligible person is already at 21 or more. Counting past the wall spreads them out:

WaitedWeight if you count from the last rideWeight past the wall
22 days222
25 days255
30 days3010
45 days4525

Counting from the last ride, someone who waited 45 days is barely twice as likely as someone who waited 22. Past the wall they're twelve times as likely — close to "whose turn is it", while still being a draw, so a single unlucky week doesn't become a grievance.

Members who have never conducted. Count their wait from the day they joined. Treat "never" as an infinite wait and someone who joined last week outranks a member who has waited six months. Treat it as zero and they are never picked at all. The join date is the honest answer, and it means a newcomer queues like everyone else — no head start, no penalty.

3. The three cases that break a spreadsheet

Paid extra runs

If a member buys an extra train, don't let it touch the rota. Charging them a cooldown means paying for a train costs you your place in the free rotation, and being gifted a VIP seat delays your own turn. Both are backwards. Record the run so the history is complete, then exclude it from the cooldown and from the waiting order.

Vacations

Someone away for a fortnight shouldn't be picked, and shouldn't be punished for it either. What sheets usually do is delete the row — which also deletes their history. An excused window that ends on its own is the version that doesn't need remembering.

The members with no date at all

This is the one that does real damage, because it's invisible. A blank date sorts oddly, so those rows drift to the bottom and stop being read.

Here's a real example, from an alliance that had been running their rota by hand for four months. Their sheet had 97 members. Sixty-seven had a last-train date. Thirty had none — and the sheet's own "eligible now" figure quietly excluded all thirty, so nearly a third of the alliance was invisible to the thing deciding who rides. Nobody was being unfair on purpose. The spreadsheet just never asked about them.

4. Be able to show your work

A rota is only trusted if a member can be told why they weren't picked. That means keeping two things:

The related habit: if you re-roll a draw because you didn't like the result, that should be visible too. A rota where the officer can quietly re-roll until they get the name they wanted is not a rota.

A rota you can hand over

The final test isn't fairness in the abstract — it's whether someone else could run it next week. Written down, the whole thing is four lines:

  1. Cooldown of 21 days, covering both seats, looking forwards and backwards.
  2. Among those eligible, draw weighted by days waited past the cooldown.
  3. Never-conducted members wait from their join date. Paid runs don't count.
  4. Record the pool, the pick, and any override.

If your current answer to "who's next?" is a spreadsheet only one person understands, that's the thing worth fixing — whichever way you fix it.

LW Alliance runs exactly this: cooldowns, the waiting order, the draw and its history, on a private site per alliance. It will also import the spreadsheet you already keep — the alliance in the example above brought over four months of conductor history in one step, and the site immediately reproduced their own "who's next" list. Take a look.