AlphornAlphorn Docs

Channels

Supported notification channels (Slack, Discord, Teams, Telegram, email, SMS, push, PagerDuty, Opsgenie, webhooks, SSE), their configuration, message length limits, and priority mapping.

Channels are the destinations where Alphorn delivers notifications. Each channel connects to an external service - a Slack workspace, an email address, a push notification service, etc.

Supported Channels

Chat & Messaging

ChannelConfiguration
SlackIncoming Webhook URL
DiscordWebhook URL
Microsoft TeamsIncoming Webhook URL
TelegramBot token + chat ID
Google ChatWebhook URL
MatrixHomeserver URL + access token + room ID
MattermostIncoming Webhook URL
Rocket.ChatIncoming Webhook URL
ZulipServer URL + bot email + API key + stream + topic

Email

ChannelConfiguration
Email (SMTP)SMTP host, port, encryption, username, password, from address, to address
SendGridAPI key + from email (+ optional from name) + to email
MailgunAPI key + domain + region (US/EU) + from address + to address

Push Notifications

ChannelConfiguration
NtfyServer URL + topic (+ optional access token)
PushoverAPI token + user key
GotifyServer URL + app token

SMS

ChannelConfiguration
Twilio SMSAccount SID + auth token + from number + to number
Vonage SMSAPI key + API secret + from + to number

Incident Management

ChannelConfiguration
PagerDutyRouting key (Events API v2 integration key) + default severity
OpsgenieAPI key + region (US/EU) + default priority

Custom Integrations

ChannelConfiguration
WebhookAny HTTP endpoint URL, method, custom headers
Live Stream (SSE)Output format (JSON/text) + which fields to include. See Streaming

Adding a Channel

  1. Navigate to Channels in the dashboard
  2. Click Add channel
  3. Select the channel type
  4. Enter the required configuration - each channel type shows a setup guide in the form
  5. Send a test notification to verify (admins and owners; not available for Live Stream)
  6. Link the channel to a webhook - on the webhook page, select it in the channel list

A channel only receives notifications from webhooks it is linked to. You can link one channel to many webhooks, each with its own filter.

Channel URLs (webhook URLs, server URLs, homeserver URLs) can't point at the Alphorn instance itself. This prevents notification loops. Discord channels only accept Discord webhook URLs (https://discord.com/api/webhooks/...).

Disabling and Deleting Channels

  • A disabled channel receives no new notifications, and pending retries for it are dropped. It still counts toward your plan's channel limit.
  • Deleting a channel removes it from all webhooks. Its delivery history stays visible under Messages, and it no longer counts toward your plan's channel limit.

Send Rate Limits

To stay within the services' own limits, Alphorn sends at most 60 messages per minute to a Slack channel, 50 to a Discord channel, and 20 to a Telegram channel. Extra deliveries wait for the next minute without using up a retry - see Retries → Per-Channel Throttling.

Message Length Limits

Incoming titles are cut to 200 characters and messages to 4,000 characters. Some services have lower limits, so Alphorn shortens the text to fit each one before sending (longer text ends with …):

ChannelLimit
SlackTitle 150, message 3,000
DiscordTitle 256, message 4,096
TelegramTitle 256, title + message 4,096
Google ChatMessage 4,096
PushoverTitle 250, message 1,024
PagerDutySummary 1,024
OpsgenieMessage (title) 130, description 15,000
Twilio SMS1,600

Email and Opsgenie need a subject or title line: they use the notification title, or the first line of the message (up to 100 characters) when there is no title. PagerDuty gets Title: message as its summary, cut to 1,024 characters.

Priority Mapping

Channels with their own priority or severity levels get the notification priority mapped onto their scale:

Alphorn priorityntfyGotifyPushoverPagerDutyOpsgenie
1 (Min)min1-1infoP5
2 (Low)low3-1infoP4
3 (Default)default50warningP3
4 (High)high81errorP2
5 (Urgent)urgent102criticalP1

Notifications without a priority use the channel's default: default for ntfy, 5 for Gotify, 0 for Pushover, and the Default Severity / Default Priority you configured for PagerDuty and Opsgenie.

Channel Limits

Channel availability depends on your plan:

PlanChannels
Free3 channels
ProUnlimited
BusinessUnlimited

Generic Webhook

The Webhook channel lets you send notifications to any HTTP endpoint. Use it to integrate with services that Alphorn doesn't have a dedicated channel for.

SettingDescription
Endpoint URLWhere to send the request
HTTP MethodPOST (default) or PUT
Custom HeadersExtra headers, e.g. Authorization for the receiving service. Invalid header names or values are rejected when you save

Alphorn sends a JSON body:

{
  "title": "Notification title",
  "message": "Notification body",
  "priority": 3,
  "tags": ["tag1", "tag2"],
  "payload": { "the": "original JSON request body" },
  "timestamp": "2025-01-15T10:30:00.000Z"
}
  • message and timestamp are always present
  • title, priority, and tags are left out when the notification doesn't have them
  • payload is the original JSON request body that came into the Alphorn webhook, nested under its own key. For plain-text notifications it is an empty object ({})
  • The test button sends a different body - {"title", "body", "timestamp", "_test": true} - so your receiver can tell test pings apart

The request also carries a signed X-Alphorn-Trace header (other URL-based channels like Slack, Teams, Matrix, or ntfy send it too). Alphorn uses it to detect loops when a channel points at another Alphorn webhook; after 3 hops (WEBHOOK_MAX_HOPS when self-hosting), or when the notification comes back to a webhook it already passed, the request is rejected with 508. The header is signed with BETTER_AUTH_SECRET, so loops across two self-hosted instances are only detected when both use the same secret.

A Webhook channel can't point at the same Alphorn instance it runs on. To forward notifications between your own webhooks, link the channels directly to the webhook instead.

On this page