PagerDuty incident triggered notifications on your phone.

Get a Highest-priority push notification when a PagerDuty incident is triggered or reopened, with its service, priority and who's on it.

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.triggered and incident.reopened.

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.triggered and incident.reopened 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.triggered and incident.reopened 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.triggered**. Tick **incident.reopened** too if you want a push when a resolved incident comes back. The recipe ignores every other event type.
  6. To check the connection, open the webhook, click **Send Test Event** under **Test**, and you'll get a quiet "PagerDuty connected" push.
  7. High-urgency incidents push at Highest priority, low-urgency ones at High. For acknowledgements and resolutions, add the **Incident acknowledged or resolved** recipe as a separate webhook.
  8. 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.triggered (and incident.reopened)
2// Fires when a PagerDuty v3 webhook subscription reports a new incident, or one that was
3// resolved and has been reopened.
4// Docs: https://docs.pagerduty.com/developer/webhooks-overview
5
6// The events this recipe pushes for, and how to title them.
7const EVENTS = {
8 "incident.triggered": "🔴",
9 "incident.reopened": "🔴 Reopened:",
10}
11
12// High-urgency incidents page people, so they're Highest (2); low-urgency ones don't
13// wake anyone up, so they're High (1). PagerDuty's default urgency is high, so an
14// unknown value is treated the same way.
15const URGENCY = {
16 high: 2,
17 low: 1,
18}
19
20// Look a key up without tripping over inherited names like "toString".
21function pick(table, key, fallback) {
22 return typeof key === "string" && Object.prototype.hasOwnProperty.call(table, key) ? table[key] : fallback
23}
24
25// Only link to real http(s) URLs.
26function link(url, cta) {
27 return typeof url === "string" && /^https?:\/\//.test(url) ? [{ cta, url }] : []
28}
29
30// A trimmed string, or null for anything else.
31function text(value) {
32 return typeof value === "string" && value.trim() ? value.trim() : null
33}
34
35function handleRequest(request) {
36 const body = request.body && typeof request.body === "object" ? request.body : {}
37 const event = body.event && typeof body.event === "object" ? body.event : {}
38 const type = event.event_type
39
40 // "Send Test Event" on the subscription sends a pagey.ping; confirm the connection quietly.
41 if (type === "pagey.ping") {
42 return {
43 title: "🔔 PagerDuty connected",
44 message: text(event.data?.message) ?? "Your webhook subscription is working",
45 topic: "PagerDuty",
46 priority: -1,
47 }
48 }
49
50 // Guard: only new or reopened incidents. v3 webhooks have no event header, so the
51 // payload's event_type decides.
52 const incident = event.data
53 if (!pick(EVENTS, type, null) || !incident || typeof incident !== "object") {
54 console.log(`Ignoring PagerDuty "${type ?? "unknown"}" event`)
55 return null
56 }
57
58 const title = text(incident.title) ?? text(incident.summary) ?? "New incident"
59 const number = Number.isFinite(incident.number) ? `#${incident.number}` : null
60 const assignees = (Array.isArray(incident.assignees) ? incident.assignees : [])
61 .map((user) => text(user?.summary))
62 .filter(Boolean)
63 .join(", ")
64 const details = [
65 number,
66 text(incident.service?.summary),
67 text(incident.priority?.summary),
68 assignees,
69 ].filter(Boolean)
70
71 return {
72 title: `${EVENTS[type]} ${title}`,
73 message: details.join(" · ") || "A new incident needs a responder",
74 topic: "PagerDuty",
75 priority: pick(URGENCY, incident.urgency, 2), // see URGENCY above
76 buttons: link(incident.html_url, "Open incident"),
77 }
78}
Payload

The PagerDuty incident.triggered webhook

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

incident.triggered · sample.json
1{
2 "event": {
3 "id": "01D8XQ2R5ZK3Q7N0W4H6J9ABCD",
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": "PTUXL6G",
39 "self": "https://api.pagerduty.com/users/PTUXL6G",
40 "type": "user_reference",
41 "summary": "Sam Lee",
42 "html_url": "https://acme.pagerduty.com/users/PTUXL6G"
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.triggered",
60 "occurred_at": "2026-09-29T10:51:28.169Z",
61 "resource_type": "incident"
62 }
63}
FAQ

PagerDuty incident triggered 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.