Work Schedule
A work schedule sets how much capacity is available at each time of the week. Use one when staffing or opening hours change during your run.
What it is
A work schedule is a named weekly shift plan, kept in the model. It holds weekly rows, such as "Monday to Friday, 08:00 to 16:00, four units", and optional dated exceptions, such as a public holiday. A resource or an activity can follow it, and several can follow the same one. You create schedules in the Advanced view.
The question it helps answer
Do our shifts match our demand? A team can look fine on daily averages and still be short from 4 to 6 every evening. A schedule lets you test a shift change, and it shows you where capacity and arrivals don't line up.
How it behaves
Where it applies
Resources and activities follow schedules. A resource follows one to vary how many units are on hand. An activity follows one to vary how many entities it can work on at once. Each follower gets its own copy of the timeline, so two resources on the same schedule don't share units.
Following a schedule replaces the capacity number. The number you typed stays in the model as the Nominal capacity, which only the results use. The same goes for the capacity lever: it's hidden on something that follows a schedule, and if a lever was stored first, its row stays but is greyed with … follows a work schedule, which sets its capacity. In Flow Analytics, a step that follows a schedule can't be swept either, with the message … follows a work schedule; its capacity is not sweepable.
Which capacity applies
At any moment, capacity comes from the first of these that applies:
- An exception covering that moment. If several do, the one that started latest wins. If two start together, the one that ends first wins until it ends.
- A weekly row covering that moment.
- Off-shift capacity, when nothing else covers it.
A row's capacity is the number of units available, not a change to the current number. A row with Capacity 0 closes the time it covers, the same as a gap. An exception beats the rows even when it asks for more units than any row does, and even outside the hours the rows cover.
A gap between rows takes the Off-shift capacity. With Off-shift capacity 1 and one row for Monday 09:00 to 17:00 at 3 units, the model had one unit all day Monday outside those hours, and three inside them.
Clock and calendar models
| Clock model | Calendar model | |
|---|---|---|
| What time zero is | Monday 00:00. | The Start Date and time you typed. A run that starts Wednesday at 10:00 begins mid-shift, and its first day counts only from 10:00. |
| How the week repeats | Every seven days from Monday 00:00, for as long as the run lasts. Every replication sees the same week. | The real calendar's Monday to Sunday weeks. Nothing shifts for time zones or daylight saving, because times carry no time zone. |
| Dated exceptions | Not allowed. Existing ones stop the model. | Allowed. |
Row times are clock times of day, whatever the model's Clock Unit is. A row that starts at 09:00 means 09:00 in a minutes model and in an hours model alike. See Model for Time Mode and Start Date.
Because the run starts Monday 00:00 in a clock model, the first hours may have no one on shift. A Monday 09:00 start in your head is not the model's start. Either add a row for the early hours or accept that the first arrivals wait.
Shifts that cross midnight
A row's end can be earlier than its start. The row then runs past midnight into the next day, and it belongs to the day it starts on. A Friday 22:00 to 06:00 row covers Friday night and Saturday until 06:00. A Sunday-night row wraps into Monday morning, including at time zero of a clock model, where it covers Monday 00:00 to 06:00. In a test, a Sunday 22:00 to 06:00 row at 1 unit gave six hours of availability at the start of a clock run.
24:00 is allowed as an end, meaning the end of that day, but never as a start. A start equal to the end covers nothing and is an error. Rows that touch are fine. Rows that overlap on the same day are an error, and so is a Sunday-night tail that runs into a Monday-morning row.
When capacity drops or rises
Work in progress finishes. A schedule never interrupts a busy unit. When capacity drops, the drop lands as units finish, so for a while more units may be working than the schedule says. A unit that frees up during that time goes to the drop, not to waiting work. New work starts only once the number in use falls below the new capacity. In a test, capacity fell from 3 to 1 at 02:00 while three jobs were three hours long. All three kept running, and the fourth job started only when the last of them had finished.
A rise is immediate. When capacity rises, waiting work starts at once, up to the new capacity. A request for several units waits until enough are on hand. In a test, work needing two units sat in the queue until the schedule reached two at 06:00, then started.
Overtime counts as capacity on offer. A unit working past its shift really is there, so Utilization counts it as offered for as long as it works, and Utilization can't pass 100%. For example, one unit on shift for 10 minutes that spends 60 minutes on a job reads 60 of the 61 minutes on offer, counting the minute before the job began. Capacity offered still shows the schedule as you wrote it, so a gap between it and the time worked is your overtime.
The model supports only this "finish what you started" rule. There is no setting to pause work at the shift end.
How it works with the rest of the model
| Topic | What happens |
|---|---|
| Warm-up | The schedule doesn't restart when the warm-up ends. Time zero is the start of the warm-up, which is the first part of the run. Results cover only the time after the warm-up. In a test with a Monday-to-Friday 09:00 to 17:00 schedule, a 72-hour clock run and a 24-hour warm-up, Capacity offered counted 16 hours (Tuesday and Wednesday), against 24 hours with no warm-up. |
| Failures | Failures are set on activities, so this applies to an activity that follows a schedule and also fails. Each unit, up to the schedule's highest capacity, can fail on its own. If a shift ends while units are down for repair, the shift end takes the next free unit ahead of a repair that is still waiting for one. This comes from the engine's automated tests, not a run on this page. |
| Costing | The idle rate is charged only for units that are on shift and not busy. A unit that is off shift costs nothing. In a test with 2 units on shift for 8 hours of a 24-hour run, an idle rate of 10 per unit-hour and a single 6-minute job, idle cost came to 159. The same resource with a fixed capacity of 2 came to 479. Work that runs past a shift end is charged at the utilized rate, and idle cost never goes below zero. See Costing. |
| Required units | A requirement that asks for more units than the schedule ever offers never starts. The model still runs, and validation warns you. In a test, a requirement for 3 units against a schedule peaking at 2 gave zero seizes. |
| Joins | On an activity that follows a schedule, the Join check uses the schedule's highest capacity. |
| What-ifs | A what-if can switch a resource or activity to another schedule with Change the work schedule, including one that had a fixed capacity. It can't change a schedule's rows, times, exceptions or Off-shift capacity, and it can't change the capacity of something that follows one. See the capacity lever note above. |
In your results
Three results change meaning once a resource follows a schedule. Add them to a dashboard from the resource results.
| Result | What it divides by | How to read it |
|---|---|---|
| Utilization | Busy time divided by the capacity the schedule offered plus any overtime, counted only after any warm-up. | An off-shift hour is absent, not idle. Near 100% means the on-shift hours are saturated. |
| Utilization against full staffing | Busy time divided by Nominal capacity times the length of the statistics window, ignoring the schedule. | How much of the staffing you set in the capacity field was used. A big gap from Utilization means the resource is busy on shift and off shift most of the run. It can exceed Utilization if Nominal capacity is below the schedule's highest capacity. In a test with Nominal capacity 1 and a schedule peaking at 3, it read 125% against 94%. |
| Capacity offered | Not a ratio. The schedule's capacity added up over the statistics window, in unit-time. | The schedule as written. Utilization divides by this plus any overtime. Without a schedule it is capacity times the window length. |
An activity that follows a schedule gets the schedule-based Utilization too, but not the other two. Its Capacity result shows the Nominal capacity number you typed, not the schedule's highest capacity. In a test, an activity with Nominal capacity 1 and a schedule peaking at 2 reported a Capacity of 1.
Properties
What you can edit depends on the complexity view. A view only changes what you can edit, never what runs. If a model follows a schedule and your view hides it, a line names it, such as This uses work schedules, hidden in Intermediate, with a link to switch views.
| Where | Lowest view |
|---|---|
| Resources tab on the Model editor | Intermediate |
| Schedules section of the Resources tab | Advanced |
| Capacity: Follow a schedule, on a resource or an activity | Advanced. In a lower view the choice is hidden. A shape that already follows a schedule shows it checked and greyed out, and you can still use Edit schedule and the schedule list. |
| Time Mode and Start Date (for exceptions) | Intermediate |
| Everything inside the work schedule editor | Shown whenever the editor opens. |
Schedules section
Open the Model editor with nothing selected, choose the Resources tab, then the Schedules section. It lists the schedules in the model under Schedules (2), with a count.
| Property | Where to find it | What it does |
|---|---|---|
| New schedule | Top of the section. | Adds a schedule and opens it. It's named Work schedule 3, the next number not already in use. It starts with one row, Mon to Fri, 09:00 to 17:00, Capacity 1, and Off-shift capacity 0. It follows nothing yet. |
| Empty list | The list. | Says: A work schedule varies a resource's or activity's capacity by day and time of week -- create one, then attach it from the Resource or Activity editor. |
| Schedule row | The list. | Shows the name (or (unnamed)), a summary such as 2 rows · 1 exception or No rows configured, and who follows it: 2 resources, 1 activity or Not used by any resource or activity. |
| Edit | On the row. | Opens the work schedule editor. |
| Delete | On the row. | See Deleting a schedule. |
Work schedule editor
The editor is a window headed Work Schedule. Your edits save as you make them, so there's no Save or Cancel. Close it with the ✕ or the Esc key. Clicking outside does nothing, so a stray click can't lose your place. Everything that follows the schedule changes with it.
| Property | Where to find it | What it does |
|---|---|---|
| Name | Top of the editor. | Names the schedule. Names must be unique among the model's work schedules. A blank name shows as (unnamed) in lists, and validation then calls the schedule by an internal ID. |
| Off-shift capacity | Top of the editor. | Capacity when no row or exception applies. Default 0. |
| Typical week | Bottom of the editor. | A read-only chart of the weekly rows across Monday to Sunday, with the capacity on the left, hours at 06, 12 and 18, and the figure printed in each bar. Hover a bar for its span, such as Mon 07:00–15:00 · capacity 3. A line below says Peak capacity 3; off-shift 0. The chart always starts on a Monday and never shows exceptions. When a row time is invalid it says Preview unavailable until the row times above are valid. |
Every capacity box, in a row, an exception and Off-shift capacity, takes a whole number of 0 or more. Anything else, such as 1.5 or -1 or text, shows Capacity "1.5" must be a whole number of 0 or more. and isn't saved. Leave the box and it goes back to the saved value.
Weekly rows
The heading reads Weekly rows (3). With none, it says No rows yet. A row says how many units are available on which days, between which times — outside every row the off-shift capacity applies.
| Property | Where to find it | What it does |
|---|---|---|
| Add row | Above the rows. | Adds a draft row, headed Not saved yet, with Start 09:00, End 17:00, Capacity 1 and no days. It becomes a real row the moment you pick its first day. It's disabled while a draft is open. Close the editor first and the draft is lost. |
| Day buttons | Each row. | Mon to Sun, each toggles. A row needs at least one day. Removing the last one is refused with Row needs at least one weekday — for example Mon-Fri, Mon,Wed or Sat. Add the new day first, then remove the old. |
| Start | Each row. | Time of day as HH:MM, from 00:00 to 23:59. A one-digit hour such as 7:00 is saved as 07:00. 24:00 isn't allowed here. A value that doesn't fit isn't saved, and the row shows … has an invalid start time "24:00". Use HH:MM between 00:00 and 23:59 — '24:00' is only valid as an end time. |
| End | Each row. | Time of day as HH:MM, from 00:00 to 24:00. An end earlier than the start crosses midnight. An equal end is flagged as … starts and ends at the same time (08:00), so it covers nothing. It does stay in the schedule, and validation then stops the model. |
| Capacity | Each row. | Units available during the row. Default 1 for a new row. |
| Remove row (✕) | Each row. | Deletes the row at once, with no confirmation. |
Overlaps show under both rows as Work schedule 'Nursing team': rows 1 and 2 both cover the same time on the same day. Adjust their days or times so they do not overlap — rows that merely touch (one ends exactly where the other starts) are fine. Rows count from 1.
Paste rows
Paste lines from a spreadsheet into the Paste rows box. Each line is one row with four columns: days, start, end and capacity, as in Mon-Fri 07:00 15:00 3. Separate columns with tabs, spaces or commas. Nothing changes until you click a button.
| Property | Where to find it | What it does |
|---|---|---|
| Days | First column. | A single day, a range such as Mon-Fri, or a list such as Mon,Wed. Full names (Monday), Tues, Thur and Thurs also work. A range can wrap past Sunday, so Sat-Mon is Saturday, Sunday and Monday. A comma list works with commas and no spaces. Mon, Wed 07:00 15:00 2 shifts the columns and is reported as an error. |
| Start, End, Capacity | Other columns. | The same rules as the row boxes. A one-digit hour is padded. A header line starting with Day, Days, Weekday or Weekdays is skipped. |
| Summary | Under the box. | Reads 3 rows parsed — 1 with errors. Each bad line is listed with its reason, such as Unknown weekday "Mnday" — expected one of: mon, tue, … or Each line needs four columns — days, start, end, capacity. |
| Replace | Under the box. | Swaps all your rows for the good lines. Disabled until at least one line is good. |
| Append | Under the box. | Adds the good lines after your rows. Appended rows can overlap existing ones, and the rows table then flags them. |
Replace and Append import the lines without errors. Any bad lines stay in the box to fix, with a note such as Imported 3. 1 line left below to fix.
Exceptions
An exception is a dated window that overrides the weekly rows. It suits a holiday, a shutdown, or a permanent change from a date onward. In a calendar model the heading reads Exceptions (2). In a clock model there is no table, only Clock models treat sim time 0 as Monday 00:00; dated exceptions need a calendar model. Exceptions already in a clock model show greyed out, above the model's error message, with a ✕ to remove each.
| Property | Where to find it | What it does |
|---|---|---|
| Add exception | Above the list. | Adds an exception that starts when the model starts, with Capacity 0 and no To, so as it stands it closes whatever it covers for the whole run. Set its dates and capacity. With no Start Date on the model, it starts at midnight today. With no exceptions the list says No exceptions. An exception overrides the weekly rows for a dated window — a holiday, a shutdown, or a permanent change from a date onward. |
| From | Each exception. | Date and time the exception starts. Required. Clearing it isn't saved, and the row says An exception needs a start date and time. |
| To | Each exception. | Date and time it ends. Leave it blank for a permanent change. The row then says Permanent change from 1 Mar 2027. A permanent exception runs to the end of the run, nights and weekends included. In a test, one from Friday 12:00 at 4 units held 4 units through the weekend. |
| Capacity | Each exception. | Units available. Same whole-number rule as the rows. 0 closes the window. |
| Note | Each exception. | Optional label. The run doesn't use it. |
| Remove exception (✕) | Each exception. | Deletes it at once. |
The dates are in the model's own calendar, with no time zone. The editor does not check a To that is on or before From, an exception outside the run, or two exceptions that overlap. Validation checks the first two (see Checks), and overlapping exceptions are allowed. In a test, a 12-hour exception at 5 units with a 2-hour exception at 2 units inside it gave 5, 2, then 5 again, whichever was listed first.
Capacity on a resource or activity
A resource's or activity's Basic tab has a Capacity control with two choices.
| Property | Where to find it | What it does |
|---|---|---|
| Fixed capacity | Capacity, Basic tab. | A plain number. The only choice below the Advanced view. Choosing it again removes the link, and the number then shown is the old Nominal capacity. |
| Follow a schedule | Capacity, Basic tab. | Links to a schedule. With no schedule in the model, Quodsi makes one with a Monday to Friday 09:00 to 17:00 row at the current capacity, links it and opens it. With one or more, it links the first in the list. With several it adds Linked to the first schedule — change it below. |
| Work schedule | List, once linked. | Picks which schedule to follow. A schedule that no longer exists shows as Missing schedule (…), and validation stops the model. |
| Edit schedule | Once linked. | Opens the work schedule editor on the linked schedule. |
| New schedule | Once linked. | Makes another schedule with a Monday to Friday 09:00 to 17:00 row at the current capacity, links to it and opens it. The old schedule stays in the model, no longer followed by this shape. |
| Nominal capacity (for reporting) | Once linked. | Used for nominal utilization only. The schedule sets what's actually available. Linking raises it to the schedule's highest capacity if it is lower. It never lowers it. A resource's value must still be a whole number of 1 or more. |
Deleting a schedule
Delete is on each row of the Schedules section. It has no confirmation box.
| Situation | What happens |
|---|---|
| Nothing follows it | One click removes it at once. There is no undo. |
| A resource or activity follows it | Delete is greyed out. Its tooltip reads Used by 2 resources, 1 activity — unlink first. Switch each one to Fixed capacity, or to another schedule, first. |
| It goes some other way | Anything still following it shows Missing schedule (…), and validation stops the model with an error until you choose another or switch back to Fixed capacity. |
| The resource or activity is deleted instead | The schedule stays. It reads Not used by any resource or activity, validation warns that it has no effect, and Delete works again. |
The check counts resources, activities and what-ifs saved in the model, which show as 1 what-if. A what-if saved on its own as a run or study isn't counted. If you delete a schedule it uses, that what-if is refused when you run it.
Checks before a run
Validation shows these in the editor's list of problems. An error stops the run. A warning or note doesn't.
| Message | Level | What causes it |
|---|---|---|
| … follows work schedule '…', which does not exist in this model. | Error | A link to a deleted or missing schedule. |
| … has no weekly rows and no exceptions, so it will never provide any capacity. | Error if something follows it. Warning if not. | An empty schedule with Off-shift capacity 0. With Off-shift capacity above 0, a schedule with no rows passes, and runs at that capacity all the time. |
| … has a maximum capacity of 0 across every row, exception and off-shift value, so it will never provide any capacity. | Error if something follows it. Warning if not. | Every capacity is 0. |
| … row 2 has an invalid start time … / invalid end time … / starts and ends at the same time … | Error | A row time that isn't HH:MM, 24:00 used as a start, or a start equal to the end. |
| … rows 1 and 2 both cover the same time on the same day. | Error | Two rows that overlap, midnight tails and the Sunday-to-Monday wrap included. |
| … has 1 dated exception(s), but this model uses clock time. | Error | Exceptions in a clock model. Remove them, or switch Time Mode to calendar. |
| … exception 1 has a 'from' value of … / ends … at or before it starts … | Error | A date that isn't valid, or a To that isn't after From. |
| … all 2 exception(s) fall outside the simulation's run window and will never take effect. | Warning | Every exception is before the start or after the end of the run. One exception inside the run is enough to silence it. |
| … is not followed by any resource or activity, so it has no effect on the run. | Warning | An unused schedule. |
| Requirement '…' needs 3 of resource '…', but its work schedule '…' never offers more than 2, so that request is never met. | Warning | A request for more units than the schedule's highest capacity. |
Nominal capacity can be any number, 0 included, because the schedule sets capacity during the run. Results use it for Utilization against full staffing, so set it to full staffing.
Example
A call center has four agents from 08:00 to 16:00 on weekdays, two from 16:00 to 22:00, and none overnight. Add a schedule with two rows: Mon to Fri 08:00 to 16:00 at Capacity 4, and Mon to Fri 16:00 to 22:00 at Capacity 2. Leave Off-shift capacity at 0. Choose Follow a schedule on the Agents resource and set Nominal capacity to 4.
Take calls that arrive every 12 minutes around the clock and take 20 minutes each, over a five-day clock run from Monday 00:00. With a fixed 4 agents, Utilization is 42% and calls never wait. With the schedule, Capacity offered is 220 agent-hours. Utilization is 89% and the average call waits about 121 minutes, largely because calls that arrive overnight wait for the 08:00 shift. Utilization against full staffing is 41%, since it divides by 4 agents all week. The fixed model hid all of this.
In a calendar model, add an exception for a public holiday, with From at midnight, To at midnight a day later, and a Capacity of 1.
Common mistakes
- Forgetting that a schedule stops work overnight. With Off-shift capacity at 0, entities queue until the next shift. In a clock model, the run starts on Monday at 00:00, so it may start with no one on shift.
- Treating a row's capacity as an addition. It's the total available, not extra units.
- Overlapping rows. Two rows covering the same time on the same day are an error. Let them touch instead.
- Reading the wrong utilization. Utilization measures against what the schedule offered. Utilization against full staffing measures against Nominal capacity, so if that's set too low, it can read above 100%. Read Utilization to judge your shifts.
- Expecting a shift end to stop work. Work in progress finishes, so a short shift end can leave more units busy than the schedule shows, and Utilization above 100%.
- Leaving a new exception on its default date. Add exception starts when the model starts, with Capacity 0 and no end, so left as it is it closes the resource for the whole run.
- Adding exceptions in a clock model. They need a calendar. Existing exceptions in a clock model stop the run until you remove them or switch to calendar.
- Asking for more units than the schedule has. A requirement for 3 units against a schedule that peaks at 2 never starts. Validation warns you, but the model still runs.
- Deleting a schedule in use. Delete stays disabled until nothing follows it. Switch those shapes back to Fixed capacity first.