Call Center Schedule Template and Maker
Read this paragraph before anything else, because contact centres are the one setting where people routinely land on the wrong half of this site. If your call volume rises and falls through the day — quiet at 08:00, peak at 11:00, second peak after lunch, tailing off by 19:00 — and you close overnight, then what you want is the half-hour slot optimizer, not this page. That tool takes a staffing requirement per half hour and invents the shift start and end times to match it, which is exactly the shape of an intraday coverage problem. This page takes your shifts as given and decides who works them, which is the wrong model for a demand curve.
This page is for the other kind of contact centre: a 24/7 support desk, a technical helpdesk, an emergency line, an out-of-hours service, where the shifts already exist and run around the clock. There the daily curve matters far less than the overnight cover, the escalation path, and the rest rules that a rotating desk imposes on the people working it.
The loaded sample is that shape — three eight-hour shifts covering the full 24 hours,
twelve front-line agents and five who can take escalations, with the overnight deliberately
thinner than the day. Escalation is a concurrent demand: your senior agent is one
of the people on shift, not an extra head, and only the five with the skill row can fill it. The
same pattern works for language cover, for a shift lead, or for any certification a proportion
of your team holds.
Neither this nor the slot tool does workforce management in the full sense. There is no Erlang C calculation here: converting forecast call volume, average handle time and a target service level into “how many agents do I need at 14:00” is a separate piece of arithmetic, and it is the input to scheduling, not part of it. Do that first, by whatever method you already trust, then bring the resulting headcount here as demand. And nothing on this site does intraday adherence, breaks-within-shift for a fluctuating queue, or real-time reforecasting — those are what commercial WFM suites are for.
shifts,
demand all, supply all, skills, one grid per demand and
per person, parameters. The template above has all of them filled in.Contact centre scheduling questions
Should I use this page or the slot optimizer? If your shifts already exist and run around the clock, use this one. If you have a demand curve through a working day and want the tool to work out the shift patterns, use the slot optimizer. The giveaway is whether you would describe your requirement as “three people on nights” or as “seven people at 11:00, four at 15:00.”
Does it calculate how many agents I need? No. Erlang C — turning call volume, handle time and a service-level target into a headcount — happens before scheduling. Bring the resulting numbers in as demand.
Can I schedule by language or by skill queue? Yes, one demand per queue. Give agents
skill rows for the queues they can take, and use the concurrent flag if the queue
is covered by someone already on shift rather than by an extra person.
What about breaks and lunches? Not on this page — shift mode schedules whole shifts. The slot optimizer does model break placement within a day, including maximum time without a break, which is another reason a daytime centre usually belongs there.
Can it stop the same agents always getting the overnight? Turn on
EquityPenalty and WeekendFairnessPenalty. They are soft —
coverage wins — but the per-agent night and weekend counts on the results page show you
where the load actually landed.
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.
- 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
- the general 24/7 shift schedule maker — any round-the-clock operation; start here if none of the others fit
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
Skills, availability, pinned (f) assignments, maximum hours and days, minimum rest and the
consecutive-day and consecutive-night caps are hard — the model physically cannot
assign someone to work they are not qualified for, not available for, or not rested for. Filling every
post, reaching each person's minimum hours, 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, so a post the rules cannot
fill comes back as an unfilled post, named in the warnings and the unfilled-posts table, not as a
failure. The one way to get “infeasible” is hard rules that contradict each other —
almost always an f cell that breaks a rest, consecutive-day or maximum-hours rule.
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 kept afterwards. We do cache some data on the server to speed up responses and keep an anonymous count of runs.
How many people and days can it handle? Up to 60 people, 42 days (six weeks), 12 shifts and 12 demand streams 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.