Skip to content

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.

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.com per 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.

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.

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:

Terminal window
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.