BugSnag error alert notifications on your phone.

Get a push notification for new, reopened, frequent or spiking errors in a BugSnag project.

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 BugSnag

Add it as a webhook for Error.

STEP 03

Get a push on your phone

With the text, sound and buttons from the recipe.

Setup

How to set up the BugSnag error 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 BugSnag, open your project's Settings > Integrations and data forwarding and choose Webhook.
  3. Paste your webhook URL as the webhook URL.https://••••••••/•••••••• your personal URL, shown after install
  4. Under notifications, pick the Error triggers you want and save. Use Test to send a sample.
  5. On the webhook integration, choose which **notifications** to send. This recipe handles:
  6. **New errors** (`firstException`): 🐛 New error
  7. **Reopened errors** (`reopened`): 🔁 Error reopened
  8. **Frequent errors** (`errorEventFrequency`): 📈 Frequent error
  9. **Error milestones** (`powerTen`): 🔟 Error milestone
  10. **Every exception** (`exception`): ⚠️ Error (noisy, so use with care)
  11. **Project spikes** (`projectSpiking`): 📈 Error spike
  12. Comments, releases and rate-limit notices are ignored; see the [rate limit](../rate-limit) recipe for the last one.
  13. BugSnag 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// BugSnag → error notifications
2// Fires for the error triggers you pick on BugSnag's webhook integration: new errors,
3// reopened errors, frequent errors, milestones, every exception, and project spikes.
4// Docs: https://docs.bugsnag.com/product/integrations/data-forwarding/webhook/
5
6// Each trigger, its title, and how loud to be.
7const TRIGGERS = {
8 firstException: { title: "🐛 New error", priority: 1 },
9 reopened: { title: "🔁 Error reopened", priority: 0 },
10 errorEventFrequency: { title: "📈 Frequent error", priority: 1 },
11 powerTen: { title: "🔟 Error milestone", priority: 0 },
12 exception: { title: "⚠️ Error", priority: 0 },
13 projectSpiking: { title: "📈 Error spike", priority: 1 },
14}
15
16// Only link to real http(s) URLs.
17function link(url, cta) {
18 return typeof url === "string" && /^https?:\/\//.test(url) ? [{ cta, url }] : []
19}
20
21function handleRequest(request) {
22 const body = request.body || {}
23 const type = body.trigger?.type
24
25 // Guard: only error triggers; comments, releases and rate-limit notices are skipped.
26 if (!Object.prototype.hasOwnProperty.call(TRIGGERS, type)) {
27 console.log(`Ignoring BugSnag trigger "${type ?? "unknown"}"`)
28 return null
29 }
30
31 const trigger = TRIGGERS[type]
32 const project = body.project?.name
33 const error = body.error
34
35 // A project spike has no single error, just a rate.
36 if (type === "projectSpiking" || !error) {
37 return {
38 title: `${trigger.title}${project ? ` in ${project}` : ""}`,
39 message: body.trigger.message ?? (body.trigger.rate ? `${body.trigger.rate} events` : "Spike detected"),
40 topic: "BugSnag",
41 priority: trigger.priority,
42 buttons: link(body.project?.url, "View project"),
43 }
44 }
45
46 const what = [error.exceptionClass, error.message].filter(Boolean).join(": ") || "Unknown error"
47 const stage = error.app?.releaseStage
48 const where = [error.context, stage].filter(Boolean).join(" · ")
49 // Milestones and frequency alerts explain themselves ("1000th exception").
50 const why = ["powerTen", "errorEventFrequency"].includes(type) && body.trigger.message ? ` (${body.trigger.message})` : ""
51 // Handled warnings and info reports are one step quieter than real errors.
52 const quieter = error.severity === "info" ? 2 : error.severity === "warning" ? 1 : 0
53
54 return {
55 title: `${trigger.title}${project ? ` in ${project}` : ""}`,
56 message: what + (where ? ` — ${where}` : "") + why,
57 topic: "BugSnag",
58 priority: Math.max(-1, trigger.priority - quieter),
59 buttons: link(error.url, "View error"),
60 }
61}
Payload

The BugSnag firstException webhook

This is what BugSnag sends to your URL for error. It is a sample, trimmed to the fields recipes use.

firstException · sample.json
1{
2 "error": {
3 "id": "66f8e1c2a7b9e10001a1b2c3",
4 "app": {
5 "type": "rails",
6 "version": "4.12.0",
7 "releaseStage": "production"
8 },
9 "url": "https://app.bugsnag.com/acme/web-app/errors/66f8e1c2a7b9e10001a1b2c4?event_id=66f8e1c2a7b9e10001a1b2c3",
10 "status": "open",
11 "context": "checkout#create",
12 "errorId": "66f8e1c2a7b9e10001a1b2c4",
13 "message": "undefined method `total' for nil",
14 "severity": "error",
15 "unhandled": true,
16 "receivedAt": "2026-09-29T08:06:11.000Z",
17 "firstReceived": "2026-09-29T08:06:11.000Z",
18 "exceptionClass": "NoMethodError"
19 },
20 "account": {
21 "id": "56b9ca7f17025f8756f69054",
22 "url": "https://app.bugsnag.com/accounts/acme",
23 "name": "Acme"
24 },
25 "project": {
26 "id": "56b9ca7f17025f8756f69055",
27 "url": "https://app.bugsnag.com/acme/web-app",
28 "name": "Web App"
29 },
30 "trigger": {
31 "type": "firstException",
32 "message": "New error in production"
33 }
34}
FAQ

BugSnag error 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 BugSnag 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

BugSnag on your phone in two minutes.

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