24/7 Shift Schedule Maker
This is the round-the-clock half of the scheduler. You already know what your shifts are — 07:00 to 19:00 and 19:00 to 07:00, or a three-way 06:00 / 14:00 / 22:00 hand-off, or a single 24-hour tour. What you do not know is who should work which one, for the next four weeks, without breaking anybody's rest entitlement or stacking six nights on one person while someone else works three.
Give it your shifts, how many people each one needs on each day, who is qualified for what, and who is unavailable. It returns a roster that covers as much of that demand as your staff can physically cover, and tells you plainly where it could not.
The seven rules that only exist once shifts cross midnight are all here, and all parameters — minimum rest between shifts, maximum consecutive days, maximum consecutive nights, no day shift the morning after a night, weekend fairness, workload equity across people, and night/weekend pay differentials. The rest default is 11 hours because that is the EU Working Time Directive figure; the US has no federal equivalent and state rules differ, so it is a field you set, never a constant baked into the model.
Five samples below, each a different shape of the same problem: a hospital ward with a skill mix, a continuous manufacturing line on three shifts, a two-person security post with weekend fairness on, a fire station on 24-hour tours, and a two-tier service desk. Solve one to see the output before you build your own workbook.
shifts,
demand all, supply all, skills, one grid per demand and
per person, parameters. Download a sample first if you want the template.Questions people ask about round-the-clock rosters
How do I tell it a shift crosses midnight? You don't — you just write the clock times. An end time earlier than the start time (19:00 to 07:00) is the signal, and the engine converts it into a positive duration and absolute minutes from the start of the horizon. Every rest calculation is arithmetic on those minutes, so nothing about midnight is a special case. A shift that starts and ends at the same time (08:00 to 08:00) is a full 24 hours, which is how the fire station sample works.
Why did it leave posts unfilled when I have staff sitting idle? Almost always a rule, not a bug, and the warnings say which one. The usual causes: minimum rest making a day-after-night impossible, a maximum consecutive-days cap, a contracted-hours ceiling, or a shortage penalty set lower than what the labour to fill the post costs — in which case leaving it empty really is the cheaper answer and the model is right. The engine checks that last one at parse time and names the number you need to beat.
⚠ Are the hour and day caps per week or per roster? Per roster
— the whole horizon, not a calendar week. The columns are named
min_hrs_roster, max_hrs_roster, min_days_roster and
max_days_roster to say so. On a 28-day roster, entering 40 in
max_hrs_roster gives that person 40 hours for the entire four weeks, so multiply
your weekly figure by the number of weeks in your horizon. If you have an older workbook using
the _week spellings, it still works — those names are permanently accepted as
aliases and mean exactly the same thing. They were renamed because in a mode that schedules up
to 31 days, calling a roster-wide cap “week” misleads people into entering a number
three or four times too small.
What is the difference between a hard and a soft rule here? Availability, forced assignments, skills, contracted hours, minimum rest, consecutive-day and consecutive-night caps are hard — the model cannot violate them. Coverage shortfall, minimum-hours shortfall, weekend fairness and equity are soft: they carry a penalty. That is why you always get a roster back instead of the word “infeasible”.
How long a horizon can I schedule? Up to 31 days, up to 40 people, and up to 12 demand streams. Four weeks is the usual planning period for shift work.
Can I lock certain shifts before solving? Yes. f in a person's grid cell
forces that assignment; the solver builds the rest of the roster around it.
The same solver, other settings
Each of these loads a different worked example and is written for that setting, but they all run the same cross-day engine — if none of them matches yours, start from whichever is closest and replace the data.
Healthcare
- nurse scheduling and ward rotas — 28 days, RN and aide skill mix, a charge nurse on every shift
- nursing home and care home rotas — CNA-to-resident ratios and the thin overnight cover that goes with them
Industry, transport and logistics
- 3-shift continuous manufacturing — 06:00 / 14:00 / 22:00 hand-offs on a line that never stops
- bus and transit driver rosters — spread time, the extraboard, and what this tool does not do
- warehouse and distribution shifts — inbound and outbound waves, forklift tickets, and peak season
Public safety
- correctional officer rosters — post-based staffing and the relief factor behind mandatory overtime
- firefighter shift schedules — 24-hour shifts, platoons, and the rest rule that follows a 24
- police patrol schedules — watches, minimum beats, and every-other-weekend-off
- security guard posts — a small team covering one post, with weekend fairness switched on
Service and support desks
- contact centre schedules — and how to tell whether you want this page or the other one
- hotel front desk and night audit — three shifts, a night auditor, and a very small team
- on-call and NOC rotations — primary and secondary cover, follow-the-sun, handoffs
How this differs from the other two modes
The staff scheduling optimizer on the home page works in half-hour slots inside a single day: you say how many people you need at 08:00, at 08:30, at 09:00, and it invents shift blocks to match. That is the right model when demand rises and falls through the day — a call centre, a restaurant, a shop — and the wrong model here, because every one of its rules is scoped to one day column. A 19:00–07:00 night becomes two disconnected half-shifts, and no rest rule can span the midnight boundary.
This page replaces the time axis with a shift axis. Your shifts are named blocks with real clock times, and an end time earlier than the start time simply means the shift crosses midnight. Rest between two shifts then becomes arithmetic on absolute minutes across the whole horizon rather than a special case, which is what makes cross-day rules — minimum rest, maximum consecutive days, maximum consecutive nights, no day shift after a night — expressible at all.
The third mode, the shift rotation generator, does not optimize anything: it lays out a named pattern — DuPont, Panama, Pitman, 4-on-4-off — across four crews. Use it when you want a known, published rotation and you do not need the schedule to respond to who is qualified for what, who is on holiday, or which shifts need three people instead of two.
What the solver actually decides
Coverage, skills, availability, pinned assignments and contracted hours are hard — the model physically cannot assign someone to work they are not qualified for or not available for. Coverage shortfall, minimum-hours shortfall, weekend fairness and cross-person equity are soft: each carries a penalty rather than a prohibition. That is a deliberate choice. A roster tool that answers “infeasible” tells you nothing useful; this one always returns a roster and then names the compromises it had to make, in the warnings and the unfilled-posts table.
Why the continuity numbers are on the results page
A roster can be 100% covered and still be unliveable. Everyone in a pay grade earns the same rate and coverage pins the total hours, so rearranging who works when often costs the model literally nothing — the same ward solved twice with staff listed in a different order produced 21 different shifts at an identical objective. Left alone, the solver returns whichever scattered roster it reached first. So the model carries a small penalty on each new block of consecutive days worked, and another on flipping between days and nights, and the results page reports what came out: how many blocks, how long they are, how many are lone single days, and the tightest turnaround anyone actually got. Those are the numbers to argue with, not the objective value.
Common questions
Is it free? Yes — no account, no trial. Your workbook is read to solve the model and not stored.
How many people and days can it handle? Up to 40 people and 31 days per solve. The 28-day hospital ward sample builds roughly 4,300 variables and solves in well under a minute.
What if I want a shift to be someone specific? Put f in that person's grid cell.
Forced cells are hard — the solver schedules around them.
Is minimum rest really 11 hours? Only by default. 11 hours is the EU Working Time Directive
figure; the US has no federal equivalent and state rules vary, so it is a parameter
(MinRestHours) rather than a constant. Set it to whatever your jurisdiction or contract
says.