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.
The contact point
Alerting → Contact points → New, type Webhook:
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.
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).
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.
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.
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.