Messaging
SynapseOrch can connect to messaging platforms so agents can receive messages and send responses directly in your team's chat tools. Set up a channel once and users can chat with your agents without opening the SynapseOrch UI.
The screens, step by step: Schedules and channels, in the Guides. For phone calls, see Phone.
Supported platforms
| Platform | Receive modes | Auth |
|---|---|---|
| Telegram | Polling (default) or webhook | Bot token |
| Discord | Polling (default) or webhook | Bot token + App ID |
| Slack | Polling (default) or webhook | Bot token + app token, or signing secret |
| Microsoft Teams | Webhook only | Azure app credentials |
| Webhook only | Access token + app secret + verify token (Meta's Cloud API) |
Receive modes
Three platforms can deliver messages two ways, and the choice matters more than it looks.
Polling is the default and needs no public URL — the right mode for a laptop, a LAN install, or anything behind NAT. The adapter holds a connection out to the platform: Telegram long-polls, Discord holds the gateway websocket, Slack holds a Socket Mode websocket.
Webhook holds nothing open. The platform posts to your install, so it needs a publicly reachable HTTPS URL: the Webhook address on the Channels screen (messaging_webhook_base_url) — the public address of the Synapse app, not its backend port; a tunnel URL works for local testing. A Telegram, Discord or Slack channel then shows its Delivery URL, <address>/api/messaging/<platform>/webhook/<channel id>, to paste into the platform. Every delivery is verified before it is trusted — a secret-token header for Telegram, an Ed25519 signature for Discord (its Public Key), the signing secret for Slack.
Discord webhook mode gives up ambient messages
Discord only pushes interactions over HTTP, so a webhook-mode bot answers its slash command and nothing else — no DMs, no @-mentions. If you want the bot to respond to ordinary conversation, use polling.
A Telegram bot can only be in one mode at a time
Telegram refuses getUpdates while a webhook is set. A bot token shared
between two installs will fight over this, and the symptom is messages
arriving in the wrong place or not at all. One token, one install.
Sending is identical in both modes — plain REST either way.
Enabling messaging
Set messaging_enabled: true in settings (this is the default). Without it, the messaging adapters won't start.
Configuring a channel
Self-hosted, open Channels and press New channel. On Cloud, Connect a channel offers Slack, Telegram and Discord: Slack and Discord go straight to the platform's own authorize page, and Telegram asks for its bot token.
Fields
| Field | Description |
|---|---|
| Platform | telegram, discord, slack, teams, whatsapp |
| Channel name | A name for the channel |
| Credentials | Platform-specific tokens and secrets (see below) |
Start and Stop, on the channel's row in the list, start and stop its adapter.
A saved secret is never shown again: its field reads Saved — leave blank to keep. A channel that cannot start — a bad token, say — is saved anyway and says so (⚠️ Saved, but it did not start: …); its status reads Error and the reason stays under Last error.
You can also ask Synapse AI to connect a channel. It answers with a card, and pressing it does what the Channels screen does; the model never sees a token. Self-hosted, the card asks for the platform's fields, and for Teams and WhatsApp it then shows the address to paste into the platform. On Cloud, as with Connect a channel, it connects Telegram by its bot token and Slack and Discord through their own sign-in.
A channel is standalone — it is a connection, not an agent's property. You then assign one or more agents to it, and mark one as the default: the agent that answers a plain message.
The same agent can serve several channels, and a channel can front several agents.
Telegram
- Create a bot via @BotFather →
/newbot - Copy the bot token
- In SynapseOrch, add a Telegram channel with the bot token
- Enable the channel → the bot comes online
- Send a message to your bot — the assigned agent responds
Credentials:
| Field | Description |
|---|---|
bot_token | Token from BotFather (format: 123456789:ABCdef...) |
Discord
- Go to discord.com/developers → New Application
- Create a bot, enable Message Content Intent
- Invite the bot to your server with
bot+applications.commandsscopes - Copy the bot token and Application ID
Credentials:
| Field | Description |
|---|---|
bot_token | Bot token from Discord Developer Portal |
channel_id | Optional — restrict to a specific channel |
application_id | Webhook mode — Developer Portal → General Information. Registers the /ask command |
public_key | Webhook mode — Developer Portal → General Information. Verifies each interaction Discord sends |
Slack
- Create a Slack App at api.slack.com/apps
- Enable Event Subscriptions and subscribe to
message.channels,app_mention - Add OAuth scopes:
channels:read,chat:write,app_mentions:read - Install the app to your workspace
Credentials:
| Field | Description |
|---|---|
bot_token | OAuth Bot Token (starts with xoxb-) |
app_token | Polling mode — an App-Level Token (xapp-) with connections:write, from Enable Socket Mode |
signing_secret | Webhook mode — the Signing Secret (Basic Information → App Credentials); verifies each delivery |
Microsoft Teams
Teams uses the Bot Framework webhook model. You need an Azure Bot registration.
- Create an Azure Bot in the Azure Portal
- Set the messaging endpoint to
https://<your Synapse address>/api/messaging/teams/webhook/<channel id>— the public address of the Synapse app, not the backend port - Enable the Microsoft Teams channel
- Copy the App ID and client secret
Credentials:
| Field | Description |
|---|---|
app_id | Azure App ID — Azure Bot resource → Configuration → Microsoft App ID |
app_password | App Password / Client Secret — Azure Bot → Certificates & Secrets |
Teams requires SynapseOrch to be publicly accessible via HTTPS for the webhook to work.
WhatsApp connects through Meta's WhatsApp Cloud API only: a Meta Business account and a verified number.
- Create a Meta Developer App at developers.facebook.com, of type Business
- Add the WhatsApp product, and pick a test or production number under Phone Numbers
- Under WhatsApp → Configuration, set the webhook URL to
https://<your Synapse address>/api/messaging/whatsapp/webhook/<channel id>— the public address of the Synapse app, not the backend port - Type a verify token of your choice there and in Synapse, and subscribe to the
messageswebhook field - Copy the phone number ID, an access token, and the App Secret (App settings → Basic) into the channel
Credentials:
| Field | Description |
|---|---|
phone_number_id | WhatsApp phone number ID |
access_token | Meta access token |
app_secret | App settings → Basic. Meta signs every delivery with it, and a delivery without a matching signature is refused — as is every delivery while no App Secret is saved |
verify_token | Your chosen webhook verify token — set the same value in your Meta app |
WhatsApp Web was removed in 2.0
1.x could also sign in to WhatsApp Web by scanning a QR code. Synapse 2.0 removed it. A 1.x channel that used it is kept, switched off, and says WhatsApp Web sign-in was removed in Synapse 2.0; reconnect this channel through the WhatsApp Cloud API. Enter the Cloud API fields above on that channel to bring it back.
How agents respond
When someone messages a connected channel, SynapseOrch identifies the message as addressed to the bot, routes it to the active agent for that conversation, runs the ReAct loop, and replies in the same place.
Session continuity is per user — each person gets their own session id, so an agent remembers the conversation across messages.
Who the senders are
Everyone who messages this bot is a workspace user is on by default: the channel's agents run for a sender as they would for you. With it on, the screen warns who can do what — Anyone who can message this bot can use …, naming the tools and any agent's memory.
Turned off, senders are visitors, as on a chat widget: the agents use only the tools ticked under What senders can use, never their memory, and a sender's reply does not answer a workflow waiting on the channel. Visitors reach an agent's knowledge bases only where the base allows visitors and search_knowledge is ticked. A reply never carries [K#] labels, whoever the sender is.
Nobody on a channel can answer an approval card, so a call that would ask a person does not wait for one. A remember that would ask is refused with its reason, and the agent is told to report the point in its answer instead. A Team member's call that needs approval is not run, and the lead is told and carries on.
If the agent's turn fails — its model refuses or cannot be reached, or an Orchestrator agent's run fails — the reply is "⚠️ Something went wrong answering that. Please try again." The error itself is in the server log and, for someone in the app, on the conversation, which keeps the question answered (The workflow failed before answering.) for a failed run.
Switching agent mid-conversation
Where a channel has more than one agent assigned, two commands work in any chat:
| Command | Does |
|---|---|
/agents | List the agents this channel offers, default first |
/agent <name> | Switch this conversation to that agent |
The switch is per conversation, not per channel, so one person changing agent does not change what anyone else is talking to. It resets to the channel default.
/agent is scoped to the channel's own agents
It can only switch to an agent actually assigned to that channel, so the agents listed on the channel's settings are the only ones its users can reach.
Orchestrator agents
An Orchestrator agent on a channel runs its workflow with the message as the input, and the reply is the workflow's output. If the run fails, the reply is the fixed line above. If it pauses for a person, the reply is the question followed by "Answer it in SynapseOrch (run <id>)" — or nothing more, when that Human step already asked its question in this same channel, where a reply answers it.
Human steps
A human gate with Notify messaging channel set posts its question to that channel when the run pauses, and a reply in the channel answers it and resumes the run. While a run waits on a channel, the next message sent to the bot there is taken as the answer, not passed to an agent. Teams replies do not answer a waiting run, and Teams and WhatsApp questions are posted only when the API server is running the channel's adapter. See Human Gates → Messaging notification.
Testing a channel
After starting a channel, click Test on the channel, under Channels (on Cloud, Send test, once the bot has been messaged). For Telegram and Discord, this verifies the bot token is valid. For Teams and WhatsApp, this validates the webhook credential fields.
The Model Gateway
Point SynapseOrch at one OpenAI-compatible endpoint you control, and every model behind it becomes available as synapse.*
Phone
Let callers talk to one of your agents on a Twilio number: what callers hear, what the agent may do for them, transfers and voicemail, and every call kept with its transcript.