From your first shift to a fully automated monthly schedule โ a complete walkthrough of every feature.
Shifters uses constraint programming โ a branch of combinatorial optimization โ to generate schedules that satisfy every rule you define simultaneously. Unlike spreadsheet macros that check rules after the fact, the solver builds a schedule that is guaranteed to respect all constraints from the start.
You define the rules once. The solver finds a valid assignment. You review and save it.
Shifts are defined once and shared across all your teams. Each shift has:
Which shifts this employee is qualified or available to work. The solver will never assign a shift not in this list.
Streak at the end of the previous month. Positive = consecutive work days, negative = consecutive rest days. Used to respect streak rules across month boundaries. Load automatically from last month's marked schedule using the Load previous days button.
Soft weights (+1 to favour, โ1 to discourage) for specific shifts. The solver will prefer assigning favoured shifts when all hard constraints are already satisfied. These are soft โ the solver may override them if needed.
Restrict an employee to specific days of the week. Useful for part-time staff. Unchecked days are always rest.
By default all employees use the global rest days per month. You can fine-tune per employee:
Override the global min/max work and rest streak rules for this specific employee. Leave blank to inherit the global setting. Useful for employees with different contract types.
Base rest day quota per employee per month. The solver will assign exactly this many rest days (unless per-employee overrides are set).
Minimum number of fully free weekends (both Saturday and Sunday off) each employee must have per month.
Minimum and maximum hours of rest between two consecutive shifts. Prevents impossible back-to-back assignments.
How many consecutive work days an employee must/can have before taking a rest day. e.g. min 3, max 6.
How many consecutive rest days must/can be taken in a row. e.g. min 2, max 4 means rest always comes in blocks of 2โ4.
Control how aggressively the solver avoids shift changes within a work block. Higher penalties produce more consistent shift assignments.
Each day in an employee's schedule is assigned one of these types:
A scheduled rest day. Counts toward the monthly rest quota. Part of the work/rest streak calculation.
Pre-planned vacation. Transparent to streaks โ does not break or count toward work or rest streaks. Reduces the effective rest quota (the solver won't waste rest days on vacation days). Enter as day numbers: 5 6 or ranges 5-9.
Employee is occupied (course, trip, meeting) โ not available for shift coverage but counts as work in statistics and streaks. Does not consume rest quota.
Sick day. Like vacation: transparent to streaks, excluded from rest quota. Tracked separately in summaries so you can monitor sick-leave patterns over the year.
Days the employee cannot work, counted as rest. Use integers or ranges: 18 25-27. These consume rest quota.
Force a specific shift on a specific day. Format: 15-morning means the employee must work morning on day 15. Excluded from rest quota. Used automatically when re-solving from a specific day.
The Run page sends your configuration to the constraint solver. The solver has a 5-second time budget โ it will return the optimal solution if found within that time, or the best feasible solution found so far.
Optimal โ the solver proved this is the best possible schedule given your constraints and preferences.
Best found โ a valid schedule was found but the solver ran out of time before proving optimality.
Before sending to the solver, Shifters checks for obvious problems: missing allowed shifts, too many forced days off, etc. Errors block the run. Warnings are advisory only.
This means no valid schedule exists given your current constraints. Common causes:
If the month has already started and something changed โ illness, last-minute swaps, unexpected absences โ you can lock the first N days of the current schedule and re-solve only the remaining days.
After running and viewing a schedule, click "Re-solve from dayโฆ" in the result header. Enter the number of days to lock. The solver will treat days 1โN as fixed and only find assignments for days N+1โend.
Work days โ converted to fixed shifts (solver must assign the exact same shift).
Rest days โ converted to specific days off.
Vacation/sick/busy โ preserved as-is.
The Edit page lets you manually adjust any schedule โ either one generated by the solver or built from scratch. Use it for one-off swaps that don't need the solver.
Click a shift in the toolbar to make it active. Then click cells in the table to paint that shift. Click the active tool again to deselect.
Ctrl+click to select individual cells. Shift+click to select a range within a row, or a rectangular block across rows. Then press a keyboard shortcut or click a shift tool to apply.
Press the first letter of a shift name to cycle through shifts starting with that letter. Ctrl+Z to undo, Ctrl+Y (or Ctrl+Shift+Z) to redo. Up to 50 undo steps.
The Year Summary shows aggregated statistics across all marked (โ ) schedules for the selected year and team. Only marked schedules are included โ use it to track fairness over time.
Month grid showing which months have a marked schedule. Aggregated table per employee: total work, rest, vacation, sick days, holidays worked, and per-shift counts across all months.
Select an employee to see their month-by-month breakdown and a full-year calendar โ all 12 months at once, with each day colour-coded by shift type. Holiday days are highlighted with a ring.
Define public holidays in the Holidays page. Holidays are year-specific โ a holiday defined for 2025 does not automatically carry over to 2026 (since Easter, for example, falls on different dates each year).
Defined once, shared across all teams. Click any day in the year calendar to toggle it as a holiday. Use the year selector to switch between years.
Each team can use the global list or define its own. Select the team from the dropdown, uncheck "Use global holidays" to enable a custom list, and edit as needed.
The Compare page lets you diff two schedules for the same month side by side โ useful for reviewing what changed between the original solver result and a manually edited version, or between two re-solves.
Select Schedule A from the left dropdown. Schedule B automatically filters to only show schedules from the same month and year. Changed cells show the old assignment on top (red border) and the new one below (green border). The ฮ column shows the number of changed days per employee.
Reduce constraint complexity: loosen streak rules, use soft rest ranges instead of exact quotas, or reduce shift change penalties. The solver runs for 5 seconds โ "Best found" is still a valid schedule.
Start by checking: are shift minimums satisfiable with the available employees? Is the rest quota consistent with the number of working days? Try relaxing one constraint at a time until feasible.
Check Previous days for each employee. A wrong previous-day value means the solver starts the month with an incorrect streak assumption. Use "Load previous days" to populate automatically from the prior marked schedule.
Use Shift preferences (+1) to nudge employees toward their preferred shift type. Combine with higher shift-change penalty weights to minimise unnecessary changes within a work block.
1. Mark last month's schedule โ . 2. Go to Employees โ click "Load previous days". 3. Use "Clear day fields" to reset vacation/sick/off days. 4. Enter new vacation/sick for the coming month. 5. Run.
Use Allowed weekdays to restrict the days they can work. Set their rest quota to match: if they only work MonโFri, their rest days should account for the fact that weekends are always off.
Shifters is free during beta. No credit card required.