ScheduCallFair on-call scheduling for clinical teamsby SurgSoul

Time-off & requests 0

Blocks a person from being scheduled on those dates.

Pre-assigned dates 0

Lock specific people onto specific dates — e.g. holiday call sign-ups. These are always honored when generating and override normal availability. Saved and reused across every block.

Build a fair schedule in three steps

  1. Check your team. Under Rules, describe the call your group runs — shifts, which days they run, and what gets assigned together. Then in Team, tick what each person can take.
  2. Enter what's already known. Add vacations under Time-off & requests above, and any holiday sign-ups under Pre-assigned dates. Or share the request link so the team submits their own.
  3. Pick dates and press Generate. Then fine-tune by clicking days to swap, lock the ones you like, and Re-roll the rest. Happy? Save it to history and print or export it.

New here? The Help tab has a full walkthrough and FAQ.

Baseline weekend tally

Weekends each person had before the app started tracking. New blocks add to this so fairness carries forward.

1 · Shifts

The kinds of call your organization runs. One 24-hour shift is the simplest setup; add Day and Night if call changes hands during the day, or anything else your group uses. Times are optional — they only affect calendar exports. Weight is how heavily one of these counts toward a person's load, so a night can be worth more than a day.

2 · Which shifts run each day

Tick the call slots that exist in a normal week. Nights only Monday to Thursday with 24-hour cover Friday to Sunday? Tick exactly that. Leave a day empty if nobody is on call. Click a shift name to toggle its whole row, or a day to toggle its column.

3 · What gets assigned together

By default every slot above is handed out on its own, so Monday's night and Tuesday's night can go to different people. Select two or more slots and link them to make one person cover the lot as a single stretch of call — a Sat+Sun weekend, a whole week of nights, a Friday-through-Sunday block.

Quick set:

4 · What counts as a weekend

Used for fairness only: the weekend tally, the “two weekends in a row” rule, and guaranteed free weekends. Whether Saturday and Sunday go to the same person is decided by grouping above, not here.

5 · Scheduling rules

The generator enforces these on every Generate and Re-roll.

2 = at least one clear day off between calls (also covers post-call rest). 1 = only forbid calls on consecutive days. Day and night of the same date always count as back-to-back unless you've grouped them together.

0 = off. Reserves that many completely free weekends for each person when the roster allows.

Share the request link

Send this link to the whole team — each person picks their own name from the list. To send someone a link that already knows who they are (and that they can't switch to another name), use their personal link below instead.

Pending requests 0

Approve to apply — time-off gets added to your list, holidays become pre-assigned dates.

Fairness & load dashboard

Cumulative across every saved block (weekends include the pre-app baseline). Load points weight each call day by type, so you can see relative burden / pay exposure — set the weights to match how your team values weekday vs. weekend vs. holiday call.

Load weights:

Saved blocks

Quick start

The whole workflow, start to finish. Most steps are one-time setup — day to day you'll just generate, tweak, and save.

  1. Describe your call — open Rules and work down the five numbered steps: the shifts you run (one 24-hour shift, or Day and Night, or anything else), which shifts run each day, what gets assigned together (a Sat+Sun weekend, a whole week of nights, or nothing at all so every slot is handed out on its own), what counts as a weekend for fairness, and the scheduling rules. Most teams set this once.
  2. Set up the team — open Team. Add each person and tick the shifts they can take, day by day. The grid mirrors the pattern you just described, so it only ever shows real call slots.
  3. Collect requests (optional) — open Requests and share the link. Team members pick their name and submit time-off or holiday sign-ups themselves; you approve or dismiss each one.
  4. Add time-off and holidays — on the Schedule tab, expand Time-off & requests (dates a person can't work) and Pre-assigned dates (dates a person must work, like a holiday they signed up for).
  5. Generate — pick a start date and a Length (2–8 weeks, monthly, quarterly, or custom); the end date fills in automatically and your choice is remembered. Then press Generate. The app builds the fairest schedule it can find and flags anything it couldn't satisfy.
  6. Fine-tune — click a day to reassign it, or click two days to swap them. Click the little lock on a day you like, then Re-roll unlocked to reshuffle everything else. Warnings update live so you can see if a manual change breaks a rule.
  7. Save and share — press Save to history so the weekend tally carries forward to the next block, then Print / PDF for the break room or Export .ics to put it on phone calendars.

FAQ

How does the generator decide who works which day?

It builds hundreds of candidate schedules, keeps the best, then improves that one slot by slot — trying every move and trade that lowers the overall unfairness. "Fair" means: everyone gets close to the same number of calls and the same weighted load, weekends even out over time (including past blocks and the baseline tally), calls are spaced out, and nobody works back-to-back. Availability, time-off and pre-assignments are never violated — if a slot truly has no eligible person it's left blank and flagged rather than forced onto someone.

What's the difference between time-off and pre-assigned dates?

Time-off blocks a person out — they will never be scheduled on those dates. Pre-assigned dates lock a person in — they are always given that date, even on a night they normally don't take call. Use pre-assignments for holiday sign-ups and prior commitments.

How do I change who's on a specific day?

Click the slot, then pick a name from the bar that appears — or click a second slot to swap the two people. Grouped slots move as one unit, so clicking any day of a linked weekend moves the whole thing. Any rule your change breaks shows up as a warning above the calendar, so you can decide whether it's worth it.

What do the locks and “Re-roll unlocked” do?

If a generated schedule is mostly right, click the lock icon on the days you want to keep, then press Re-roll unlocked. The app keeps every locked day exactly as-is and rebuilds only the rest. Repeat until you're happy.

Why is a day red or blank?

A red slot means nobody was eligible: everyone was on time-off, not ticked for that shift on that day, or blocked by a standing rule. Fix it by widening someone's availability on the Team tab, trimming time-off, relaxing a rule, or clicking the slot and assigning someone by hand. A whole day showing “—” instead is not a problem — it means your coverage pattern has no call that day.

What is the baseline weekend tally?

The number of weekends each person had covered before you started using the app (set in Team). New blocks add on top of it, so long-run weekend fairness is preserved from day one instead of resetting to zero.

How do I set up Day / Night / 24-hour call?

On Rules, step 1 is your shift list. Press Day and Night to add them (or Custom… for anything else — Backup, Swing, Second call), then delete any you don't use. Give each one times if you want them on calendar exports, and a weight if some are heavier than others — set Night to 1.5 and a night counts one-and-a-half times a day shift in everyone's load. Step 2 is where you tick which shifts actually run on which days, so nights-only Monday to Thursday with 24-hour cover at the weekend is just eleven ticks.

Can Saturday and Sunday go to different people? Can one person have a whole week?

Both, and it's the same setting: step 3 on Rules. Anything you leave ungrouped is handed out on its own, so by default Saturday and Sunday go to whoever fits best. Select two or more slots and press Link to make one person cover the lot as a single stretch — that's how you get a Sat+Sun weekend, a Friday-through-Sunday block, or a whole week of nights. There are one-press presets for the common ones. Grouped slots move together on the calendar too: click any one of them and the whole unit follows.

What does “what counts as a weekend” do, if grouping decides who works together?

It's purely the fairness dimension. Those days decide what the weekend tally counts, which weekends the “never two in a row” rule looks at, and what a guaranteed free weekend means. If your group treats Friday night as part of the weekend for fairness purposes, tick Friday — regardless of whether Friday is grouped with anything.

I changed the coverage pattern — what happens to my saved blocks?

Saved schedules aren't rewritten; every slot stays assigned exactly as it was. What changes is how they're counted: the weekend tally and the History dashboard are re-read under your current pattern, so those numbers can shift. If the tallies end up looking off after a big change, adjust the baseline weekend numbers on the Team tab to put the starting point where you want it.

I added a shift and now days are unfilled — why?

A newly added shift starts with nobody marked for it, deliberately: adding a slot should never quietly volunteer the whole team for it. Open Team and tick the new shift for whoever can work it — clicking the shift name toggles that whole row for a person. Until then the generator has nobody eligible and flags those slots rather than guessing.

What are “recurring rules” and how are they different from time-off?

Time-off is a one-off date range. A recurring rule is a standing pattern that repeats — set them per person under Team (expand Recurring rules on a person). Examples: “3rd Thursday off every month,” “always give me the first weekend,” “off every Oct 12.” Each rule is either a day off or a day they must have, and each is hard (never broken — treated like time-off or a pre-assignment) or soft (a strong preference the generator honors whenever the roster allows). Broken hard rules and unmet soft preferences both show up as flags above the calendar.

How do team members submit their own requests?

Copy the link from the Requests tab and send it to the team (there are also per-person links). Each person picks their name and submits time-off or holiday sign-ups — no login needed. Submissions appear on the Requests tab (the red badge shows the count) where you approve or dismiss them. Approving a time-off request adds it to your time-off list; approving a holiday sign-up becomes a pre-assigned date.

Why should I press “Save to history”?

Saving a block is what makes fairness carry forward: the weekend counts from every saved block feed into the next generation, and the History dashboard tracks cumulative load per person. If you don't save, the next block starts from the old tallies. Re-saving the same date range updates that block rather than duplicating it.

Can I edit a schedule after saving it?

Yes — open it from the History tab, make your changes on the Schedule tab, and press Save to history again. Because the date range matches, it updates the existing block.

How do I get the schedule onto phone calendars?

With a schedule on screen, choose a person (or Everyone) next to Export .ics and press it. The downloaded file opens in Apple/Google/Outlook calendars as all-day "On call" events. Each person can import just their own days from their per-person export.

Does everyone see the same data?

Yes — the schedule lives on the server, so your computer and phone stay in sync (the indicator in the top bar shows save status). When sign-in is enabled, managers can edit everything, while staff can view and submit requests.

What do the “load weights” on the History tab mean?

Load points weight each call by how burdensome (or well-paid) it is — e.g. weekday 1, weekend day 1.5, holiday 2. These multiply with each shift’s own weight from the Rules tab, so a weekend night can be worth several times a weekday day shift. Set both to match how your team values each kind of call, and the dashboard shows relative total burden per person across all saved blocks.