Recipe · Grafana Alerting

Grafana alerts on WhatsApp: one contact point

Since Grafana 12 the webhook contact point can send a fully custom payload with your own auth header. That is exactly one pingwa call. Self-hosted Grafana ≥ 12.0 (custom payloads aren't GA on Grafana Cloud yet). Text join to get a key.

§ 1

The contact point

Alerting → Contact points → New, type Webhook:

Grafana → Webhook contact point
URL:                  https://pingwa.dev/v1/notify
Authorization Header
  Scheme:             Bearer
  Credentials:        pw_YOUR_KEY

Custom Payload:
{{ define "webhook.custom.payload" -}}
  {{ coll.Dict
  "text" (printf "%.1000s" (print "Grafana " .Status " · " (len .Alerts) " alert(s): "
          (tmpl.Exec "pingwa.alert_names" .Alerts)))
  | data.ToJSON }}
{{- end }}

{{- define "pingwa.alert_names" -}}
  {{- range $i, $a := . -}}
    {{- if $i }}, {{ end }}{{ $a.Labels.alertname }}
  {{- end -}}
{{- end }}

Verified 2026-07-23 with Grafana 12.x. If your payload editor disagrees, check the current webhook notifier docs. The one rule: the template must emit {"text": "…"}, max 1024 chars. The printf "%.1000s" wrap trims a huge alert group so the message still lands instead of bouncing with a 422.

§ 2

One incident, one message

Grafana already groups alerts per notification policy. Lean on it instead of paying per alert: keep a sane group_by (e.g. alertname), group_wait 30s+, and a repeat_interval of hours, not minutes. One webhook call = one WhatsApp message summarizing N alerts. Free plan is 30 paid messages/month; a 402 body tells you when you've spent it; a 429 means slow down (60/min).

§ 3

Two-way

These alerts are one-way. When an alert should trigger an action (restart, rollback, silence), have your runbook script call POST /v1/ask with buttons and approve from your phone. See the API docs and the monitoring recipes.

§ 4

FAQ

I'm on Grafana < 12 / Grafana Cloud.

The fixed webhook payload doesn't fit pingwa's schema. Options: route through Alertmanager ≥ 0.32 (recipe), relay via a 5-line script (monitoring page), or the Apprise CLI recipe. If old-Grafana demand shows up, a pingwa-side adapter endpoint is on the shortlist. Tell us.

Resolved notifications too?

Yes. The same contact point fires on resolve with .Status = "resolved". Costs a message; disable "Send resolved" on the contact point if you only want the bad news.

QR code to join pingwa on WhatsApp

Scan the code and get instant access. It opens WhatsApp with “join” ready to send, and your API key comes straight back.

pingwa carries the ping over the official Meta Cloud API. Your own number stays out of it (why that matters). Alerts landing outside your 24h reply window are paid template sends; the free plan's 30/month covers a well-tended alert stack.