---
title: "Prometheus Alertmanager"
description: "Send Prometheus Alertmanager notifications to Uptimeify Incident Management via a webhook receiver, mapped from commonLabels and the first alert."
---

Uptimeify's Alertmanager preset maps Alertmanager's `webhook_config` notification payload directly: the summary/alertname, severity label, status, and instance are pre-mapped.

## 1. Create the alert source in Uptimeify

Go to **Incident Management → Alert Sources → New**, pick the **Prometheus Alertmanager** 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 receiver in Alertmanager

Add a receiver to your `alertmanager.yml` pointing at the ingest URL:

```yaml
receivers:
  - name: uptimeify
    webhook_configs:
      - url: "https://<your-domain>/api/im/ingest/<token>"
        send_resolved: true
```

`send_resolved: true` is required. Without it, Alertmanager never calls the webhook when an alert resolves, so incidents in Uptimeify would stay open forever even after the underlying problem clears.

## 3. Route alerts to the receiver

Reference the receiver from a route in the same file (either as the default route, or a nested route matching specific labels):

```yaml
route:
  receiver: uptimeify
  # ...existing routing tree, or a nested `routes:` matcher instead of the default
```

Reload or restart Alertmanager to pick up the config change (`amtool check-config` first is a good sanity check).

## Default field mapping

Alertmanager groups multiple firing alerts into one notification; the preset reads the title and instance from the **first alert** (`alerts[0]`) in that group, and severity from the group-level `commonLabels`:

| Alertmanager field | Normalized field |
|---|---|
| `alerts[0].annotations.summary` (falls back to `commonLabels.alertname`) | Title |
| `commonLabels.severity` | Severity (via the map below) |
| `status` (top-level) | Status: `resolved` resolves the alert, anything else (typically `firing`) keeps it open |
| `alerts[0].labels.instance` | Host |
| `alerts[0].fingerprint` | Dedup key: Alertmanager's own stable per-alert identity |

### Severity map

This only works if your alert rules set a `severity` label:

| Alertmanager `severity` label | Uptimeify severity |
|---|---|
| `critical` | `sev1` |
| `warning` | `sev3` |
| `info` | `sev4` |

Any other value, or a missing `severity` label, falls back to the source's configured default severity. There is no `sev2` mapping for Alertmanager, since its own severity convention is typically just `critical`/`warning`/`info`.

## Sample payload

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

```json
{
  "version": "4",
  "groupKey": "{}:{alertname=\"InstanceDown\"}",
  "truncatedAlerts": 0,
  "status": "firing",
  "receiver": "uptimeify-webhook",
  "groupLabels": { "alertname": "InstanceDown" },
  "commonLabels": { "alertname": "InstanceDown", "severity": "critical", "job": "node" },
  "commonAnnotations": { "summary": "Instance 10.0.0.5:9100 down" },
  "externalURL": "http://alertmanager.example.com:9093",
  "alerts": [
    {
      "status": "firing",
      "labels": { "alertname": "InstanceDown", "severity": "critical", "instance": "10.0.0.5:9100", "job": "node" },
      "annotations": { "summary": "Instance 10.0.0.5:9100 down", "description": "10.0.0.5:9100 has been down for more than 5 minutes." },
      "startsAt": "2026-07-17T12:00:00.000Z",
      "endsAt": "0001-01-01T00:00:00Z",
      "generatorURL": "http://prometheus.example.com:9090/graph?g0.expr=up%7Bjob%3D%22node%22%7D+%3D%3D+0",
      "fingerprint": "5b6e6e8f7a1c9d3e"
    }
  ]
}
```

You can send this exact payload against your source's mapping from the **Payload Mapping** tab in the dashboard to verify the setup before reloading Alertmanager with the real receiver.
