PagerDuty On-Call Management
Overview
PagerDuty's on-call system manages who receives pages for each service. Schedules define rotation layers (who is on-call when), and escalation policies define what happens if a page isn't acknowledged (Tier 1 → Tier 2 → Tier 3). For MSPs, PagerDuty on-call management typically covers internal SRE/IT rotations and can be configured per-customer if using multi-account setups.
Anti-triggers
- When the SLA clock runs against a customer — business-hours
calendars and coverage windows in a helpdesk or PSA are a billing and
contractual construct, unrelated to who gets woken up. Use
freshdesk-sla-business-hours or halopsa-contracts.
- Escalating a ticket — raising a PSA ticket's priority or moving it
to another queue is
freshdesk-ticketing or halopsa-tickets;
escalation here means a page climbing tiers because nobody
acknowledged.
- Reviewing shift load or burnout risk — Rootly analyses on-call
health and handoffs but does not author schedules; use
rootly-oncall.
- Responder workload metrics and off-hours interruption counts —
those are
pagerduty-analytics; this skill covers coverage, not
measurement.
- A rotation kept in BetterStack — BetterStack ships its own
schedules and escalation policies alongside its monitors, and they do
not mirror into PagerDuty; use
betterstack-oncall.
MCP Tools
On-Call & Schedule Tools
| Tool |
Description |
Key Parameters |
list_oncalls |
Who is currently on-call for each schedule |
schedule_ids[], user_ids[], escalation_policy_ids[], since, until |
list_schedules |
List all on-call schedules |
query (name search), team_ids[] |
get_schedule |
Get schedule with rotation layers and current on-call |
id, since, until |
create_schedule |
Create a new on-call schedule |
name, time_zone, schedule_layers[] |
update_schedule |
Update schedule details or layers |
id |
delete_schedule |
Delete a schedule |
id |
list_schedule_overrides |
List temporary overrides |
id, since, until |
Escalation Policy Tools
| Tool |
Description |
Key Parameters |
list_escalation_policies |
List all escalation policies |
query, team_ids[] |
get_escalation_policy |
Get policy details and rules |
id |
Team Tools (supporting on-call management)
| Tool |
Description |
list_teams |
List all teams |
list_team_members |
List members of a team |
add_team_member |
Add a user to a team |
Key Concepts
Schedule Structure
A PagerDuty schedule is composed of:
- Schedule layers — Define rotation patterns (e.g., weekly rotation of 3 engineers)
- Restrictions — Time-of-day or day-of-week windows (e.g., business hours only)
- Final schedule — The computed result after restrictions are applied across all layers
- Overrides — One-off replacements that take priority over the base schedule
Escalation Policy Structure
Tier 1: Primary on-call responder (5 min to ack)
↓ (if not acknowledged)
Tier 2: Secondary responder or team lead (10 min to ack)
↓ (if not acknowledged)
Tier 3: Engineering manager
↓ (if not acknowledged)
Tier 4: Repeat (or broadcast to whole team)
Each tier targets either a schedule (on-call rotation) or specific users. The escalation timeout is configurable per tier.
Schedule Layers
| Field |
Description |
start |
When this layer starts |
rotation_type |
daily / weekly / custom |
rotation_turn_length_seconds |
How long each person is on-call |
users[] |
Ordered list of responders in rotation |
restrictions[] |
Active time windows for this layer |
Common Workflows
Find Who Is Currently On-Call
- Call
list_oncalls with no filters to see all current on-call entries
- Filter by
schedule_ids[] or escalation_policy_ids[] to narrow to a specific service team
- The response shows
user (who is on-call), schedule, and escalation_policy for each entry
start and end timestamps show when their shift ends
View Upcoming On-Call Schedule
- Call
get_schedule with id and since (now) / until (next 2 weeks)
- The response includes
final_schedule.rendered_schedule_entries — the computed on-call assignments
- Each entry shows: user, start, end — giving you the full rotation timeline
Create a Temporary Override
When someone is unavailable during their shift:
- Identify the schedule ID with
list_schedules
- Create an override by calling
update_schedule or use the PagerDuty API directly:
user: the covering responder
start / end: the override period
- Verify with
list_schedule_overrides on the schedule ID
On-Call Handoff Briefing
Before handing off to the incoming on-call:
- Call
list_oncalls to confirm the current and incoming responders
- Call
list_incidents with statuses[]=triggered&statuses[]=acknowledged to find open incidents
- For each open incident, call
list_incident_notes to capture the current investigation state
- Brief the incoming responder on each open incident: what fired, what was tried, current status
Check Escalation Policy Coverage
- Call
list_escalation_policies to find the policy for the affected service
- Call
get_escalation_policy with the ID
- Review each rule: what schedule/users are in Tier 1, Tier 2, Tier 3
- Verify no tier has an empty or deleted schedule (common gap that causes missed pages)
Add Coverage for a Gap
When a rotation has a coverage gap (no one assigned):
- Call
list_schedule_overrides to see existing overrides during the gap
- If gap exists, create an override with the covering engineer's user ID
- Verify coverage with
get_schedule for the gap period
Field Reference
On-Call Entry Fields
| Field |
Description |
escalation_policy.id |
The escalation policy this on-call is part of |
schedule.id |
The schedule driving this on-call entry |
user.id / user.name |
The on-call responder |
start |
When this person's on-call period started |
end |
When their on-call period ends |
escalation_level |
Which tier (1 = primary, 2 = secondary) |
Error Handling
| Error |
Cause |
Resolution |
| Schedule not found |
Invalid schedule ID |
List schedules with list_schedules to find valid IDs |
| User not in account |
Invalid user ID for override |
List users with list_users |
| Override conflict |
Overlapping override exists |
Check with list_schedule_overrides first |
| 401 Unauthorized |
Wrong auth format |
Use Token token=<key> not Bearer |
Best Practices
- Always verify coverage — After any schedule change, check
list_oncalls to confirm the right person is on-call
- Create overrides, not schedule changes — For temporary gaps, use overrides rather than modifying the base schedule
- Use
since/until on list_oncalls — To see future on-call assignments, not just current
- Check escalation policy before service go-live — Verify all tiers have valid, active schedules
- Review overrides before major incidents — Ensure the right people are actually on-call before planned maintenance
Related Skills
1---2name: pagerduty-on-call3description: PagerDuty on-call model: schedules with rotation layers, restrictions, the computed final schedule, and overrides; escalation policy tiers and timeouts; on-call entry fields; and the schedule, escalation policy, and team MCP tools.4---56# PagerDuty On-Call Management78## Overview910PagerDuty's on-call system manages who receives pages for each service. Schedules define rotation layers (who is on-call when), and escalation policies define what happens if a page isn't acknowledged (Tier 1 → Tier 2 → Tier 3). For MSPs, PagerDuty on-call management typically covers internal SRE/IT rotations and can be configured per-customer if using multi-account setups.1112## Anti-triggers1314- **When the SLA clock runs against a customer** — business-hours15 calendars and coverage windows in a helpdesk or PSA are a billing and16 contractual construct, unrelated to who gets woken up. Use17 `freshdesk-sla-business-hours` or `halopsa-contracts`.18- **Escalating a ticket** — raising a PSA ticket's priority or moving it19 to another queue is `freshdesk-ticketing` or `halopsa-tickets`;20 escalation here means a page climbing tiers because nobody21 acknowledged.22- **Reviewing shift load or burnout risk** — Rootly analyses on-call23 health and handoffs but does not author schedules; use `rootly-oncall`.24- **Responder workload metrics and off-hours interruption counts** —25 those are `pagerduty-analytics`; this skill covers coverage, not26 measurement.27- **A rotation kept in BetterStack** — BetterStack ships its own28 schedules and escalation policies alongside its monitors, and they do29 not mirror into PagerDuty; use `betterstack-oncall`.3031## MCP Tools3233### On-Call & Schedule Tools3435| Tool | Description | Key Parameters |36|------|-------------|----------------|37| `list_oncalls` | Who is currently on-call for each schedule | `schedule_ids[]`, `user_ids[]`, `escalation_policy_ids[]`, `since`, `until` |38| `list_schedules` | List all on-call schedules | `query` (name search), `team_ids[]` |39| `get_schedule` | Get schedule with rotation layers and current on-call | `id`, `since`, `until` |40| `create_schedule` | Create a new on-call schedule | `name`, `time_zone`, `schedule_layers[]` |41| `update_schedule` | Update schedule details or layers | `id` |42| `delete_schedule` | Delete a schedule | `id` |43| `list_schedule_overrides` | List temporary overrides | `id`, `since`, `until` |4445### Escalation Policy Tools4647| Tool | Description | Key Parameters |48|------|-------------|----------------|49| `list_escalation_policies` | List all escalation policies | `query`, `team_ids[]` |50| `get_escalation_policy` | Get policy details and rules | `id` |5152### Team Tools (supporting on-call management)5354| Tool | Description |55|------|-------------|56| `list_teams` | List all teams |57| `list_team_members` | List members of a team |58| `add_team_member` | Add a user to a team |5960## Key Concepts6162### Schedule Structure6364A PagerDuty schedule is composed of:65- **Schedule layers** — Define rotation patterns (e.g., weekly rotation of 3 engineers)66- **Restrictions** — Time-of-day or day-of-week windows (e.g., business hours only)67- **Final schedule** — The computed result after restrictions are applied across all layers68- **Overrides** — One-off replacements that take priority over the base schedule6970### Escalation Policy Structure7172```73Tier 1: Primary on-call responder (5 min to ack)74 ↓ (if not acknowledged)75Tier 2: Secondary responder or team lead (10 min to ack)76 ↓ (if not acknowledged)77Tier 3: Engineering manager78 ↓ (if not acknowledged)79Tier 4: Repeat (or broadcast to whole team)80```8182Each tier targets either a **schedule** (on-call rotation) or specific **users**. The escalation timeout is configurable per tier.8384### Schedule Layers8586| Field | Description |87|-------|-------------|88| `start` | When this layer starts |89| `rotation_type` | daily / weekly / custom |90| `rotation_turn_length_seconds` | How long each person is on-call |91| `users[]` | Ordered list of responders in rotation |92| `restrictions[]` | Active time windows for this layer |9394## Common Workflows9596### Find Who Is Currently On-Call97981. Call `list_oncalls` with no filters to see all current on-call entries992. Filter by `schedule_ids[]` or `escalation_policy_ids[]` to narrow to a specific service team1003. The response shows `user` (who is on-call), `schedule`, and `escalation_policy` for each entry1014. `start` and `end` timestamps show when their shift ends102103### View Upcoming On-Call Schedule1041051. Call `get_schedule` with `id` and `since` (now) / `until` (next 2 weeks)1062. The response includes `final_schedule.rendered_schedule_entries` — the computed on-call assignments1073. Each entry shows: user, start, end — giving you the full rotation timeline108109### Create a Temporary Override110111When someone is unavailable during their shift:1121. Identify the schedule ID with `list_schedules`1132. Create an override by calling `update_schedule` or use the PagerDuty API directly:114 - `user`: the covering responder115 - `start` / `end`: the override period1163. Verify with `list_schedule_overrides` on the schedule ID117118### On-Call Handoff Briefing119120Before handing off to the incoming on-call:1211221. Call `list_oncalls` to confirm the current and incoming responders1232. Call `list_incidents` with `statuses[]=triggered&statuses[]=acknowledged` to find open incidents1243. For each open incident, call `list_incident_notes` to capture the current investigation state1254. Brief the incoming responder on each open incident: what fired, what was tried, current status126127### Check Escalation Policy Coverage1281291. Call `list_escalation_policies` to find the policy for the affected service1302. Call `get_escalation_policy` with the ID1313. Review each rule: what schedule/users are in Tier 1, Tier 2, Tier 31324. Verify no tier has an empty or deleted schedule (common gap that causes missed pages)133134### Add Coverage for a Gap135136When a rotation has a coverage gap (no one assigned):1371. Call `list_schedule_overrides` to see existing overrides during the gap1382. If gap exists, create an override with the covering engineer's user ID1393. Verify coverage with `get_schedule` for the gap period140141## Field Reference142143### On-Call Entry Fields144145| Field | Description |146|-------|-------------|147| `escalation_policy.id` | The escalation policy this on-call is part of |148| `schedule.id` | The schedule driving this on-call entry |149| `user.id` / `user.name` | The on-call responder |150| `start` | When this person's on-call period started |151| `end` | When their on-call period ends |152| `escalation_level` | Which tier (1 = primary, 2 = secondary) |153154## Error Handling155156| Error | Cause | Resolution |157|-------|-------|------------|158| Schedule not found | Invalid schedule ID | List schedules with `list_schedules` to find valid IDs |159| User not in account | Invalid user ID for override | List users with `list_users` |160| Override conflict | Overlapping override exists | Check with `list_schedule_overrides` first |161| 401 Unauthorized | Wrong auth format | Use `Token token=<key>` not `Bearer` |162163## Best Practices1641651. **Always verify coverage** — After any schedule change, check `list_oncalls` to confirm the right person is on-call1662. **Create overrides, not schedule changes** — For temporary gaps, use overrides rather than modifying the base schedule1673. **Use `since`/`until` on `list_oncalls`** — To see future on-call assignments, not just current1684. **Check escalation policy before service go-live** — Verify all tiers have valid, active schedules1695. **Review overrides before major incidents** — Ensure the right people are actually on-call before planned maintenance170171## Related Skills172173- [Incidents](../incidents/SKILL.md) — Incident lifecycle and triage174- [API Patterns](../api-patterns/SKILL.md) — Auth, full tool reference, pagination