Send Zabbix alerts to WhatsApp
A webhook media type and twenty lines of script. No phone number of your own, no WhatsApp Business account, and no gateway of your own to keep alive.
Zabbix has no WhatsApp media type, and the answers in the forums are all the same shape: a gateway service of your own, or a paid messaging account, with your own number on the far side. A webhook media type is Zabbix's own answer to this and it is a short script by design.
The script below posts to an endpoint that already owns a number and an approved template, so there is nothing to register and nothing extra to keep running.
1. Make a key
In the Jabee dashboard, go to Management then
Approvals and create an API key. It starts jak_. Copy
it now; it is not shown again.
Whoever is going to be messaged needs a verified phone, which they get by tapping a link in the dashboard and sending one message. Until somebody has done that there is nobody to deliver to.
2. Create the media type
Alerts → Media types → Create media type. Name it
WhatsApp and set Type to Webhook.
Add these parameters:
| Name | Value |
|---|---|
URL | https://api.jabee.ai/api/v1/alerts |
Token | jak_your_key_here |
Title | {ALERT.SUBJECT} |
Body | {ALERT.MESSAGE} |
EventId | {EVENT.ID} |
Then the script:
var params = JSON.parse(value),
req = new HttpRequest(),
payload = {
title: params.Title.substring(0, 120),
body: params.Body.substring(0, 2000),
external_id: 'zbx-' + params.EventId
},
resp, status;
req.addHeader('Content-Type: application/json');
req.addHeader('Authorization: Bearer ' + params.Token);
resp = req.post(params.URL, JSON.stringify(payload));
status = req.getStatus();
// 201 is a new alert, 200 a repeat of one we have already sent.
if (status !== 201 && status !== 200) {
throw 'Jabee returned ' + status + ': ' + resp;
}
return 'OK';
Three things in there are load-bearing:
substring(0, 120)on the title. Zabbix subjects are long and the limit here is 120 characters; without the cut, a normal{ALERT.SUBJECT}is rejected rather than trimmed.external_idfrom{EVENT.ID}. Zabbix retries a media type that failed, and this is what stops a retry arriving as a second WhatsApp message. It is also why200is treated as success: that is the answer to "you have sent this one already".throwon anything else, so a real failure shows up in Reports → Action log instead of disappearing.
Finally, the Message templates tab: add one for
Problem. Without it {ALERT.SUBJECT} and
{ALERT.MESSAGE} are empty and every send fails on a missing title.
3. Give a user the media
Users → your user → Media → Add, and choose the WhatsApp media type. Zabbix requires a Send to value and this media type has no use for one — the recipient is decided by the API key — so put a dash in it.
Set the severities you actually want on your phone. Warning and above is a reasonable start; Information and Not classified on WhatsApp is how people learn to ignore it.
4. Point an action at it
Alerts → Actions → Trigger actions. Either your existing action already sends to that user, or add an operation that does.
Leave the Recovery operations empty unless you want a second message when things clear. That is the one decision here that costs money: recoveries double the messages per incident, and 500 a month is 250 incidents if you take both.
What arrives
Problem: Free disk space is less than 10% on volume /
Problem started at 03:14:08 on 2026.11.13
Host: db-1
Severity: High
Whatever your Problem message template says, in other words. The default Zabbix template is already a decent WhatsApp message; if you shorten it, keep the host name in the first line, because that is what shows in a phone's notification preview.
Where it goes
One phone per business, and it is your own: the account owner's verified number by default, or another handset — an ops phone, a shared on-call one — which you point alerts at in the dashboard, under Where alerts go. Either way that phone verifies itself by sending one message to the Jabee number, carrying a code from the dashboard.
So there is nothing to address and no recipient field. To reach several people, connect your own WhatsApp number and send from there: alerts on Jabee's number go out on a sender every business here shares, and the volume you send spends a reputation everybody else depends on.
One honest caveat: no grouping
Zabbix sends one message per alert operation, so a rack losing power is as many WhatsApp messages as it is triggers. Nothing on this end groups them, and there is no window in which the second one is suppressed.
Mitigate it where Zabbix can: dependencies between triggers so the child problems stay quiet, and a sensible severity floor on the media. If your alert storms are genuinely large, the Grafana route does group, because Grafana does the grouping before it posts.
What it costs
$29 a month for 500 alerts and approvals together, then 3 cents each. The first three are free, so you can wire this up and watch a message arrive before paying for anything. No per-seat charge.
One message per alert operation here, so the 500 is 500 problems and not 500
incidents. The daily ceiling is 200 per business in any 24 hours, which an alert storm
can reach: that is a 429, logged in the action log, not a silent drop.
Questions
Can Zabbix send alerts to WhatsApp without a WhatsApp Business account?
Yes, with a webhook media type. Create a media type of type Webhook
with parameters for the URL, your key, the title and the message, and the short
script above that POSTs them to https://api.jabee.ai/api/v1/alerts.
Jabee owns the number and the approved template, so there is no Meta developer
account, no number to register and no template to submit.
Why is my Zabbix webhook failing with 400 title is at most 120 characters?
Because {ALERT.SUBJECT} is longer than that. The limit is 120
characters and nothing trims it for you, so cut it in the script with
params.Title.substring(0, 120). Shortening the Problem message
template works too.
Will a Zabbix retry send the WhatsApp message twice?
Not if you keep the external_id built from
{EVENT.ID}. A repeat of an id already sent answers 200
with existing: true and delivers nothing, which is why the script
treats 200 and 201 alike. Without it, every Zabbix retry is another message.
Can I stop the recovery messages?
Yes: leave the Recovery operations of the trigger action empty. Unlike the Grafana route, where recoveries are dropped at this end unless you ask for them, Zabbix decides this in the action — and it is the choice that halves or doubles your monthly messages.
Do I need a WhatsApp number or a Meta account?
No, neither, at any point. The message goes over Meta's official Cloud API on Jabee's registered number using Jabee's approved template, so you need an API key and nothing else. There is no number of yours involved, so there is nothing of yours to get banned.
Can it message my customers?
No, deliberately. It reaches your own people, once they have verified their phone. A shared number messaging strangers is what gets numbers banned. To reach customers you connect your own number, which is the inbox.
What happens if nobody ever answers the messages?
Five notifications in a row that a handset never replies to and we stop sending to it, with an email to the account owner saying so. Sending any message to the Jabee number starts it again. One number's standing with Meta is shared by every business on it, which is why the rule exists.