---
title: "Notifications"
description: "Get told when a delivery fails, retries, gives up, is skipped, succeeds or recovers — by email, Slack, Discord, Telegram, Teams, SMS, PagerDuty and more."
url: "https://wpwebhooks.org/docs/notifications/"
---

[WP Webhooks](https://wpwebhooks.org/) / [Docs](https://wpwebhooks.org/docs/) / Notifications

Feature since v3.3.0

# Notifications

Get told when a delivery fails, retries, gives up, is skipped, succeeds or recovers — by email, Slack, Discord, Telegram, Teams, SMS, PagerDuty and more.

A webhook that fails at 3 a.m. used to fail quietly: the retries ran, the log filled up, and nobody knew until a customer asked where their order went. Notifications close that gap. Rules decide \*when\* and \*where\* — "page on-call when a delivery gives up", "post 5xx errors to #ops-alerts", "email me a daily summary" — channels are the destinations, and every message is a template you can edit, preview against a real payload, or let the AI draft. Entirely free; nothing here is Pro-gated.

## Six events

A rule fires on one delivery event: **Attempt failed** (any single failed try, before retries are exhausted), **Retry scheduled** (a failed try that will be retried, with the time of the next one), **Permanently failed** (the delivery gave up — out of attempts, or a non-retryable error such as a 4xx), **Recovered** (delivered after at least one failed attempt), **Delivered** (every success) and **Skipped** (conditions did not pass). Test dispatches never notify unless the rule opts in.

## Channels

Email (through `wp_mail()`, so your SMTP plugin applies), Slack (Block Kit card via an incoming webhook), Discord, Telegram (bot token + chat), Microsoft Teams (Workflows webhook — the retired Office 365 connectors are not used), Google Chat, Mattermost / Rocket.Chat, Pushover, ntfy, SMS and WhatsApp through Twilio, PagerDuty Events v2 (an incident opens on failure and resolves on recovery when both rules point at the same channel), and a generic webhook that posts the message as JSON with an HMAC signature. Secrets are stored in the same encrypted envelope as the Credentials Vault and are never returned over the API — the card shows a masked hint. Every channel has a Send test button.

## Filters that keep it quiet

Which attempt number (fire on the first failure only, or on the third), which HTTP responses (`503`, `5xx`, `500-504`, or "no response" for DNS, TLS and timeouts), out-of-attempts vs not-retryable for permanently failed, and trigger-name patterns such as `woocommerce_*`. A **quiet time per webhook** sends at most one message per webhook in the window and records the rest as throttled. **Hourly or daily digests** fold everything from the period into one summary per channel. A site-wide "every success" rule starts with a one-hour quiet time so a busy shop does not flood the inbox.

## Site-wide and per-webhook

Site-wide rules apply to every webhook. On the webhook form each webhook can **inherit** them (and mute individual ones with the bell icon), keep **only its own rules**, or switch notifications **off**. Per-webhook rules render their preview from that webhook's captured payload, so `{{ payload.order.id }}` shows a real value while you type.

## Every message is a template

Subject (email), title (chat cards and push), body, and a one-liner for SMS use the same `{{ path }}` placeholders as dynamic URLs. Roots: `webhook.*` (name, endpoint, edit and log links), `event.*` (trigger, UUID, timestamp), `delivery.*` (attempt, max attempts, HTTP code, error message, response body, duration, next attempt, log URL), `payload.*` (the mapped payload that was sent), `original.*` and `args.*` (the raw hook arguments, e.g. `{{ args.0.email }}`) and `site.*`. Modifiers: `| upper`, `| lower`, `| truncate:120`, `| default:"—"`, `| date:"Y-m-d H:i"`, `| number:2`, `| money`, `| count`, `| join:", "` and `| json`. An **Insert field** picker lists every path in the captured payload with a sample value; a linter flags paths that are not in the payload, unknown roots and unknown modifiers before you save; and a live preview renders the message as each channel will show it. Values under keys that look like secrets (passwords, tokens) are redacted before rendering.

## Draft with AI

The rule editor can ask the site's AI provider to write the message from the captured payload — "mention the order number and the customer email, keep it short" — and the same linter checks the draft. Build with AI can add a rule to a plan ("…and ping me on Slack if it fails") through the `create_notification_rule` ability; a template that names a path the payload does not have is rejected with the list of what is available, so the model corrects itself instead of storing a message that renders blanks.

## Sent log, bell and health

The **Sent** tab lists every notification with its status — sent, failed (with the error and a resend button), throttled, waiting for digest — filterable and paginated. A bell badge on a delivery-log row shows how many notifications that delivery produced. When a channel keeps failing (a rotated Slack URL, a revoked bot token) the health bar at the top of the admin says so and links to the channel.

## How sending works

The dispatcher fires `fswa_delivery_event` at every state change with the full context; the notifier matches rules, renders the message once and queues one row per channel. Sends happen off the request that delivered the webhook — on the next queue tick, or right away when WP-Cron can be nudged — never inside a customer's checkout, and a failed send retries up to three times. Nothing is cached per process, so a rule you switch off applies at once even under Action Scheduler or WP-CLI.

## Import & export

A build export carries a webhook's notification rules. Channels never travel (they hold secrets); on import a rule whose channels do not exist on the target site is created switched off and listed in the import summary so you can point it at the right channel.

/ Examples

A body template for a WooCommerce order that failed to reach the CRM

```
Order {{ payload.order.id | default:"?" }} for {{ payload.billing.email }} did not reach HubSpot.
Attempt {{ delivery.attempt }} of {{ delivery.max_attempts }} — HTTP {{ delivery.http_code | default:"no response" }}
{{ delivery.error_message | truncate:160 }}

{{ delivery.log_url }}
```

/ Related

[Get alerted when a webhook fails](https://wpwebhooks.org/docs/alert-on-failed-webhooks/)[fswa\_delivery\_event](https://wpwebhooks.org/docs/fswa-delivery-event/)[fswa\_notification\_message](https://wpwebhooks.org/docs/fswa-notification-message/)[fswa\_notification\_channel\_drivers](https://wpwebhooks.org/docs/fswa-notification-channel-drivers/)[fswa\_notification\_http\_args](https://wpwebhooks.org/docs/fswa-notification-http-args/)[fswa\_notification\_inline\_send](https://wpwebhooks.org/docs/fswa-notification-inline-send/)[create\_notification\_rule](https://wpwebhooks.org/docs/ability-create-notification-rule/)[list\_notification\_channels](https://wpwebhooks.org/docs/ability-list-notification-channels/)[Delivery Logs](https://wpwebhooks.org/docs/delivery-logs/)[Smart Retry with Exponential Backoff](https://wpwebhooks.org/docs/smart-retry/)[Credentials Vault](https://wpwebhooks.org/docs/credentials-vault/)[Build with AI](https://wpwebhooks.org/docs/build-with-ai/)[Feature page: Notifications](https://wpwebhooks.org/features/notifications/)

/Ready

## Your next automation is  
one sentence away.

[Install Plugin→](https://downloads.wordpress.org/plugin/flowsystems-webhook-actions.zip) [Try the Live Preview](https://playground.wordpress.net/?blueprint-url=https://wpwebhooks.org/blueprint.json) [See the Plugin →](https://wpwebhooks.org/wordpress-webhook-plugin/)

$ wp plugin install flowsystems-webhook-actions --activate

## Structured data

```json
{"@context":"https://schema.org","@type":"TechArticle","name":"Notifications — Feature — Webhook Actions Docs","description":"Get told when a delivery fails, retries, gives up, is skipped, succeeds or recovers — by email, Slack, Discord, Telegram, Teams, SMS, PagerDuty and more.","url":"https://wpwebhooks.org/docs/notifications/","isPartOf":{"@type":"WebSite","name":"WP Webhooks","url":"https://wpwebhooks.org"},"about":{"@type":"SoftwareApplication","name":"Webhook Actions","applicationCategory":"WordPress Plugin"}}
```
