An on-call schedule template is a table with one row per shift: when the shift starts, when it ends, the time zone, who is primary, and who is secondary. Everything else about an on-call rotation, the pager, the escalation, the handoff note, hangs off those five columns. This page gives you the table, a filled example, the calendar file that puts each shift on the right person's calendar, and the rules that keep a rotation fair.
The template
The columns, in the order the generator writes them:
| Column | What goes in it |
|---|---|
| start | The first minute of the shift, as a local date and time: 2026-11-09T09:00 |
| end | The first minute of the next shift, in the same form |
| time zone | The IANA zone of the times: America/Los_Angeles, Europe/Berlin |
| primary | The person who is paged first |
| secondary | The person who is paged when the primary does not answer; empty for a one-person rotation |
A weekly rotation of three engineers, handing off on Monday at 09:00 Pacific, with a secondary one step behind:
start,end,time zone,primary,secondary
2026-11-09T09:00,2026-11-16T09:00,America/Los_Angeles,Priya,Marcus
2026-11-16T09:00,2026-11-23T09:00,America/Los_Angeles,Marcus,Dana
2026-11-23T09:00,2026-11-30T09:00,America/Los_Angeles,Dana,Priya
2026-11-30T09:00,2026-12-07T09:00,America/Los_Angeles,Priya,Marcus
A daily rotation uses the same columns with a one-day gap between start and end. The secondary column is the only difference between a rotation that wakes one person and a rotation that wakes a second one when the first sleeps through the page.
Get the filled table and the calendar in one minute
The on-call schedule generator takes the names, the first handoff, the cadence (daily or weekly), the time zone, and the number of weeks, and writes two files:
on-call-schedule.csv: the table above, with your rows.on-call-schedule.ics: one calendar event per shift, titledOn-call: <primary>, with the secondary in the description, in your time zone. Import it into Google Calendar or Outlook once, and every shift is on the calendar of the people who hold it.
Nothing is uploaded. The generator runs in your browser, and the files download from it.
The rules that keep a rotation fair
- Hand off at a time everyone is awake. A Monday-morning handoff gives the outgoing person the weekend to finish what the week started, and the incoming person a working day to read the handoff note. A Friday-evening handoff gives the weekend to whoever drew the short straw.
- One week per turn, three people or more. A week is long enough to learn the week's failure, and short enough to stay rested. With two people, each is on call half of the year; a third person turns that into a third.
- A secondary is a person, not a group. The row names who is paged second, so nobody has to guess at 03:00. Rotate the secondary one step behind the primary, as the example does, and each person is secondary the week before they are primary: they see what is coming.
- Swaps change the table, not the pager. When two people trade a week, change the two rows and reimport the calendar file. The table is the source of truth; the calendar and the pager follow it.
- Write the handoff note in the row's week. What paged, what was fixed, what is still fragile. The incoming primary reads it before the handoff, not after the first page.
From the table to a pager that rings
The table says who; a pager makes the phone ring. In OrgOrg On-Call, a rotation is the same table, kept by the app: the people, the cadence, the handoff time, and the time zone, with the schedule drawn as a calendar. A page goes to the primary by phone call, text, push, and Slack, escalates to the secondary when the primary does not acknowledge, and the handoff happens on time without a reminder. The schedule a rotation makes is the one this template describes, so a team that starts with the CSV moves to the app without renaming a column.