Hotel Front Desk Schedule Maker
A hotel front desk is a 24-hour operation run by a team that is often smaller than the number of shifts in a week, and that combination is what makes it hard. Twenty-one shifts a week from five or six people means almost everyone works most days, the roster has no slack, and a single resignation turns into a month of scrambling. The scheduling question is less “what is the cheapest roster” and more “is this roster even possible, and who is carrying the nights.”
The night audit is the constraint that makes this different from any other service desk.
Someone has to run the audit — close the day, post room charges, reconcile — and not
everyone on your desk is trained on it. That makes it a textbook concurrent
demand: the night auditor is your overnight front desk agent, not an extra person, but only
qualified staff can fill it. Give the audit its own demand stream, flag it concurrent, and give
a skill row only to the people actually trained. The model then physically cannot produce a
night without one, and if your trained pool is too small it will tell you which nights it could
not cover instead of leaving you to find out.
The loaded sample is a two-tier 24/7 service desk on three eight-hour shifts, with an escalation stream that only some staff can fill — structurally the same as front line plus night auditor. Rename the demands, adjust the shift times to your own (07:00–15:00, 15:00–23:00, 23:00–07:00 is the common hotel split and what the sample uses), and the workbook carries over.
One thing worth changing from the defaults: the sample runs one person overnight and two on the other shifts, because round-the-clock cover almost never means equal cover. If your desk gets a genuine check-in rush at 16:00 and a check-out rush at 08:00, raise those specific cells rather than the whole shift. And if your demand really does swing hour by hour within a shift — a big property where the lobby is three-deep at 15:00 and empty at 22:00 — the half-hour slot optimizer is the better model for the daytime, because it can invent the shift boundaries instead of taking yours as given.
shifts,
demand all, supply all, skills, one grid per demand and
per person, parameters. Download a sample first if you want the template.Front desk scheduling questions
How do I make sure a trained night auditor is on every night? Give the audit its own
demand with the concurrent flag, and a skill row only for trained staff. Concurrent
is the important part — the auditor is your overnight agent, so without the flag you would
be asking for two people overnight when you need one.
Our team is too small to cover every shift. Then the tool will say so, precisely. Solve it and read the unfilled-posts table: it names the shift and the day. That list is a recruitment case, and it is a much better one than a feeling that the rota is tight.
Can I stop the same person always working the overnight? Turn on
EquityPenalty to flatten total hours and WeekendFairnessPenalty to
spread weekends. Both are soft, so coverage still wins, but the night counts per person on the
results page show you exactly how the load landed.
What about the manager on duty? Another concurrent demand, with a skill row for whoever can hold it. The same pattern as the night audit — a role that must be present and is filled by someone already on shift.
Housekeeping and F&B too? They can be extra demands here, but if their staffing follows occupancy through the day rather than fixed shifts, the slot optimizer models them better. Front desk is a fixed-shift problem; housekeeping usually is not.
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.
- contact centre schedules — and how to tell whether you want this page or the other one
- 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
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.