# Phone Call Alerts for Prometheus Alertmanager and Grafana

> Phone call alerts from Prometheus Alertmanager and Grafana: webhook receiver config, Grafana contact point, send_resolved, dedup and press-1 ack.

Source: https://edesy.in/blog/alertmanager-grafana-phone-call-alerts-2026

**To get phone call alerts from Prometheus Alertmanager or Grafana, create an Alert webhook monitor in Edesy OnCall and add its URL as a webhook receiver (Alertmanager) or a Webhook contact point (Grafana).** Each firing alert opens an incident and phones the people on your escalation policy, who press 1 to acknowledge or 2 to escalate. Resolved alerts close the incident automatically. You keep your existing rules and dashboards; OnCall only adds the call.

## Why add calls to Prometheus and Grafana

Alertmanager and Grafana are good at deciding *that* something is wrong. Getting a human to act at 2 am is a different problem. Email and chat receivers are easy to miss, and nothing escalates when nobody responds. A call-based receiver adds three things:

- A ringing phone, spoken in English or Hindi per contact
- A response: press 1 to acknowledge, press 2 to pass it on now
- An escalation ladder when nobody responds

## Step 1: Create the webhook monitor

At [oncall.edesy.in](https://oncall.edesy.in), go to **Monitors → New**, choose **Alert webhook**, name it ("Prod Prometheus") and pick an escalation policy. The monitor page shows a URL like:

```
https://oncall.edesy.in/ingest/<token>
```

The token works as the password, so treat the URL as a secret. Rotate it from the monitor page if it leaks. OnCall needs an Edesy phone number in your workspace as the caller ID, so connect your workspace in Setup first.

## Step 2a: Alertmanager receiver

Add a receiver with `webhook_configs` and route critical alerts to it:

```yaml
# alertmanager.yml
route:
  receiver: default
  routes:
    - matchers:
        - severity="critical"
      receiver: edesy-oncall

receivers:
  - name: default
    # your existing email or chat receiver
  - name: edesy-oncall
    webhook_configs:
      - url: https://oncall.edesy.in/ingest/<token>
        send_resolved: true
```

Keep `send_resolved: true`, so that recoveries close the incident. Route only alerts that justify waking someone; leave warnings on your existing receivers.

Full field mapping: [Alertmanager ingest doc](https://edesy.in/docs/oncall/ingest/alertmanager).

## Step 2b: Grafana contact point

In Grafana: **Alerting → Contact points → Add contact point**, integration **Webhook**, paste the URL, method POST. Then point a notification policy at it. Or provision it:

```yaml
# provisioning/alerting/contact-points.yaml
apiVersion: 1
contactPoints:
  - orgId: 1
    name: Edesy OnCall
    receivers:
      - uid: edesy-oncall
        type: webhook
        settings:
          url: https://oncall.edesy.in/ingest/<token>
          httpMethod: POST
```

Grafana's unified alerting payload is a superset of Alertmanager's, so OnCall reads it the same way. Details: [Grafana ingest doc](https://edesy.in/docs/oncall/ingest/grafana).

## How the payload becomes a call

OnCall detects the format automatically. A payload with `alerts` plus Grafana fields such as `orgId` is read as Grafana; one with just `alerts` as Alertmanager. You can force it with `?format=alertmanager` or `?format=grafana` on the URL.

| Payload field | Used for |
|---|---|
| `alerts[].status` (or top-level `status`) | `firing` opens an incident; anything else resolves it |
| `alerts[].fingerprint` | Dedup key; repeats update one incident |
| `labels.alertname` + `instance` + `job` | Dedup key when no fingerprint is sent |
| `annotations.summary` (else `alertname`) | Title, read aloud on the call |
| `annotations.description` (else `message`, else `instance`) | Detail, in the incident and email |

So an alert with `summary: "API error rate above 5%"` produces: *"This is an alert from Acme. Prod Prometheus is down since 2:14 AM. Reason: API error rate above 5%: ..."* followed by the press-1 prompt.

Write `summary` annotations that make sense when spoken: short, plain, no template noise. Titles are capped at 200 characters and messages at 300.

## Grouping, dedup and flapping

A single webhook delivery can carry many alerts, and each one is processed separately. Each fingerprint maps to at most one open incident, so:

- Alertmanager's repeat notifications for the same alert don't open new incidents.
- A firing → resolved → firing alert reopens only after the earlier incident is resolved.
- Once someone presses 1, no more calls go out for that incident, even if the alert keeps firing.

The monitor counts as down while any incident from that source is open, and up when all are resolved.

Use Alertmanager's `group_by`, `group_wait` and `repeat_interval` as usual. OnCall doesn't need special settings.

## Test it without breaking production

Post a fake alert with curl:

```bash
curl -fsS -X POST https://oncall.edesy.in/ingest/<token> \
  -H 'Content-Type: application/json' \
  -d '{"status":"firing","alerts":[{"status":"firing","labels":{"alertname":"TestAlert","instance":"web-1"},"annotations":{"summary":"Test alert from curl"}}]}'
```

You get `202` with the number of alerts accepted, and your phone rings. Send the same body with `"resolved"` to close it. Alertmanager's own test (`amtool`) or Grafana's **Test** button on the contact point also work.

The ingest endpoint is rate-limited to 120 requests a minute per IP and accepts bodies up to 1 MB.

## Escalation and night calls

The webhook monitor uses a normal escalation policy: step 1 calls the primary engineer, step 2 a backup after the wait you set, with email alongside if you like. Read [escalation policies explained](https://edesy.in/blog/on-call-escalation-policy-explained-2026).

Between 21:00 and 09:00 IST, a workspace on the standard calling window gets a plain spoken alert without press 1; acknowledge by email or in the dashboard. Edesy support can enable 24x7 press-1 calls. See [night mode](https://edesy.in/docs/oncall/alerts/night-mode).

## What it costs

| Plan | Price | Monitors | Contacts |
|---|---|---|---|
| Free | Rs 0 | 3 | 2 |
| Starter | Rs 499/month | 20 | 5 |
| Pro | Rs 1,499/month | 100 | 25 |

One webhook monitor can carry every alert from an Alertmanager. Alert calls are billed per minute from your Edesy wallet; prices exclude 18% GST. See [pricing](https://edesy.in/uptime-monitoring-phone-call-alerts/pricing).

More: the [Prometheus and Grafana use case](https://edesy.in/uptime-monitoring-phone-call-alerts/use-cases/prometheus-grafana-alert-phone-call), the [Grafana integration](https://edesy.in/uptime-monitoring-phone-call-alerts/integrations/grafana-phone-call-alerts) and [Alertmanager integration](https://edesy.in/uptime-monitoring-phone-call-alerts/integrations/prometheus-alertmanager-phone-call) pages, and the [OnCall overview](https://edesy.in/uptime-monitoring-phone-call-alerts). Using Uptime Kuma instead? See [Uptime Kuma phone call notifications](https://edesy.in/blog/uptime-kuma-phone-call-notifications-2026).

OnCall alerts by call and email only; it doesn't post to Slack or Teams or send SMS.

## FAQ

### Can Alertmanager make a phone call?

Not by itself. Alertmanager sends webhooks. Point a webhook receiver at an Edesy OnCall alert webhook URL and OnCall turns each firing alert into a phone call to the people on your escalation policy.

### Do resolved alerts close the incident?

Yes, if your tool sends them. Keep send_resolved: true in Alertmanager; Grafana sends resolved notifications by default. A resolved alert with the same fingerprint closes the matching incident.

### Will a flapping alert call me again and again?

No. Alerts with the same fingerprint update one open incident instead of opening new ones. Once someone presses 1, escalation stops for that incident.

### Do webhook monitors count towards my plan?

Yes. Each alert webhook URL is one monitor. One webhook can carry many alerts from Alertmanager or Grafana, so most teams need only one or two.

**Start free with 3 monitors at [oncall.edesy.in](https://oncall.edesy.in).**
