# PRTG Network Monitor Integration

### Overview

PRTG is a network monitoring tool by Paessler AG. It keeps tabs on servers, routers, switches, bandwidth — basically anything you'd want to know is still alive in your infrastructure.

Getting it connected to the platform is straightforward. PRTG has a built-in notification method called Execute HTTP Action that lets you fire a POST request whenever a sensor changes state. We use this to ship alerts straight to the platform's webhook endpoint, which then handles the rest — validation, deduplication, escalation, the works.

One thing worth knowing upfront: PRTG doesn't send JSON. It sends `application/x-www-form-urlencoded` — the same format old HTML forms use. There's also no way to set a custom Authorization header. So instead of a Bearer token in the header, you'll put the token directly in the URL as a query parameter. It's a PRTG limitation, not ours, and the platform handles it fine.

### Integration Flow

```
PRTG Sensor State Change
        │
        │  Notification Trigger fires
        ▼
Execute HTTP Action
        │
        │  POST  application/x-www-form-urlencoded
        │  URL:  /functions/v1/events?token=<source-token>
        ▼
Platform Webhook Endpoint
        │
        │  URL-encoded body parsed → schema validated
        │  Fingerprint: md5(device::sensor::sensorid)
        ▼
Alert opened or resolved  →  On-call team notified
```

### Provider Configuration & Mapping

PRTG dumps everything into flat key-value pairs, so priority extraction is simple — we just read the `status` field directly. No JSONPath needed.

#### Priority Mapping Config

```json
{
  "priority": {
    "field": "status",
    "options": [
      { "value": "Down",    "label": "Down"    },
      { "value": "Warning", "label": "Warning" },
      { "value": "Unusual", "label": "Unusual" },
      { "value": "Up",      "label": "Up"      },
      { "value": "Paused",  "label": "Paused"  },
      { "value": "Unknown", "label": "Unknown" }
    ],
    "mapping": {
      "Down":    "CRITICAL",
      "Warning": "MEDIUM",
      "Unusual": "LOW",
      "Up":      "LOW",
      "Paused":  "LOW",
      "Unknown": "LOW"
    }
  }
}
```

#### Status → Priority

| PRTG Status | Platform Priority | What it means                              |
| ----------- | ----------------- | ------------------------------------------ |
| Down        | CRITICAL          | Sensor failed or unreachable               |
| Warning     | MEDIUM            | Crossed a warning threshold                |
| Unusual     | LOW               | Behaviour looks off but not confirmed down |
| Up          | LOW               | Sensor recovered — triggers a resolve      |
| Paused      | LOW               | Monitoring paused intentionally            |
| Unknown     | LOW               | Can't determine state                      |

#### Event Type Mapping

| PRTG Status                                 | Event Type | Result                              |
| ------------------------------------------- | ---------- | ----------------------------------- |
| Down / Warning / Unusual / Paused / Unknown | ALERT      | Alert opened or updated             |
| Up / Recovering                             | RESOLVE    | Existing alert closed automatically |

**Fingerprinting:** The platform uses `md5(device::sensor::sensorid)` to tie alerts to their recovery events. As long as the sensor identifiers stay the same — which they always do in PRTG — the resolve will land on the right alert without any manual work.

### Setup Instructions

#### Step 1: Get Your Webhook URL

1. Log in to the platform and go to **Sources → Add Source**.
2. Choose **PRTG Network Monitor** and give the source a name.
3. Save it. You'll get a webhook URL that looks like this:

```
https://<url>/functions/v1/events?token=<x-itoc-360>
```

Copy this — you'll need it in the next step.

#### Step 2: Create a Notification Template in PRTG

1. Head to **Setup → Account Settings → Notification Templates**.

   <figure><img src="https://4108595529-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FimJRSa33y5Ej6rwXrBeA%2Fuploads%2FM4fN7pvb1lu1m4QyGNjk%2Fimage.png?alt=media&#x26;token=a4342cef-f8f4-4b88-9650-c49f04b1ae4f" alt=""><figcaption></figcaption></figure>
2. Click **Add Notification Template** and give it a name like `OnCall Platform Webhook`.
3. In **Basic Settings**, a couple of things to set:

   * **Monitoring Status:** Started
   * **Notification Handling during Scheduled Pause:** Pick *Discard notifications during paused status* — otherwise PRTG will spam the platform whenever a monitor is paused.
   * **Notification Summarization:** The default (*Send first down and up message immediately, then summarize*) is fine.

   <figure><img src="https://4108595529-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FimJRSa33y5Ej6rwXrBeA%2Fuploads%2FUiZ0ETwI7qf4KrEOu3xl%2Fimage.png?alt=media&#x26;token=a3abad58-a831-439c-9257-214f41e32931" alt=""><figcaption></figcaption></figure>
4. Scroll down, find **Execute HTTP Action**, and enable it.
5. Fill it in like this:

   | Field        | Value                        |
   | ------------ | ---------------------------- |
   | URL          | Your webhook URL from Step 1 |
   | HTTP Method  | POST                         |
   | HTTP Version | HTTP 1.1                     |
6. In the **Payload** field, paste this:

```
sensorid=%sensorid&device=%device&sensor=%sensor&status=%status&message=%message&since=%since&lastup=%lastup&lastdown=%lastdown&downtime=%downtime&group=%group&probe=%probe&host=%host&linkdevice=%linkdevice&linksensor=%linksensor&deviceid=%deviceid
```

<figure><img src="https://4108595529-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FimJRSa33y5Ej6rwXrBeA%2Fuploads%2FIaWVAk3aWl01Bf4yW2sH%2FEkran%20Resmi%202026-02-28%2004.45.30.png?alt=media&#x26;token=ad61ba99-0487-454d-a96c-07ce006b7e57" alt=""><figcaption></figcaption></figure>

7. Hit **Save**.

#### Step 3: Attach the Template to a Trigger

The notification template won't do anything on its own — it needs to be connected to a trigger.

1. In the device tree, open the **Root** group (or whichever group you want to cover).
2. Go to the **Notification Triggers** tab.
3. Set up triggers for the states you care about:

   | Trigger       | Condition              | Template                |
   | ------------- | ---------------------- | ----------------------- |
   | State Trigger | Sensor goes Down       | OnCall Platform Webhook |
   | State Trigger | Sensor goes to Warning | OnCall Platform Webhook |
   | State Trigger | Sensor returns to Up   | OnCall Platform Webhook |

> On the Down trigger, turn on *repeat every X minutes*. If the first notification fails because of a network issue, PRTG will keep retrying instead of going silent.

#### Step 4: Test It

No need to kill a real sensor. PRTG can send a test notification from the template itself.

1. Open your notification template and scroll to the bottom.
2. Click **Send Test Notification**.

   <figure><img src="https://4108595529-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FimJRSa33y5Ej6rwXrBeA%2Fuploads%2FOrygP3mwggcCmUOtheM9%2Fimage.png?alt=media&#x26;token=30eba47d-5efb-4d6a-8faf-4830bcda470f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4108595529-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FimJRSa33y5Ej6rwXrBeA%2Fuploads%2Fqm91wBQYLQAhMnQLlzAe%2Fimage.png?alt=media&#x26;token=9f6a8f86-e310-42b8-9a5f-c2cb415b0403" alt=""><figcaption></figcaption></figure>

> The screenshot above shows exactly how PRTG's payload looks when it arrives — flat key-value pairs, not JSON. The platform parses this automatically before running validation.

### Payload Examples

#### Alert — Sensor Down

```
sensorid=1001
device=web-server-01
sensor=Ping
status=Down
message=Timeout (ping) [9 %] - 90% packet loss
since=01/05/2026 14:23:10
lastup=01/05/2026 14:22:45
lastdown=01/05/2026 14:23:10
downtime=0 days 0 hours 0 minutes
group=Production Servers
probe=Local Probe
host=192.168.1.100
linkdevice=https://prtg.example.com/device.htm?id=2001
linksensor=https://prtg.example.com/sensor.htm?id=1001
deviceid=2001
```

#### Resolve — Sensor Back Up

```
sensorid=1001
device=web-server-01
sensor=Ping
status=Up
message=OK (ping) [100 %] - 0% packet loss
since=01/05/2026 14:25:30
lastup=01/05/2026 14:25:30
lastdown=01/05/2026 14:23:10
downtime=0 days 0 hours 2 minutes
group=Production Servers
probe=Local Probe
host=192.168.1.100
linkdevice=https://prtg.example.com/device.htm?id=2001
linksensor=https://prtg.example.com/sensor.htm?id=1001
deviceid=2001
```
