Overrides & fixed shifts

Two ways to deviate from the rotation, with different priority:

MechanismPriorityScopeWhen to use
OverrideHighest — beats fixed shifts and rotationSchedule-wide (covers all layers) OR layer-specific"Alice is covering for Bob this week — for everything."
Fixed shiftWins over rotation, loses to overridesAlways layer-specific"I'll take Saturday's shift on the secondary layer."

When to use which

Bob is taking next week off. Alice is covering Bob's shifts.

  1. Click the Overrides button on the schedule card.
  2. Click Add override.
  3. Pick Alice as the user, set Mon 00:00 → next Mon 00:00.
  4. Save.

During that window, Alice is shown as the on-call person on every layer Bob would have been on.

Carol normally has Sunday but is going to a conference. David volunteers to take that Sunday on the Primary layer.

  1. Click Shifts on the schedule card.
  2. Click Add shift.
  3. Pick the Primary layer, David as the user, Sunday 00:00 → Monday 00:00.
  4. Save.

Carol's rotation is unchanged otherwise. David is on call for that single Sunday on the Primary layer only.

Same as vacation but shorter. Set start to "now", end to end-of-day.

Override Layer 0 only — leave Layer 1 (secondary) untouched. From the API, set layer_id on the POST. Useful when Bob is sick but only on Primary; Secondary still rotates normally.

Resolution priority

For a given layer at time T, Happy Uptime walks:

  1. Override active right now? Yes → use the override's user.
  2. Fixed shift on this layer right now? Yes → use the shift's user.
  3. Otherwise — use the rotation winner.

Layer-specific overrides win over schedule-wide overrides. If both exist for the same layer at the same time, the layer-specific one wins.

Calendar visibility

Both overrides and fixed shifts show up in:

  • The Calendar modal (per-layer timeline view) with amber rings (override) or sky rings (fixed shift)
  • The iCal export — anyone subscribed to the schedule's .ics feed sees them
  • The Currently on call banner with a badge

API

text
POST /oncall/schedules/:id/overrides { user_id, start_at, end_at, reason?, layer_id? }POST /oncall/schedules/:id/shifts { layer_id, user_id, start_at, end_at, reason? }

See overrides API and shifts API.

Ask a question... ⌘I