Schedules
A schedule defines a team's on-call rotation — who covers it, and when — plus one-off overrides for swaps and time off.
A schedule belongs to exactly one team and answers one question: who is on call, right now? An escalation policy tier can target a schedule directly, so "page whoever is on call" is a first-class routing target, not something you have to hand-maintain as a list of names.
Rotation layers
A schedule's rotation is one or more layers, each a list of users rotating on a cadence:
daily— hands over once per day.weekly— hands over once per week.custom— hands over everyintervalDaysdays.
Each layer has a handoverTime (the time of day handovers happen) and a startDate that anchors the rotation. A layer can additionally carry restrictions — recurring wall-clock windows (e.g. "only weekdays, 09:00–18:00") — so a layer can model business-hours-only coverage without a separate schedule.
When a schedule has multiple layers active at the same time, the highest layer wins — this is the same rule the escalation engine itself resolves with when deciding who to page, so Who Is On Call never disagrees with reality.
Materialization
A background worker precomputes each schedule's rotation into concrete shift rows roughly 90 days ahead. This is deliberate: answering "who is on call right now" at escalation time is then an indexed timestamp lookup, not a live timezone/DST computation — the one place this must never disagree with what actually happened is exactly the moment someone is being paged.
Overrides
An override is a one-off "X covers for Y" window on top of the regular rotation — a holiday swap or sick-day cover, without editing the rotation itself. Overrides have no priority field: precedence between overlapping overrides is decided by creation order (the later-created one wins), and this is also the order the materializer reads them in.
Timezone
Every schedule has an IANA timezone. Handovers and restriction windows are evaluated in it, across daylight-saving transitions — a 09:00 handover means 09:00 in the schedule's own zone, not UTC.
API
See Schedules, Schedule Overrides, and Who Is On Call.