PagerDuty incident escalated or reassigned notifications on your phone.

Get a High-priority push notification when a PagerDuty incident escalates, is reassigned or is delegated to another escalation policy, optionally only when it lands on you.

How it works

Three steps to your first push

STEP 01

Install the recipe

One click in Studio gives you a personal webhook URL.

STEP 02

Paste your URL into PagerDuty

Add it as a webhook for incident.escalated, incident.reassigned and incident.delegated.

STEP 03

Get a push on your phone

With the text, sound and buttons from the recipe.

Setup

How to set up the PagerDuty incident.escalated, incident.reassigned and incident.delegated webhook

  1. Click Install in Studio and sign in. The recipe is added to your account and you get a personal webhook URL.
  2. In PagerDuty, go to Integrations > Generic Webhooks (v3) and click New Webhook (or add one on a service's Integrations tab).
  3. Paste your webhook URL as the Webhook URL.https://••••••••/•••••••• your personal URL, shown after install
  4. Under Event Subscription, tick incident.escalated, incident.reassigned and incident.delegated and click Add Webhook.
  5. Create a v3 webhook under **Integrations → Generic Webhooks (v3) → New Webhook** (Managers and Admins), or on a single service under **Services → Service Directory → your service → Integrations → Webhooks**. Paste the URL above and tick **incident.escalated**, **incident.reassigned** and **incident.delegated**. The recipe ignores every other event type.
  6. To only get a push when an incident lands on you, add your PagerDuty user ID (the `PXXXXXX` part of your profile URL) or your name as it appears in PagerDuty (write spaces as `%20`, e.g. `?user=Jane%20Doe`):
  7. ```
  8. your webhook URL?user=PXXXXXX
  9. ```
  10. The recipe reads the new assignees from the incident in the payload. PagerDuty's docs don't say whether that list is always updated by the time the escalation event is sent, so test `?user=` with a real escalation before relying on it.
  11. To check the connection, open the webhook, click **Send Test Event** under **Test**, and you'll get a quiet "PagerDuty connected" push.
  12. PagerDuty signs every v3 webhook with an `X-PagerDuty-Signature` header (HMAC-SHA256 with the subscription's secret), but JustPush doesn't check that signature yet, so keep your endpoint URL private.
The code

What runs when the webhook arrives

Studio calls handleRequest(request) with the incoming webhook and sends the message it returns. It's yours after install; change anything.

transform.js
1// PagerDuty → incident.escalated, incident.reassigned, incident.delegated
2// Fires when an open PagerDuty incident lands on someone else: it escalates, someone
3// reassigns it, or it's handed to another escalation policy.
4// Docs: https://docs.pagerduty.com/developer/webhooks-overview
5
6// Each event and how to label it. All of them are High (1): a new responder has to act
7// soon. PagerDuty itself pages the new assignee, so this isn't Highest.
8const EVENTS = {
9 "incident.escalated": "⏫ Escalated:",
10 "incident.reassigned": "↪️ Reassigned:",
11 "incident.delegated": "↪️ Delegated:",
12}
13
14// Look a key up without tripping over inherited names like "toString".
15function pick(table, key, fallback) {
16 return typeof key === "string" && Object.prototype.hasOwnProperty.call(table, key) ? table[key] : fallback
17}
18
19// Only link to real http(s) URLs.
20function link(url, cta) {
21 return typeof url === "string" && /^https?:\/\//.test(url) ? [{ cta, url }] : []
22}
23
24// A trimmed string, or null for anything else.
25function text(value) {
26 return typeof value === "string" && value.trim() ? value.trim() : null
27}
28
29function handleRequest(request) {
30 const body = request.body && typeof request.body === "object" ? request.body : {}
31 const event = body.event && typeof body.event === "object" ? body.event : {}
32 const type = event.event_type
33
34 // "Send Test Event" on the subscription sends a pagey.ping; confirm the connection quietly.
35 if (type === "pagey.ping") {
36 return {
37 title: "🔔 PagerDuty connected",
38 message: text(event.data?.message) ?? "Your webhook subscription is working",
39 topic: "PagerDuty",
40 priority: -1,
41 }
42 }
43
44 // Guard: only escalations and hand-overs. v3 webhooks have no event header, so the
45 // payload's event_type decides.
46 const label = pick(EVENTS, type, null)
47 const incident = event.data
48 if (!label || !incident || typeof incident !== "object") {
49 console.log(`Ignoring PagerDuty "${type ?? "unknown"}" event`)
50 return null
51 }
52
53 const assignees = (Array.isArray(incident.assignees) ? incident.assignees : []).filter(
54 (user) => user && typeof user === "object",
55 )
56
57 // ?user=PXXXXXX (a user ID) or ?user=Jane Doe (a name) only pushes when that person
58 // is one of the new assignees.
59 const user = text(request.query?.user)?.toLowerCase()
60 if (user && !assignees.some((a) => [a.id, a.summary].some((v) => text(v)?.toLowerCase() === user))) {
61 console.log(`Skipping "${type}": not assigned to ${user}`)
62 return null
63 }
64
65 const title = text(incident.title) ?? text(incident.summary) ?? "An incident"
66 const names = assignees.map((a) => text(a.summary)).filter(Boolean).join(", ")
67 // A delegation moves the incident to another escalation policy, so name the policy too.
68 const policy = type === "incident.delegated" ? text(incident.escalation_policy?.summary) : null
69 const to = names || policy
70 const number = Number.isFinite(incident.number) ? `#${incident.number}` : null
71
72 return {
73 title: `${label} ${title}`,
74 message: [to ? `Now with ${to}` : "Now with someone else", number, text(incident.service?.summary)]
75 .filter(Boolean)
76 .join(" · "),
77 topic: "PagerDuty",
78 priority: 1, // see EVENTS above
79 buttons: link(incident.html_url, "Open incident"),
80 }
81}
Payload

The PagerDuty incident.escalated webhook

This is what PagerDuty sends to your URL for incident.escalated, incident.reassigned and incident.delegated. It is a sample, trimmed to the fields recipes use.

incident.escalated · sample.json
1{
2 "event": {
3 "id": "01D8XQ3N1PC4X8D2Z5G9L0IJKL",
4 "data": {
5 "id": "PGR0VU2",
6 "self": "https://api.pagerduty.com/incidents/PGR0VU2",
7 "type": "incident",
8 "teams": [
9 {
10 "id": "PFCVPS0",
11 "self": "https://api.pagerduty.com/teams/PFCVPS0",
12 "type": "team_reference",
13 "summary": "Payments",
14 "html_url": "https://acme.pagerduty.com/teams/PFCVPS0"
15 }
16 ],
17 "title": "Checkout API error rate above 5%",
18 "number": 1234,
19 "status": "triggered",
20 "service": {
21 "id": "PF9KMXH",
22 "self": "https://api.pagerduty.com/services/PF9KMXH",
23 "type": "service_reference",
24 "summary": "Checkout API",
25 "html_url": "https://acme.pagerduty.com/services/PF9KMXH"
26 },
27 "urgency": "high",
28 "html_url": "https://acme.pagerduty.com/incidents/PGR0VU2",
29 "priority": {
30 "id": "PSO75BM",
31 "self": "https://api.pagerduty.com/priorities/PSO75BM",
32 "type": "priority_reference",
33 "summary": "P1",
34 "html_url": "https://acme.pagerduty.com/account/incident_priorities"
35 },
36 "assignees": [
37 {
38 "id": "PK7RT2M",
39 "self": "https://api.pagerduty.com/users/PK7RT2M",
40 "type": "user_reference",
41 "summary": "Jane Doe",
42 "html_url": "https://acme.pagerduty.com/users/PK7RT2M"
43 }
44 ],
45 "created_at": "2026-09-29T10:51:28Z",
46 "incident_key": "d3640fbd41094207a1c11e58e46b1662",
47 "resolve_reason": null,
48 "conference_bridge": null,
49 "escalation_policy": {
50 "id": "PUS0KTE",
51 "self": "https://api.pagerduty.com/escalation_policies/PUS0KTE",
52 "type": "escalation_policy_reference",
53 "summary": "Checkout on-call",
54 "html_url": "https://acme.pagerduty.com/escalation_policies/PUS0KTE"
55 }
56 },
57 "agent": null,
58 "client": null,
59 "event_type": "incident.escalated",
60 "occurred_at": "2026-09-29T11:21:28.311Z",
61 "resource_type": "incident"
62 }
63}
FAQ

PagerDuty incident escalated or reassigned notifications: questions

Does this work on iPhone and Android?

Yes. Install the JustPush app from the App Store or Google Play and sign in. Every phone signed in to your account gets the notification.

Do I need to write code?

No. Install the recipe in Studio, paste your webhook URL into PagerDuty and you are done. The code is there if you want to change the text, the sound or the buttons.

Can I change what the notification says?

Yes. After install the recipe's code is yours. Edit it in Studio and test it against the sample payload before you save.

What does it cost?

JustPush is free for 30 days. After that it's $19.99 a year, or $39.99 once. There is no extra charge for recipes.

Ready when you are

PagerDuty on your phone in two minutes.

Install the recipe, paste one URL, done. Free for 30 days, no credit card required.