Uptimeify Docs
Incident managementAlert sources

Grafana Alerting

Send Grafana Alerting notifications to Uptimeify Incident Management via a Webhook contact point, mapped from the alert group's first alert.

Uptimeify's Grafana preset maps Grafana Alerting's webhook contact-point payload directly: the alert name, severity label, status, and instance are pre-mapped from the first alert in the notification group.

1. Create the alert source in Uptimeify

Go to Incident Management → Alert Sources → New, pick the Grafana preset, name it, and create it. On the success screen, copy the ingest URL (https://<your-domain>/api/im/ingest/<token>). It is shown once and never displayed again in cleartext. If you lose it, rotate the token from the source's Settings tab.

2. Add a Webhook contact point in Grafana

  1. In Grafana, go to Alerting → Contact points and click Add contact point.
  2. Give it a name (for example uptimeify) and set Integration to Webhook.
  3. Set the URL to the ingest URL you copied in step 1, and leave the HTTP method as POST.
  4. Leave the payload as Grafana's default webhook body. Uptimeify's preset reads the standard fields (alerts[], status, commonLabels, …) it already sends. Save the contact point.

3. Route alerts to the contact point

A contact point only receives notifications once a notification policy routes to it:

  1. Go to Alerting → Notification policies.
  2. Either point the default policy at your new contact point (every alert routes there), or add a nested policy with a label matcher (for example severity =~ ".+") that routes matching alerts to it.
  3. Save. Grafana now calls the webhook whenever an alert rule matching that policy fires or resolves.

Default field mapping

Grafana groups alerts into one notification; the preset reads all of these from the first alert (alerts[0]) in that group, falling back to the group-level title for the title field:

Grafana fieldNormalized field
alerts[0].labels.alertname (falls back to the top-level title)Title
alerts[0].labels.severitySeverity (via the map below)
alerts[0].statusStatus: resolved resolves the alert, anything else (typically firing) keeps it open
alerts[0].labels.instanceHost
alerts[0].fingerprintDedup key: Grafana's own stable per-alert identity

Severity map

Grafana has no built-in severity label. This only works if your alert rules set one (for example via a severity label on the rule):

Grafana severity labelUptimeify severity
criticalsev1
highsev2
warningsev3
infosev4

If your alert rules don't set a severity label, every alert falls back to the source's configured default severity.

Sample payload

This is the shape of payload Uptimeify's Grafana preset expects:

{
  "receiver": "uptimeify-webhook",
  "status": "firing",
  "orgId": 1,
  "alerts": [
    {
      "status": "firing",
      "labels": { "alertname": "HighCPU", "severity": "critical", "instance": "server1:9090" },
      "annotations": { "summary": "CPU usage above 90% on server1" },
      "startsAt": "2026-07-17T12:00:00Z",
      "endsAt": "0001-01-01T00:00:00Z",
      "generatorURL": "https://grafana.example.com/alerting/grafana/abc123/view",
      "fingerprint": "8f3b1c9a2d4e5f60",
      "silenceURL": "https://grafana.example.com/alerting/silence/new",
      "dashboardURL": "https://grafana.example.com/d/abc123",
      "panelURL": "https://grafana.example.com/d/abc123?viewPanel=2"
    }
  ],
  "groupLabels": { "alertname": "HighCPU" },
  "commonLabels": { "alertname": "HighCPU", "severity": "critical" },
  "commonAnnotations": { "summary": "CPU usage above 90% on server1" },
  "externalURL": "https://grafana.example.com/",
  "version": "1",
  "groupKey": "{}/{alertname=\"HighCPU\"}",
  "truncatedAlerts": 0,
  "title": "[FIRING:1] HighCPU",
  "state": "alerting",
  "message": "CPU usage above 90% on server1"
}

You can send this exact payload against your source's mapping from the Payload Mapping tab in the dashboard to verify the setup before wiring up a real notification policy.

On this page