Overrides & fixed shifts
When the rotation needs to bend — vacations, holiday coverage, last-minute swaps.
Overrides & fixed shifts
Two ways to deviate from the rotation, with different priority:
| Mechanism | Priority | Scope | When to use |
|---|---|---|---|
| Override | Highest — beats fixed shifts and rotation | Schedule-wide (covers all layers) OR layer-specific | "Alice is covering for Bob this week — for everything." |
| Fixed shift | Wins over rotation, loses to overrides | Always 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.
- Click the Overrides button on the schedule card.
- Click Add override.
- Pick Alice as the user, set Mon 00:00 → next Mon 00:00.
- 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.
- Click Shifts on the schedule card.
- Click Add shift.
- Pick the Primary layer, David as the user, Sunday 00:00 → Monday 00:00.
- 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:
- Override active right now? Yes → use the override's user.
- Fixed shift on this layer right now? Yes → use the shift's user.
- 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
.icsfeed sees them - The Currently on call banner with a badge
API
textPOST /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.