Datadog monitor alert notifications on your phone.

Get a push notification when a Datadog monitor triggers, warns, stops reporting data, or recovers, with priority following the monitor's P1–P5.

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 Datadog

Add it as a webhook for Monitor alert.

STEP 03

Get a push on your phone

With the text, sound and buttons from the recipe.

Setup

How to set up the Datadog monitor alert 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 Datadog, open Integrations > Webhooks and add a new webhook named justpush.
  3. Paste your webhook URL as the URL and replace the payload with the one from the setup notes below.https://••••••••/•••••••• your personal URL, shown after install
  4. Add @webhook-justpush to the message of every monitor that should notify you.
  5. In **Integrations → Webhooks**, add a webhook named **justpush** with the URL above, and replace its payload with this:
  6. ```json
  7. {
  8. "source": "datadog",
  9. "title": "$EVENT_TITLE",
  10. "transition": "$ALERT_TRANSITION",
  11. "priority": "$ALERT_PRIORITY",
  12. "hostname": "$HOSTNAME",
  13. "link": "$LINK",
  14. "snapshot": "$SNAPSHOT",
  15. "org": "$ORG_NAME"
  16. }
  17. ```
  18. Then add **`@webhook-justpush`** to the message of each monitor that should notify you.
  19. The template leaves out `$EVENT_MSG` on purpose: a monitor message with quotes or line breaks could produce invalid JSON. Datadog doesn't sign webhook requests, 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// Datadog → monitor alert
2// Fires when a Datadog monitor that mentions @webhook-justpush triggers, warns,
3// has no data, or recovers. Uses the custom payload from INSTALL.md.
4// Docs: https://docs.datadoghq.com/integrations/webhooks/
5
6// $ALERT_TRANSITION values, how to label them, and the default priority.
7const TRANSITIONS = {
8 Triggered: { emoji: "🔴", priority: 1 },
9 "Re-Triggered": { emoji: "🔴", priority: 1 },
10 Renotify: { emoji: "🔴", priority: 1, suffix: " (still alerting)" },
11 Warn: { emoji: "🟠", priority: 0 },
12 "Re-Warn": { emoji: "🟠", priority: 0 },
13 "No Data": { emoji: "⚪", priority: 0, suffix: " (no data)" },
14 Recovered: { emoji: "✅", priority: -1 },
15}
16
17// $ALERT_PRIORITY → push priority for alerts (P1 pages you, P5 barely whispers).
18const PRIORITIES = { P1: 2, P2: 1, P3: 1, P4: 0, P5: -1 }
19
20// Look a key up in one of the tables above, ignoring inherited names like "toString".
21function pick(table, key, fallback) {
22 return 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// Datadog leaves "$VARIABLE" untouched when it has no value; treat that as missing.
31function text(value) {
32 return typeof value === "string" && value.trim() && !/^\$[A-Z_]+$/.test(value.trim()) ? value.trim() : null
33}
34
35function handleRequest(request) {
36 const body = request.body || {}
37
38 // Guard: only payloads from the JustPush template in INSTALL.md.
39 if (body.source !== "datadog" || !text(body.title)) {
40 console.log("Not a JustPush Datadog payload — skipping")
41 return null
42 }
43
44 // Unknown transitions are treated as an alert rather than dropped.
45 const transition = pick(TRANSITIONS, text(body.transition), TRANSITIONS.Triggered)
46 const recovered = transition === TRANSITIONS.Recovered
47
48 // Event titles look like "[Triggered on {host:web-1}] High CPU on web-1"; the state is
49 // already in the emoji, so keep just the monitor name and the scope.
50 const match = text(body.title).match(/^\[[^\]]*?(?: on (.+?))?\]\s*(.+)$/)
51 const name = match ? match[2] : text(body.title)
52 // "{host:web-1}" reads better without the braces.
53 const scope = match?.[1]?.replace(/[{}]/g, "")
54
55 const alerting = transition.priority >= 1
56 const priority = alerting ? pick(PRIORITIES, text(body.priority), transition.priority) : transition.priority
57 const details = [scope ?? text(body.hostname), text(body.priority)].filter(Boolean)
58
59 return {
60 title: `${transition.emoji} ${recovered ? "Recovered: " : ""}${name}${transition.suffix ?? ""}`,
61 message: details.join(" · ") || text(body.transition) || "Monitor alert",
62 topic: "Datadog",
63 priority,
64 buttons: [...link(text(body.link), "View in Datadog"), ...link(text(body.snapshot), "View graph")],
65 }
66}
Payload

The Datadog monitor webhook

This is what Datadog sends to your URL for monitor alert. It is a sample, trimmed to the fields recipes use.

monitor · sample.json
1{
2 "org": "Acme",
3 "link": "https://app.datadoghq.com/monitors/123456?group=host%3Aweb-1",
4 "title": "[Triggered on {host:web-1}] High CPU on web-1",
5 "source": "datadog",
6 "hostname": "web-1",
7 "priority": "P2",
8 "snapshot": "https://p.datadoghq.com/snapshot/view/dd-snapshots-prod/org_1/2026-09-29/abc123.png",
9 "transition": "Triggered"
10}
FAQ

Datadog monitor alert 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 Datadog 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

Datadog on your phone in two minutes.

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