Understanding Scheduling Constraints: Rest Days, Blackouts, and Game Limits
Learn what scheduling constraints do, when to use them, and how to avoid configs that silently drop games. A practical guide for league organizers.
Scheduling constraints are rules that prevent the scheduler from assigning games in ways that would be unfair or impractical. Used correctly, they produce a schedule that is both competitive and humane. Set too aggressively, they conflict with each other and silently drop games — leaving you with an incomplete schedule and no obvious explanation of why.
This guide explains each common constraint, what it does, and how to detect when your constraints are working against you.
Minimum rest days
This constraint sets the minimum number of days that must pass between two games for the same team. A setting of 1 means a team can play on Monday and Tuesday but not Monday and Monday. A setting of 2 means a team that plays Monday cannot play again until Wednesday.
When to use it
- Contact sports (ice hockey, football, rugby): 2–3 days minimum is standard to allow physical recovery.
- Non-contact sports (basketball, volleyball): 1 day is typically fine; competitive leagues often go up to 2.
- Recreational leagues: 1 day is usually sufficient, but match what your players can realistically manage.
When it breaks things
If your minimum rest days is equal to or greater than the gap between your available play days, teams can only play every other available slot — effectively halving your scheduling capacity. For example: a league that only plays on Tuesdays and Thursdays (2 days apart) with a minimum rest of 2 days will work. But set minimum rest to 3 days and a team that plays Tuesday must wait until Saturday — which is not a play day. That team can only play Thursdays, cutting your game count in half.
A good scheduler will warn you when this situation arises. Check for those warnings before generating.
Maximum games per week per team
This caps how many times a team can play in any given calendar week (Monday–Sunday). Common values:
- 1 game/week: Standard for recreational leagues. Predictable for players; easy to communicate.
- 2 games/week: Common in competitive leagues or when the season window is short and you need to fit more games in.
- 3+ games/week: Appropriate for tournament weekends or end-of-season catchup rounds only.
Interaction with minimum rest days
These two constraints can conflict. If minimum rest is 6 days (essentially one game per week) but max games per week is set to 2, the max-games setting is moot — the rest requirement already prevents a second game in the same week. Set both to values that are mutually achievable.
Team blackout dates
Individual teams can block specific calendar dates when they are unavailable to play. These are dates when the team's players have commitments — a holiday tournament, a religious observance, a team trip — that take priority over the league schedule.
Collect them early
The biggest operational mistake with team blackouts is collecting them after generating the first schedule. If a team submits their blackout dates after you have already assigned their games, you will need to regenerate and potentially cascade rescheduling across the whole calendar. Send a blackout date collection form to all team captains before you begin scheduling.
Too many blackouts
If a team's blackout dates cover most of the season, the scheduler may not find enough valid slots for that team. The conflict report will show their games as unscheduled with a "blackout" conflict type. In that case, negotiate with the team: can they remove any blackout dates? Is there a particular block of weeks they need cleared, with the rest of the season being open?
Season-level blackout dates
Global blackout dates apply to all teams and all venues on specific calendar days. Use these for:
- Public holidays when facilities are closed.
- Dates reserved for playoff games in a parallel league or tournament.
- Annual events that affect most of your player base (community festivals, school breaks).
If global blackouts cover every available play date in the season, no games can be scheduled. Double-check that at least some of your season's playable dates are free from both global and team-level blackouts.
Playable days of the week
The global playable days setting defines which days of the week the league is active. This is distinct from venue availability — it is a league-level override. If your league only plays on Tuesdays and Saturdays, set those as your playable days regardless of what slots individual venues offer.
Make sure your venue time slots actually occur on these days. If all your venues offer slots on Mondays and Wednesdays but the league playable days are Tuesday and Saturday, the scheduler has no valid slots and every game will be unscheduled.
Detecting self-defeating constraints
A well-designed scheduler warns you before generation when constraints are likely to cause problems. Watch for these patterns:
- Rest days ≥ gap between play days: Teams cannot play on consecutive available days.
- No overlap between venue days and playable days: No valid slots exist.
- All season dates blacked out: No games can be placed.
- Rest days ≥ 6 + max games/week ≥ 2: The rest requirement already limits teams to one game per week; the per-week cap adds nothing.
These are non-blocking warnings — you can still generate — but ignoring them usually results in a schedule full of unscheduled games that you then have to fix manually.
The right approach
Start with relaxed constraints and tighten them gradually. Generate with minimum rest = 1, max games/week = 2, and no blackouts. If the schedule fills completely, add your actual constraints one at a time and regenerate. This helps you identify exactly which constraint is responsible for dropped games rather than guessing at a fully-constrained first run.
A conflict report showing the constraint type for each unscheduled game — rest violation, blackout, max games exceeded, venue conflict — is your most valuable debugging tool. Use it to trace exactly why a game was dropped and which constraint to adjust.