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.
The rotation
A schedule has exactly one rotation. Stacking coverage is done at the escalation tier (a tier can target several schedules) rather than inside a single schedule.
A rotation period puts a group of members on call as concurrent peers: they are equals and do not cut each other. Which of them a given incident actually reaches is decided when the page happens, not here.
How the group is formed:
none, no handover at all. Everyone in the schedule is on call for its whole active period, as one continuous shift.auto, the member pool is chunked automatically into groups of the size you give.explicit, you define the groups and their order yourself.
How often it hands over:
daily,weekly,biweekly,monthly, at the time of day, weekday or day of month you set.custom, every Nminutes,hours,days,weeksormonths.
The shortest shift is one minute, and handover times are minute-precise at every cadence.
Cadences below a day (minutes, hours) advance in absolute time rather than by wall clock, so a daylight-saving switch neither duplicates nor skips an hour's worth of handovers.
Independently of the rotation, a schedule can carry weekly windows (recurring wall-clock windows such as "weekdays 09:00-18:00"), so business-hours-only coverage needs no separate schedule. Outside those windows the schedule simply has nobody on call.
Materialization
A background worker precomputes each schedule's rotation into concrete shift rows, up to 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.
A fast cadence is precomputed less far ahead, because the number of rows is the horizon divided by the cadence, a one-minute rotation over 90 days would be 129,600 shifts per member. Such a schedule is kept roughly 41 hours ahead instead and topped up every hour. That is a limit on how far a preview reaches, not on coverage: paging always reads the shift that is current now.
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.