Delivering notifications to a channel
A notification lands in the workspace inbox on its own. Getting it to Slack, to a mailbox, to a chat app on somebody’s phone — that is a route, and this page is the recipe for each destination.
The one thing to understand first
Section titled “The one thing to understand first”There is no list of supported notification channels, and no channel plugin. A route delivers by calling a tool on a connector the workspace already has.
That means the answer to “can it send to X?” is always the same question: is there a connector with a tool that sends to X? If yes, a route can use it today, and nothing in the platform needed to know about X in advance. If no, the answer is to add one — see when your channel is not here.
It also means the destination is only ever as good as the tool. The platform renders your template and makes the call; what happens after that belongs to the connector.
The shape of every route
Section titled “The shape of every route”Whatever the destination, you write the same three things under Settings → Notifications:
- Match — which notifications this route is for.
- Deliver to — a tool, picked from the ones this workspace has. Tool names
are
<connector>__<tool>, and the picker shows them that way. - Arguments — a JSON object matching that tool’s own input schema, with placeholders for the notification’s fields.
{ "channel": "alerts", "markdown_text": "*{{title}}*\n{{body}}\n{{inbox.url}}"}Install the Slack connector under Settings → Connectors, then connect the Slack account it asks for. Confirm it works — a connector can be installed and list its tools while the account behind it was never connected.
| Deliver to | the Slack connector’s SLACK_SEND_MESSAGE |
| Arguments | channel, and one of markdown_text or blocks |
{ "channel": "alerts", "markdown_text": "*{{title}}*\n{{body}}\n{{inbox.url}}"}Notes worth having before you write it:
- The channel takes a name or an id, without the
#. Use the id (C0ABC12345) for a private channel, or if your Slack is on Enterprise Grid, where name lookup fails.SLACK_LIST_ALL_CHANNELSfinds ids. - Invite the app to the channel. Slack refuses to post to a channel the app is not in, and the error says so.
- The message body field is
markdown_text, nottext. This is exactly the class of mistake the paragraph above warns about. - Slack auto-links what looks like a URL or an address, so a title containing an email arrives with it linked. That is Slack, not the platform.
Microsoft Teams
Section titled “Microsoft Teams”Install the Teams connector and connect the account.
| Deliver to | the connector’s send-message tool |
| Arguments | the target conversation or channel, and the message body |
The shape is the same as Slack’s; only the field names differ. Read them off the tool in the Deliver to picker rather than assuming, then confirm with Send test.
Two connectors send mail — Gmail and Outlook — and either works as a route target. Email suits notifications that need to reach somebody who is not in your chat tool, and it carries more text comfortably than a chat message.
| Deliver to | the connector’s send-email tool |
| Arguments | recipient, subject, body |
{ "recipient": "ops@example.com", "subject": "{{title}}", "body": "{{body}}\n\nOpen it: {{inbox.url}}"}Install the WhatsApp connector and connect the account.
WhatsApp has rules the other channels do not, and they are the vendor’s, not the platform’s: recipients must have opted in, business-initiated messages outside a 24-hour window have to use a pre-approved template, and each message is priced. A notification route is business-initiated by definition, so plan on templates. Check the connector’s own tool descriptions for how it takes them.
Somewhere that is not a chat app
Section titled “Somewhere that is not a chat app”The destination does not have to be a message at all. A route delivers through any tool, so any of these is a legitimate target:
| Destination | Tool | Why |
|---|---|---|
| A tracker | create-issue on a Jira, Asana or GitHub connector | The notification becomes work somebody is assigned |
| A spreadsheet | append-row on a Sheets connector | A running log you can pivot |
| A CRM | log-activity on a CRM connector | The event lands on the customer record |
The arguments are that tool’s, and {{title}} / {{body}} / {{subject}} /
{{inbox.url}} are available in all of them.
When your channel is not here
Section titled “When your channel is not here”If nothing installed can reach your destination, the answer is a connector that can — an MCP server exposing a send tool. That is the same door every channel above came through; none of them is special-cased in the platform.
This is deliberate. A platform with a fixed list of channels owes you a new release for every destination; one that delivers through tools grows a channel the day somebody writes a server for it. The cost is that the quality of a channel is the quality of its connector.
See Building apps for writing one.
Related
Section titled “Related”- Notifications — what notifications are, and the ceiling that governs them
- When a notification doesn’t arrive — Send test, and reading the delivery ledger
- Route reference — every field, match rule and placeholder
- Connectors — installing the connector a route delivers through
- Personal connectors — what a
my_tool in a route needs