Skip to main content
An on-call schedule says who owns incidents at each moment. When AI triage cannot finish on an incident or an issue, Squasher gives it to the person who is on call.
On-call is in beta. Squasher does not send on-call texts or phone calls yet, so escalation policies record those steps as blocked. To reach the person who is on call today, send incidents to PagerDuty or another notification destination. Plans limit the number of schedules; see Plans and billing.

Create a schedule

  1. Select On-call under Alerting in the sidebar, then select Create schedule.
  2. Enter a Name.
  3. Under Rotation members, select the people in the order they take turns.
  4. Enter the Timezone, for example America/New_York. The default is UTC.
  5. Select Create.
A schedule from the dashboard belongs to the current project. The first person is on call for one week, then the next person, and so on. The handoff is on Monday at 09:00 in the schedule’s time zone. To choose another day or time, create the schedule with the CLI. Open a schedule to add rotation layers, add an override, and see the final schedule. To delete a schedule, open it and select ⋯ → Delete schedule. Squasher refuses while an escalation policy targets the schedule. The dashboard cannot change the members or the weekly handoff, or disable a schedule. Use the CLI or the On-call API for these tasks.

Create a schedule with the CLI

Add rotation layers

Rotation layers add daily, weekly, or custom-length shifts to a schedule. Open the schedule and use Rotation layers, or send the layers to the API. A schedule can have up to 10 layers. Each layer has its own members and rotation: Each layer also has:
  • Start date (anchor_date, YYYY-MM-DD) and handoff time (handoff_local_time, HH:MM). Both use the schedule timezone. The first member’s shift starts at this date and time. Before the start date, the layer covers nobody.
  • Members — 1 to 50 people, in rotation order. Every member must belong to the organization.
Daily and weekly layers keep the handoff at the same local time across daylight saving time changes, so a shift can be 23 or 25 hours long. Custom layers use a fixed number of hours, so their local handoff time moves when the clocks change.

Which layer wins

Squasher decides who is on call at each moment in this order:
  1. An override for that time.
  2. The latest layer in the list that covers that time. A later layer overrides earlier layers. For example, put a weekday business-hours layer after a 24/7 weekly layer.
  3. The schedule’s weekly rotation, when the schedule has no layer that covers that time.
The final schedule shows the result of this order for a time window, and tells you whether each segment comes from an override, a layer, or the weekly rotation.
Escalation policies that target a schedule page the person that this order returns. See On-call escalation.

See who is on call

current and now are the same command. When nobody is on call, it prints “No on-call coverage right now.” To see the shifts of one schedule:
Add --ics to get the shifts as an iCalendar file. Each event names the person by user ID. When several schedules cover the same moment, Squasher picks one person:
  1. A schedule for the project wins over a schedule for the whole organization.
  2. In a schedule, an override wins over the normal rotation.
  3. If there is still a tie, the oldest schedule wins.
Only enabled schedules count.

Swap a shift

An override gives a time window to another person:
swap and swap-shift are the same command. To stop a schedule without deleting its history, run squasher on-call enable --project "$SQUASHER_PROJECT_ID" --schedule <schedule-id> --disable. To remove a schedule with its members, layers, and shifts, run squasher on-call delete --project "$SQUASHER_PROJECT_ID" --schedule <schedule-id>. Squasher refuses while an escalation policy targets the schedule; add --force to delete it anyway.

Page the on-call person

Attach an On-call escalation destination to a notification route. When a matching incident opens, Squasher texts the person who is on call. If nobody acknowledges within 60 seconds, it calls them, calls again after another 60 seconds, and then escalates to the next level. Reply 1 to the text or press 1 on the call to acknowledge the page and the incident. See On-call escalation for policies, phone numbers, and plan availability.

Hand failed triage to a person

When an AI triage run fails, Squasher looks up the person who is on call now for the project. If the incident or issue is still assigned to @Squasher, Squasher assigns it to that person. On an incident, the timeline says “Squasher gave up — handed off to the on-call engineer.” Nothing changes when nobody is on call or when a person already owns the item. Squasher does not notify the person; they see the assignment in the dashboard.

Limits

  • Create schedule makes a weekly rotation. For daily or custom-length shifts, add rotation layers.
  • Squasher creates the shifts when you create the schedule: 12 weeks by default, up to 52 with --weeks. It does not add shifts later. When the last shift ends, nobody is on call. Create a new schedule before then.
  • The dashboard does not show the handoff time of a schedule yet.
  • The iCalendar feed at /v1/projects/<project-id>/on-call/schedules/<schedule-id>/shifts.ics needs the API key in a header. Calendar apps that cannot send headers cannot subscribe to it.
  • Squasher has no importer for schedules from other tools.

Use on-call from an agent

The Squasher MCP server can list schedules, members, and shifts, read who is on call now, and create overrides. It cannot create, enable, disable, or delete schedules. API keys need the on_call:read scope to read and on_call:write to make changes.

Next steps

Page by text and call

Escalation policies, phone numbers, and acknowledgment.

Set up notifications

Send incidents to the channels your team watches.

Read AI triage

See what triage does before it hands off.

On-call API

Schedules, layers, escalation policies, and pages over HTTP.

CLI reference

Every on-call command and flag.