Channels & providers
Dieser Inhalt ist noch nicht in deiner Sprache verfügbar.
HyperLevel’s inbox already handles email, SMS, website chat, calls, WhatsApp, Messenger and Instagram (setup). This page covers the additional native channels and providers, so a sub-account can use whatever works in its country:
| What | Use it for | Set up under |
|---|---|---|
| Telegram | Customer chats with your bot, lead capture via t.me/<bot>?start=<campaign> |
Settings → Weitere Kanäle |
| Discord | A community server: DMs, chosen channels and /support → inbox |
Settings → Weitere Kanäle |
| Slack | Team notifications; reply to customers from a Slack thread | Settings → Weitere Kanäle |
| Email providers | Resend, Postmark, Amazon SES, Brevo, Mailgun as senders with bounce/complaint webhooks and inbound mail | Settings → E-Mail & SMS |
| SMS providers | seven.io, Bird (MessageBird), Vonage, Plivo with delivery reports and inbound SMS | Settings → E-Mail & SMS |
| Web push to contacts | Browser notifications to funnel visitors who opted in | Settings → Weitere Kanäle |
Everything is per sub-account. Tokens, API keys and signing secrets are stored encrypted (AES-256-GCM with the server secret) and are never sent back to the browser. Webhooks from providers are checked by signature where the provider signs; every webhook address additionally contains a random key, so it cannot be guessed. HyperLevel must be reachable on a public https address (PGHL_BASE_URL) for any webhook to arrive.
All channels work like the existing ones: messages land in Konversationen (with a channel filter and icon), contacts are created or matched, STOP switches on „Nicht stören“, workflows start on Nachricht empfangen, and POST /api/messages / the MCP tool ghl_send_message send on the new channels.
Telegram
Section titled “Telegram”- In Telegram, talk to @BotFather →
/newbot→ pick a name and a username ending inbot. Copy the token (123456789:AA…). - HyperLevel → Settings → Weitere Kanäle → Telegram: paste the token → Speichern (HyperLevel checks it with
getMeand shows@your_bot). - Click Webhook setzen. HyperLevel calls
setWebhookwithhttps://<domain>/hooks/telegram/<locationId>and a random secret token; Telegram sends that token in theX-Telegram-Bot-Api-Secret-Tokenheader with every update and HyperLevel refuses updates without it. - Verbindung testen shows the bot, whether the webhook points at HyperLevel and how many updates are pending.
What arrives: private chats only (groups and channels are ignored). Text, photos, voice messages, audio, video, documents, stickers and locations; files are loaded from Telegram when someone opens them (Telegram keeps files up to 20 MB available to bots). A contact who shares their own phone number gets it on the contact.
Lead capture with deep links: https://t.me/<bot>?start=<campaign> (campaign: 1–64 characters A–Z a–z 0–9 _ -). Whoever opens the link and taps Start becomes a contact (source Telegram, tags from the settings) with an attribution touch telegram / bot / <campaign>, fires the workflow trigger „Telegram-Bot gestartet“ (filter by campaign) and optionally receives the welcome text (merge fields allowed). The settings card builds these links; the MCP tool ghl_telegram_link too.
Replying: the composer shows a Telegram tab for contacts who started the bot (text up to 4096 characters, optional https file link: image, PDF, audio, video – then the text becomes the caption, max. 1024). Workflow action „Telegram senden“. A blocked bot shows Kontakt hat den Bot blockiert on the message.
Cost: free.
Discord
Section titled “Discord”- Discord Developer Portal → New Application → Bot → Reset Token, copy it. On the same page switch on the privileged Message Content Intent.
- HyperLevel → Settings → Weitere Kanäle → Discord: paste the token, optionally the IDs of channels to read (enable Developer Mode in Discord, right-click a channel → Copy Channel ID) → Speichern. HyperLevel reads the application id and public key itself.
- Bot auf deinen Server einladen opens the invite link (permissions: view channels, send messages, read message history).
- Optional slash command: paste the Interactions Endpoint URL (
https://<domain>/hooks/discord/<locationId>) into General Information (Discord sends a signed PING; HyperLevel checks the Ed25519 signature) and click /support registrieren. Members can then type/support nachricht:…anywhere the bot is; they get a private confirmation and the message lands in the inbox.
How messages arrive: HyperLevel keeps one Gateway connection (WebSocket) per sub-account with a bot – direct messages to the bot and messages in the chosen channels become conversations; other channels and bots are ignored. The connection resumes after drops; a bad token or a missing intent is shown on the card.
Replying: by direct message (default) or, when Auf Kanal-Nachrichten im Kanal antworten is on, as a reply in the channel the person wrote in. Up to 2000 characters. Workflow action „Discord senden“. Members who block DMs from server members get an error on the message.
Cost: free.
Slack is for your team: every new customer message (any channel) appears in a Slack channel, one thread per conversation. A reply in the thread is sent to the customer through the channel they last wrote on (email, SMS, WhatsApp, Telegram, Discord …). HyperLevel reacts with ✅ when it went out, or posts a ⚠️ note with the reason. Messages starting with // stay internal.
With a Slack app (replies work):
- api.slack.com/apps → Create New App → From scratch.
- OAuth & Permissions → Bot Token Scopes:
chat:write,reactions:write,channels:history(andgroups:historyfor private channels) → Install to Workspace → copy the Bot User OAuth Token (xoxb-…). - Basic Information → copy the Signing Secret.
- HyperLevel → Settings → Weitere Kanäle → Slack: token, signing secret and the channel ID (channel → details → bottom). Invite the bot into the channel (
/invite @your-app). - Slack app → Event Subscriptions → on → Request URL
https://<domain>/hooks/slack/<locationId>(verified automatically) → Subscribe to bot events:message.channels(andmessage.groups). Save. - Testnachricht in HyperLevel posts a test.
HyperLevel checks X-Slack-Signature (HMAC-SHA256 with the signing secret, max. 5 minutes old) and ignores Slack’s retries of the same event.
Only notifications: choose Nur Incoming Webhook and paste an incoming-webhook URL (https://hooks.slack.com/services/…). You can limit which inbox channels are forwarded.
Cost: free (the free Slack plan is enough).
Email providers
Section titled “Email providers”Choose the provider under Settings → E-Mail & SMS → E-Mail-Versand → Anbieter. The panel asks for the credentials, the sender (must be verified at the provider) and shows the webhook address of this sub-account (https://<domain>/hooks/mail/<provider>/<locationId>/<key>). Speichern & aktivieren makes it the sender for everything (inbox, campaigns, workflows, notifications); Verbindung testen makes a harmless read call.
Delivery reports update the message status: zugestellt, unzustellbar (hard bounce), als Spam gemeldet; soft bounces only add a note. A hard bounce or a complaint switches the contact to „Nicht stören“ and fires the workflow triggers „E-Mail unzustellbar (Bounce)“ / „E-Mail als Spam gemeldet“. Unsubscribes recorded by the provider also set „Nicht stören“.
| Provider | Credentials | Webhook check | Inbound mail | Cost (approx., check current pricing) |
|---|---|---|---|---|
| Resend | API key re_…; webhook signing secret whsec_… |
Svix signature (svix-id/-timestamp/-signature) |
– | free 3,000/month (100/day), paid from ~$20/month |
| Postmark | Server API token, optional message stream | key in the URL (Postmark does not sign) | yes – inbound webhook | free 100/month, from ~$15/month for 10k |
| Amazon SES | Access key id + secret (IAM user with ses:SendEmail, ses:GetAccount), region, configuration set, optional SNS topic ARN |
Amazon SNS signature (certificate from sns.<region>.amazonaws.com) + optional topic check |
yes – receipt rule with SNS action | ~$0.10 per 1,000 emails |
| Brevo | API key xkeysib-… |
key in the URL | yes – inbound parsing | free 300/day, paid from ~€9/month |
| Mailgun | API key, sending domain, region EU/US, webhook signing key | HMAC signature (timestamp + token), tokens used once |
yes – route with forward() |
from ~$15/month |
Where to enter the webhook:
- Resend: Webhooks → Add Endpoint → events
email.sent,email.delivered,email.bounced,email.complained,email.delivery_delayed,email.failed; copy the signing secret into HyperLevel. - Postmark: Server → Webhooks → Delivery, Bounce, Spam Complaint (+ Subscription Change). Inbound: Server → Inbound stream → webhook = the same address.
- Amazon SES: configuration set → event destination Amazon SNS (Send, Delivery, Bounce, Complaint, Reject, Delivery delay). In SNS create an HTTPS subscription with the address – HyperLevel confirms it automatically after checking the signature. Inbound: SES receipt rule → action SNS (encoding Base64) → a topic with the same subscription (SNS messages are limited to 150 KB).
- Brevo: Transactional → Settings → Webhooks (delivered, soft/hard bounce, spam, blocked, invalid, unsubscribed); inbound parsing on the same address.
- Mailgun: Sending → Webhooks (delivered, permanent fail, temporary fail, complained, unsubscribed); receiving → route
forward("<address>").
Inbound mails go through the same path as the IMAP sync and the generic inbound webhook (contact by email, conversation, helpdesk rules by recipient address).
Providers send a report again when they get no 2xx (SNS, Mailgun, Resend retry for hours). A report that was handled once is answered duplicate (SNS message id, Mailgun token, Resend’s svix-id, the inbound message id); a report whose processing failed (database busy, a parse error) is not marked as handled – the mark is taken back together with what it changed – so the provider’s retry is processed, as with the Stripe webhook.
SMS providers
Section titled “SMS providers”Choose under Settings → E-Mail & SMS → SMS-Versand → Anbieter. Numbers are sent in E.164 form (contacts store +49…). Delivery reports set zugestellt / fehlgeschlagen (with the provider’s reason); inbound SMS create or match the contact by phone number, STOP sets „Nicht stören“.
| Provider | Credentials | Webhook check | Cost (approx., check current pricing) |
|---|---|---|---|
| seven.io (Germany) | API key, optional sender, optional signing secret | HMAC (X-Signature, X-Timestamp, X-Nonce) when a signing secret is set |
~€0.075 per SMS to Germany, no monthly fee |
| Bird (formerly MessageBird) | Access key, workspace id, SMS channel id, optional signing key | HMAC (messagebird-signature, messagebird-request-timestamp) when a signing key is set |
per message by country |
| Vonage | API key + secret, sender, optional signature secret | signed JWT (HS256, payload_hash) when a signature secret is set |
per message by country |
| Plivo | Auth ID + auth token, sender | X-Plivo-Signature-V2 with the auth token – always checked |
per message by country (US from ~$0.005) |
Where to enter the webhook (https://<domain>/hooks/sms/<provider>/<locationId>/<key>):
- seven.io: Developer → Webhooks → events SMS status (
dlr) and inbound SMS (sms_mo). - Bird: Developer → Webhooks → subscribe
sms.outbound(status) andsms.inbound. - Vonage: your Vonage application → Messages → Inbound URL and Status URL; enable signed webhooks with the signature secret.
- Plivo: Messaging → Applications → Message URL (POST). HyperLevel sends the status callback URL with every SMS.
Signatures over the URL (seven.io, Bird, Plivo) need PGHL_BASE_URL to be exactly the address the provider calls.
Web push to contacts
Section titled “Web push to contacts”- Settings → Weitere Kanäle → Push an Kontakte: switch on Glocke auf Funnels und Websites zeigen, adjust the texts.
- Funnel and website pages get a small bell (bottom left). It opens a short opt-in window on your HyperLevel domain (funnel pages are sandboxed, so the browser permission is asked there), which subscribes the browser with HyperLevel’s own VAPID keys.
- The subscription is linked to the contact through the attribution visitor id – right away if the visitor is already known, or as soon as they fill in a form or book an appointment. The opt-in link from the card also works in emails or on other websites.
- Send with the workflow action „Push an Kontakt“ (title, text, https link; merge fields allowed), from the inbox (Push tab for contacts with devices) or via
POST /api/messageswithchannel: "push"(subject= title,url= link). Each push is stored in the conversation.
Delivery goes through the browsers’ push services (Google, Mozilla, Apple, Microsoft) – free. Expired subscriptions are removed automatically. On iPhones, web push only works after the page was added to the home screen.
Webhook addresses at a glance
Section titled “Webhook addresses at a glance”| Channel | Address |
|---|---|
| Telegram | /hooks/telegram/<locationId> (set by „Webhook setzen“) |
| Discord interactions | /hooks/discord/<locationId> |
| Slack events | /hooks/slack/<locationId> |
| Email providers | /hooks/mail/<resend|postmark|ses|brevo|mailgun>/<locationId>/<key> |
| SMS providers | /hooks/sms/<seven|bird|vonage|plivo>/<locationId>/<key> |
| Push opt-in | /push/<locationId>/subscribe |
The exact addresses with key are shown in the settings. Saving a provider with regenerate_webhook: true (API) issues a new key.
API & MCP
Section titled “API & MCP”POST /api/messageswithchannel: telegram | discord | push(plusmedia_urlfor Telegram,subject/urlfor push); email/SMS providers are used automatically bychannel: email | sms.GET /api/messages/channels/status?contact_id=– which of the extra channels can reach a contact.- Settings:
GET/PUT/DELETE /api/settings/channels/telegram|discord|slack,GET/PUT /api/settings/channels/push{enabled, button, title, text}(switched off instead of deleted, no test),GET /api/settings/channels/mail|sms,PUT/DELETE /api/settings/channels/mail|sms/<provider>,POST …/test(Telegram, Discord, Slack and the mail/SMS providers). - MCP:
ghl_send_messagelists every available channel;ghl_telegram_linkbuilds campaign deep links.
For developers
Section titled “For developers”New channels plug in through registries instead of core edits (module channels.ts, helpers in services/channel-kit.ts):
app.services.messageChannels[channel] (send via POST /api/messages), channelStatus[channel] (composer), channelMedia[channel] (files of inbound messages), channelSend(locationId, {contactId, channel, body}) (send on any channel – Slack replies use it), emailTransports[provider] / smsTransports[provider] (senders behind deliverEmail/deliverSms), plus workflowActions, workflowTriggers, catalogExtra and mcpTools. Tests swap the network with app.services.channelFetch (and discordSocket for the Discord Gateway).