Notifications from email and webhooks
In the dashboard open your project → Inbound. You create two kinds of addresses here. Both are queued like any notification, count toward your quota and follow device rules.
Email address
Section titled “Email address”New address gives you an address like in+…@pmail.pushbell.app. An email to it becomes a notification:
- The subject becomes the title and the text the message. Without a plain-text part, the HTML is turned into readable text.
- The first image attachment becomes the picture.
- The Date header becomes the notification’s time.
- The same email (same
Message-ID) arriving twice becomes one notification.
Forward invoices, system alerts or form emails to this address.
- Allowed senders: one address or
@domain.comper line. Empty means anyone. Emails from others don’t become notifications. - Type, priority, sound: the address’s defaults.
- Rules: tried in order, the first matching rule applies.
- Condition: the subject, text or sender contains some text or matches a regex.
- Action: pick a type, priority and sound, or Don’t notify.
- Named regex groups become variables for the type’s templates. For example, if the subject matches
Order #(?P<no>\d+): (?P<amount>[\d.,]+), the type’s title can use{{no}}and{{amount}}.
- Try a sample: paste a sender, subject and text. It shows which notification would be sent (or why not) without sending anything.
- Change address: gives a new address if it leaked; the old one stops working right away.
An email can be at most 10 MB. The text is cut to your plan’s character limit. Mail to an unknown address bounces back to the sender.
Webhook
Section titled “Webhook”New webhook gives you a URL. Paste it into the other service’s webhook settings and every event becomes a notification. The URL is secret: it needs no API key, so anyone who knows it can send a notification. If the sending service signs requests, enter the Signing secret; a request whose signature doesn’t match never becomes a notification. The secret isn’t shown again.
| Template | Where to paste it | Notification |
|---|---|---|
| Stripe | Workbench → Webhooks → Add endpoint; signing secret whsec_… |
Payment received (amount, email, cash sound), invoice paid, refund, dispute and failed payment (high priority), subscription |
| GitHub | Repo → Settings → Webhooks; content type application/json, Secret |
Push (commit count, branch, first line), pull request, issue, release, failed workflow (high priority), star |
| Shopify | Settings → Notifications → Webhooks (JSON); the signing key is on the same page | New order, order paid / cancelled, refund, new customer |
| WooCommerce | Settings → Advanced → Webhooks; Secret (use letters and digits) | New order, order status, new customer |
| Grafana | Alerting → Contact points → Webhook; HMAC header X-Grafana-Alerting-Signature, timestamp header X-Grafana-Alerting-Timestamp |
Alert (high priority), resolved |
| Uptime Kuma | Setup notification → Webhook, body application/json (no signature) |
Down (high priority), up, test |
| Generic | Your own system | With a field mapping, or the title, message, url, priority fields of the body |
The same event (Stripe event id, GitHub / Shopify / WooCommerce delivery id, an Idempotency-Key header for generic) arriving again within 24 hours doesn’t create a second notification.
Generic template
Section titled “Generic template”In the field mapping, {{ $.path }} placeholders are filled from the JSON body: $.order.id, $.items[0].name, $['custom field'].
Title: New application: {{ $.form.name }}Message: {{ $.fields[0].value }} ({{ $.email }})Without a mapping, the body’s title, message (or text), url and priority fields are used. A body that isn’t JSON becomes the message as is. The body can be at most 100 KB.
To sign, send the body’s HMAC-SHA256 as hex in the X-PushBell-Signature: sha256=<signature> header:
body='{"title":"Backup done","message":"34 GB"}'sig=$(printf '%s' "$body" | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/.* //')curl -X POST "https://api.pushbell.app/v1/hooks/…" -H "Content-Type: application/json" \ -H "X-PushBell-Signature: sha256=$sig" -d "$body"Try a sample shows the result for pasted headers and a body. If a signing secret is set, the sample is checked too.