---
title: "Zabbix"
description: "Send Zabbix trigger alerts to Uptimeify Incident Management via a Webhook media type, using the ready-made script Uptimeify generates for you."
---

Uptimeify's Zabbix preset maps a Zabbix **Webhook** media type's payload directly: trigger name, severity, status, and host are pre-mapped. Uptimeify also gives you a ready-to-paste script for the media type's **Script** tab, so you don't have to write the JavaScript yourself.

## 1. Create the alert source in Uptimeify

Go to **Incident Management → Alert Sources → New**, pick the **Zabbix** preset, name it, and create it. On the success screen:

- Copy the ingest URL (`https://<your-domain>/api/im/ingest/<token>`), shown once.
- Use the **download media type script** action to save the ready-made webhook script (or copy it from below).

## 2. Create the webhook media type in Zabbix

1. In Zabbix, go to **Data collection → Media types** (Zabbix 7.0; **Administration → Media types** on Zabbix 6.x and older) and click **Create media type**.
2. Set **Type** to **Webhook**.
3. Open the **Script** tab and paste in the script below (or the one Uptimeify generated for your source; the two are identical).
4. Add a media type parameter named `UPTIMEIFY.INGEST.URL` (referenced in the script as `{$UPTIMEIFY.INGEST.URL}`) and set its value to the ingest URL you copied in step 1. The script reads the URL from this parameter rather than hard-coding it, so rotating the token later only means updating this one value.
5. Save the media type.

### Webhook script

```javascript
// Zabbix Webhook media type — Script tab (JavaScript).
// Data > Alerts > Media types > Webhook > Script. Field names below map 1:1
// onto this preset's selectors (event_id, event_severity, trigger_name, ...).
var params = JSON.parse(value);
var payload = {
  event_id: params.event_id,
  event_source: params.event_source,
  event_value: params.event_value,
  event_severity: params.event_severity,
  trigger_name: params.trigger_name,
  trigger_status: params.trigger_status,
  host_name: params.host_name,
  date: params.date,
  time: params.time
};
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
req.post('{$UPTIMEIFY.INGEST.URL}', JSON.stringify(payload));
return 'OK';
```

This script forwards Zabbix's own webhook parameters (`event_id`, `event_severity`, `trigger_name`, `trigger_status`, `host_name`, …) unchanged as JSON, it does not transform them. Uptimeify's Zabbix preset already expects exactly this shape, so no further mapping edits are needed.

## 3. Wire it up to a trigger action

1. Add the new media type to a Zabbix user under **Users → Users → *(user)* → Media**. Zabbix requires a "Send to" address value even for a webhook. Any non-empty value works, the script ignores it.
2. Create or edit a **Trigger action** under **Data collection → Actions → Trigger actions**, with an operation that sends a message to that user via your new media type.
3. Trigger a test problem (or wait for the next real one) and confirm it shows up under **Incident Management → Alert Sources → your Zabbix source**.

## Default field mapping

| Zabbix webhook parameter | Normalized field |
|---|---|
| `trigger_name` | Title |
| `event_severity` | Severity (via the map below) |
| `trigger_status` | Status: `OK` resolves the alert, anything else keeps it open |
| `host_name` | Host |
| `event_id` | Dedup key: groups PROBLEM/OK events for the same trigger into one alert |

### Severity map

| Zabbix `event_severity` | Uptimeify severity |
|---|---|
| `Disaster` | `sev1` |
| `High` | `sev2` |
| `Average` | `sev3` |
| `Warning` | `sev4` |
| `Information` | `sev4` |
| `Not classified` | `sev4` |

## Sample payload

This is the shape of payload Uptimeify's Zabbix preset expects, the same shape the script above produces:

```json
{
  "event_id": "6633487",
  "event_source": "0",
  "event_value": "1",
  "event_severity": "Disaster",
  "trigger_name": "Zabbix agent is not available on Zabbix server",
  "trigger_status": "PROBLEM",
  "host_name": "Zabbix server",
  "date": "2026.07.17",
  "time": "12:00:00"
}
```

You can send this exact payload against your source's mapping from the **Payload Mapping** tab in the dashboard to verify the setup before wiring up a real trigger.
