Telegram, Discord, Slack, Teams, webhook and email
Notifications go to channels as well as devices. There are two kinds of channels:
- Project channel: In the dashboard open your project → Channels. Every notification of the project also goes here; with All projects, every project of the workspace. Use it for your team’s Slack channel, a Discord server, a Telegram group or your own system. Each project channel counts as one recipient toward your quota.
- Personal channel: In the dashboard Account → Personal channels, or in the app Settings → Channels. Every notification you receive (your projects, projects you subscribed to, groups) also arrives here. It can be your Telegram chat or your email. It doesn’t use extra quota.
Every channel has a filter: Types (only the selected notification types) and Lowest priority (e.g. only high and emergency). Send test sends a sample notification and doesn’t count toward your quota.
A channel that gets a permanent error is turned off and the reason shows in the dashboard: the Discord webhook was deleted, the bot was removed from the group, the Slack app was uninstalled or the email address bounced. Fix it and turn the channel back on. Temporary errors (slow service, rate limits) are retried. End-to-end encrypted notifications don’t go to channels; only devices can decrypt them.
Telegram
Section titled “Telegram”Add channel → Telegram and choose where:
| Choice | What you do |
|---|---|
| My chat | Open the link or scan the QR code with your phone, then tap Start. |
| Group | Open the link, choose the group and add the bot. |
| Channel | Open the link and add the bot to the channel as an admin, then post the /start … message shown in the dashboard in the channel. The bot deletes it once connected. |
The link is valid for an hour. Once connected, the channel is On. Sending /stop in the chat stops notifications.
Notifications arrive with their title, message, picture and link button. Low priority ones arrive silently. Emergency notifications have an ✅ Acknowledge button: tapping it acknowledges the notification and stops the alarm on devices.
Your own bot: To get notifications with your bot’s name and picture, create a bot with /newbot in @BotFather and paste its token into Use my own bot. PushBell points the bot’s webhook to itself; if the bot is used elsewhere with a webhook or getUpdates, that stops working. The webhook is removed when the channel is deleted.
Discord
Section titled “Discord”- In Discord: channel settings → Integrations → Webhooks → New Webhook.
- Copy Webhook URL and paste it into Add channel → Discord in PushBell.
Each message arrives as a colored card with the project’s name and logo. @everyone or @here in the text doesn’t ping anyone. For emergencies, the Acknowledge link on the card opens the acknowledgement page.
- Add to Slack: You pick the channel in Slack. Notifications arrive with the project’s name and logo. Emergencies can be acknowledged in Slack with the Acknowledge button on the message.
- Webhook URL: Paste an incoming webhook URL of your own Slack app (
https://hooks.slack.com/services/…). Messages come with that app’s name; emergencies are acknowledged with a link.
Microsoft Teams
Section titled “Microsoft Teams”- In Teams: the channel’s ⋯ menu → Workflows.
- Choose Send webhook alerts to a channel, save it and copy the URL.
- Paste it into Add channel → Microsoft Teams.
Messages arrive as Adaptive Cards. Teams Workflows can’t send button presses back, so emergencies are acknowledged on the page the card’s Acknowledge button opens. Messages are posted by the Workflows bot. The flow belongs to the person who created it; add a co-owner in case they leave.
Outgoing webhook
Section titled “Outgoing webhook”Every notification is sent to your URL as JSON with POST:
{ "event": "notification", "target": { "id": "…", "name": "ERP" }, "notification": { "id": "0199f…", "project_id": "…", "project": "Store", "type": "order", "type_name": "Order", "title": "New order #1042", "message": "$125.00", "html": false, "monospace": false, "url": "https://example.com/orders/1042", "url_title": "Open order", "priority": 0, "timestamp": 1793000000 }}Emergency notifications also have receipt and ack_url (the acknowledgement page). Send test in the dashboard sends "event": "test".
Headers:
PushBell-Signature: t=<unix>,v1=<signature>: HMAC-SHA256 (hex) of<t>.<body>with the secret shown once when the channel is created. Reject timestamps older than five minutes.PushBell-Delivery: stays the same across retries; use it to skip duplicates.
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(header, body, secret) { const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("="))); if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const expected = createHmac("sha256", secret).update(`${t}.${body}`).digest("hex"); return timingSafeEqual(Buffer.from(v1), Buffer.from(expected));}Any 2xx response counts as delivered. 410 turns the channel off; other errors are retried at growing intervals.
When you add an address, a confirmation email is sent to it; notifications start once the link is clicked. Emails carry the project’s name as the sender name. Every email has a one-click unsubscribe link (the Unsubscribe button of mail apps uses the same link). An address that unsubscribed can’t be turned on from the dashboard; it has to confirm again. Sending stops for addresses that bounce or report spam.
The number of outgoing emails per month depends on your plan (see the Plan page). When it’s used up, emails are skipped and other channels keep working.
Outgoing webhooks are in every plan. Telegram, Discord and Slack are included from Starter; Teams and email from Pro. The number of channels also depends on the plan.