---
title: "Schedules"
description: "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](/monitoring/incident-management/teams) 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 every `intervalDays` days.

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](/api/incident-management/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](/api/incident-management/schedules), [Schedule Overrides](/api/incident-management/schedule-overrides), and [Who Is On Call](/api/incident-management/on-call).
