Webhook to Slack, Discord and Teams
A webhook (an automatic message sent to a given address) is a universal way to push a notification into any application - Slack, Discord, Microsoft Teams or your own system. Setup takes a few minutes and ePulz.io formats the message for the target service automatically.
ePulz.io automatically detects the target service type from the webhook address. We recognise: Slack (hooks.slack.com/services/...), Discord (discord.com/api/webhooks/... and discordapp.com/api/webhooks/...), Microsoft Teams including Power Automate / Workflows (*.webhook.office.com, outlook.office.com/webhook/..., *.logic.azure.com/workflows/...). For any other address we use a generic JSON payload.
Connecting Slack
- In Slack open api.slack.com/apps and click Create New App → From scratch.
- Name the app (for example "ePulz Alerts") and pick the workspace it should belong to.
- In the left menu choose Incoming Webhooks and switch them to On.
- Click Add New Webhook to Workspace and select the channel where you want to receive alerts.
- Copy the generated webhook address (it starts with
https://hooks.slack.com/services/...). - In ePulz.io open Settings → Notifications → Webhook, paste the address and save.
ePulz.io automatically detects that this is Slack and sends nicely formatted messages with a colour bar (red for an outage, green for recovery) and a link back to the dashboard.
Connecting Discord
- In your Discord server right-click the channel and choose Edit Channel → Integrations → Webhooks.
- Click New Webhook, optionally name the bot and set an avatar.
- Click Copy Webhook URL. The address looks like
https://discord.com/api/webhooks/.... - In ePulz.io open Settings → Notifications → Webhook, paste the address and save.
For Discord too the message format is prepared automatically - it uses a Discord embed (a highlighted message with a frame) with the monitor name, problem description and time.
Testing the webhook
After saving the address, click Test in the settings. We send a test message to the target channel so you can see right away how the alert will look. If nothing arrives, check that you copied the full address correctly and that the bot has access to the channel.
Microsoft Teams (Adaptive Card)
For Microsoft Teams (including Power Automate / Workflow URLs logic.azure.com/workflows/...) we send the message as an Adaptive Card v1.4 wrapped in a message:
{
"type": "message",
"attachments": [{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{"type": "TextBlock", "text": "Monitor DOWN: Production site", "weight": "bolder", "size": "large"},
{"type": "TextBlock", "text": "Unavailable: HTTP 503", "wrap": true}
],
"actions": [
{"type": "Action.OpenUrl", "title": "Open in ePulz.io", "url": "https://epulz.io/dashboard/monitor/42"}
]
}
}]
}
In Teams the webhook address comes from the Incoming Webhook connector in the channel, or from the Power Automate template "Post to Teams when a HTTP request is received".
Custom webhook (generic endpoint)
If you need to send alerts to your own application, enter your endpoint address (the target address) in the settings. ePulz.io sends a POST request there with a JSON body:
{
"event": "down",
"monitor": {
"name": "Production site",
"target": "https://example.com",
"url": "https://epulz.io/dashboard/monitor/42"
},
"message": "Unavailable: HTTP 503",
"timestamp": "2026-05-31T14:23:45+00:00",
"source": "epulzio"
}
The event field takes the values down (outage), up (recovery), ssl (upcoming SSL certificate expiry), domain (upcoming domain expiry), anomaly (response anomaly) or test (test send). The monitor.name field is the monitor name, monitor.target is the monitored address and monitor.url is the link back to the ePulz.io dashboard.
Signature verification (HMAC)
Optionally you can enable signing in the settings - we then sign every request with a secret key (HMAC SHA-256) and add two headers:
X-ePulzio-Signature- signature in the formsha256=<hex digest>of the request bodyX-ePulzio-Event- the event type (the same value as theeventfield in the body)
On your endpoint you simply compute HMAC SHA-256 of the received body with the same secret key and compare it with the header. If they match, the request is genuine and was not altered in transit.
#alerts). The channel then will not get flooded with other discussion and no one will miss critical messages.