Skip to main content
Integrate SuprSend sent one email from your backend. This guide adds every other channel to it.
You need what that guide left you with: the live order-shipped template, the live order-shipped-notification workflow, and the two calls in your backend that sync a user and trigger that workflow.

What each channel needs

Each section below is self-contained. Go to the one you need. Everything runs in Sandbox, where SuprSend’s vendors are already connected. Four channels still need a moment of setup first: in-app inbox, Slack and Teams have to be switched on, and mobile push needs a Firebase or APNS account of your own. Each section says so up front.

Email, SMS and WhatsApp

All three send to a value you already know. Email was set up in Integrate SuprSend, so this section adds SMS and WhatsApp.

Verify your number

Sandbox delivers only to numbers you’ve verified. Add yours at Developers → Verified Channels in international format — +15555555555. One number covers SMS and WhatsApp.
Verified Channels page in the SuprSend sandbox, showing an email address and a phone number marked applicable for WhatsApp and SMS
Your signup email was already on this list, which is why email needed no such step. The limit is 5 addresses and 5 numbers, and it applies to Sandbox only.

Add the channels in SuprSend

The template needs content for the new channel, and the workflow needs to deliver on it.
Open Agent with Cmd+/ and paste:
Agent asks which channels you want, then edits the template, then the workflow that uses it, and commits both.
Dashboard Agent confirming SMS and WhatsApp were added to the order-shipped template and the multi-channel delivery node, with both committed live
A multi-channel node sends on every active channel of its template, so this is the last time you edit the workflow. Adding a channel later is a template change and a profile change only.
These templates are approved by someone other than SuprSend. WhatsApp always: on commit the version goes to Approval Pending, SuprSend submits it to Meta, and most clear within minutes to hours. SMS only when you send to Indian numbers, where TRAI requires DLT registration — outside India, SMS goes live immediately on commit.A version awaiting approval cannot send and cannot be tested. The badge on the template shows its state, and everything under review is listed at Templates → Approvals. On rejection it returns to draft.

Sync the number and trigger

Your app probably already has the user’s phone number. SuprSend doesn’t — nothing has mapped it to their profile yet. That mapping is the only code change, and it goes in the sync call you already wrote.
One prompt adds the channels to the sync and re-runs both calls. Paste it into Claude Code, Cursor, Windsurf, or whichever editor you use.
The trigger names the user by distinct_id and nothing else. SuprSend reads which channels that profile has, matches them against the template, and sends. That’s why the call survives every channel you add — including inbox, push and Slack later.

Confirm delivery

Open Logs and find the workflow execution. There’s one message row per channel that sent.
The SMS and the WhatsApp message have both arrived at the number you synced, from the same trigger that sent the email.

Troubleshooting SMS and WhatsApp

Sandbox delivers only to verified numbers. Open Developers → Verified Channels and check that the exact number on the user profile is listed, country code included. An unverified number is dropped silently.
A delivery node skips a channel when the user profile has no identity for it. Open the user under Users and check the Channels panel. If the number isn’t there, your sync ran before you added the add_sms or add_whatsapp line. Run it again.
Meta is still reviewing. Most templates clear within minutes to hours, and the channel cannot send or be tested until the version reads Live. If it’s rejected, the usual cause is a category that doesn’t match the content — an order update belongs in Utility, not Marketing. Edit the draft and commit again; the new version is reviewed separately.
You’re sending to an Indian number. TRAI requires every SMS template to be registered on the DLT platform before it can send, so SuprSend submits it to your SMS vendor on commit. It can’t be tested in draft. Sending anywhere else, an SMS template goes live the moment you commit it.
Each channel renders its own content, so a variable can resolve in one and not another. Check that the SMS or WhatsApp body uses {{order_id}}, the same key your trigger sends in data. Open the message in Logs → Messages and use Message preview to see what rendered.
SuprSend marks a channel identity inactive after hard failures from the vendor — an unregistered WhatsApp number, a bounced address — to protect your sender reputation. It stays inactive for 15 days for WhatsApp and 90 days for email. The user profile shows the channel as inactive.

In-app inbox and web push

A browser only hands over a push token after the user allows notifications, and the inbox only shows notifications to a browser that can prove which user is looking. Both need code in your frontend, and one new endpoint in your backend that issues that proof. Do them together — same SDK, same provider, same token.

Turn the channels on

Both live under Vendors, and neither needs an account anywhere else.
  • In-App Inbox — enable the channel. There’s nothing to fill in.
  • Web Push — already set up in Sandbox. SuprSend generates the VAPID key pair for you.
SuprSend Vendor Integrations page in the sandbox, showing every channel down the left and the Web Push VAPID keys already filled in

Get your client credentials

These are separate from the workspace key and secret your backend already uses. Collect all three before you start — you’ll be asked for each one partway through.
.env
The signing key must never reach the browser. Anything holding it can mint a token for any user and read their inbox. Keep it wherever you keep your workspace secret.
Vendors → In-App Inbox also shows an Inbox secret. You don’t need it here. That’s for HMAC authentication, which the React Native and Flutter inbox SDKs still use. The web SDKs authenticate with a signed JWT instead, which is what the signing key above is for.
Sandbox doesn’t check your token yet. SuprSend only verifies user tokens when Enhanced Security Mode is on — the switch beside your Public Key on the API Keys page — and it’s off in Sandbox. A malformed or wrongly signed token still loads the inbox here, so a broken setup looks like a working one until you reach Production. Build the token properly now, then turn the switch on before you go live. See client authentication.

Add the channels in SuprSend

Open Agent with Cmd+/ and paste:

Add SuprSend to your frontend

Three things go in: a backend endpoint that mints a user token, the SuprSend provider around your app, and the component or the push registration.
Web push needs HTTPS. localhost is exempt in most browsers, so local development works, but a staging site served over plain HTTP will not.
This section covers the inbox on the web. React Native and Flutter have their own inbox SDKs, and they still authenticate with an HMAC inbox secret rather than a JWT — see HMAC authentication if that’s what you’re building.

Confirm delivery

The inbox updates without a refresh, because the feed holds an open socket connection. The push notification arrives through the operating system, so it shows up even with the tab closed.
The bell shows an unread count and the notification is in the popover. Open Logs and the execution has one message row per channel.

Troubleshooting inbox and web push

The token identifies a different user than the one the workflow sent to. Check that entity_id in the JWT is the exact distinct_id your backend used in recipients. A mismatch isn’t an error — it’s a valid token for a user with no notifications.
Three usual causes: the token was signed with the workspace secret instead of the signing key, the algorithm isn’t ES256, or a Base64 signing key was passed without converting it to PEM first. entity_type must be the literal string subscriber.You won’t see these errors in Sandbox — token verification only runs with Enhanced Security Mode on. Check the claims against the table above rather than trusting that the inbox loaded.
registerPush() was called on page load, or the site isn’t on HTTPS. Browsers ignore permission prompts that aren’t tied to a user action. If you already denied it once, the prompt won’t return — clear the site’s notification permission in browser settings and try again.
Check /serviceworker.js loads in the browser at that exact path. A bundler that emits it to a subdirectory breaks push silently — the scope of the service worker has to cover the pages you’re registering from.
The template has no Action URL. It’s a required field for web push, and without it the click has no destination.

Mobile push

Every other channel in this guide borrows a SuprSend sandbox vendor. This one can’t. A push notification is delivered by Google or Apple to one specific app, so it needs credentials tied to your app — a Firebase project for Android, an Apple developer account for iOS.

Connect Firebase or APNS

Add them at Vendors → Android Push or Vendors → iOS Push.
Mode/Environment decides whether SuprSend talks to Apple’s sandbox or production APNS. A token from a development build only works against the development setting, and the mismatch is the usual cause of a rejected send. For iOS, three of the remaining values are easy to mislabel: the Auth Key ID is the code in the .p8 filename — AuthKeyABCD1234.p8 means ABCD1234. The Team ID is on your Apple developer membership page. The Bundle ID is your app’s, and it has to match exactly or Apple rejects the send. Full setup: FCM · APNS.

Add the channels in SuprSend

Open Agent with Cmd+/ and paste:

Add the SDK to your app

Your app has two jobs: identify the user with the same distinct_id your backend already syncs, and hand SuprSend the device token that FCM or APNS issues. The calls differ per platform.

Confirm delivery

A device token only exists after your app has run on a real device or emulator and the person has accepted the notification permission prompt. Until then the profile has no push identity and the delivery node skips the channel.
Open Users, find your user, and check the Channels panel for androidpush or iospush. Once it’s there, trigger the workflow and the notification arrives on the device.

Troubleshooting mobile push

Three things have to happen in order: the app initialises the SDK, the person accepts the permission prompt, and the app identifies the user. If any is missing, no token reaches SuprSend. Identifying before the permission prompt is accepted is the most common ordering mistake.
Either the profile has no token, or the vendor isn’t configured. Unlike email or SMS, Sandbox has no fallback push vendor — if Vendors → Android Push or iOS Push is empty, nothing sends.
Usually the Bundle ID on the vendor page doesn’t match the app that generated the token. It’s also what happens when a token from a development build is used against a production APNS setting, or the reverse.
Android and iOS truncate at different lengths — 40 and 30 characters for the title. Rich images need a public HTTPS URL, and on iOS they need a notification service extension in the app. Image URLs aren’t supported at all on the Expo SDK.

Slack and Microsoft Teams

These two are the only channels where the address belongs to someone else. It lives in a Slack or Teams workspace that an administrator controls, so it has to be issued to you before you can send anything. There are three ways to get one, and the honest split is between what you can paste and what you have to build. Whose workspace it is doesn’t change the method. Posting into a community or a customer’s workspace still uses one of these three — someone with rights there either hands you a webhook URL or installs your app. Joining a workspace yourself, through an invite link, authorises nothing. This guide covers the first two. Connecting a customer’s workspace needs an OAuth flow built into your product — see the full Slack and Microsoft Teams guides.
Start with the incoming webhook. It’s the fastest thing in this guide that proves the channel works, and you can move to a bot token later without changing anything in SuprSend.

Turn the channel on

Slack: enable the channel at Vendors → Slack. There are no credentials to enter — the connection lives on the recipient, not on the vendor. Microsoft Teams: save the channel at Vendors → MS Teams.
A webhook doesn’t use these credentials, but the vendor still has to be saved. Enter placeholder values:Saving shows a sign-in error from Microsoft. Ignore it — webhook sends still go through.

Get the address

An incoming webhook is the quickest way in. It posts to one channel and can’t send DMs.
1

Create a Slack app

Go to api.slack.com/apps and create an app from scratch. Name it and pick the workspace it belongs to — the workspace can’t be changed later.
Slack's Create from scratch dialog, with fields for the app name and the workspace it belongs to
2

Activate incoming webhooks

Open Incoming Webhooks and switch Activate Incoming Webhooks on.
Slack app settings with Activate Incoming Webhooks toggled on
3

Point it at a channel

Click Add New Webhook to Workspace, pick the channel to post into, and Allow.
Slack authorization screen asking which workspace and channel the webhook should post to
4

Copy the URL

It looks like https://hooks.slack.com/services/TXXXX/BXXXX/XXXXXXX.The channel you picked is the only one this URL can ever post to. To reach a second channel, create a second webhook.
Same Slack app, a different credential out of it. Add the OAuth scopes you need, install the app to your workspace, and copy the bot token. It starts with xoxb-.chat:write.public is what lets the bot post to a channel it hasn’t been invited to. Without it, invite the bot to the channel first.
Sending into your customers’ own workspaces works differently again — they install your app through an OAuth flow you build, and you store a token per customer. Full walkthrough in the Slack and Microsoft Teams guides.

Add the channels in SuprSend

Open Agent with Cmd+/ and paste:

Store the address and trigger

The value you copied goes on the user profile, the same way a phone number did.
A Slack channel or a shared inbox often isn’t a person at all. When the recipient is a team rather than a user, model it as an object and let people subscribe to it, instead of hanging the channel off someone’s personal profile.

Confirm delivery

The message is in the Slack or Teams channel, and the execution in Logs has a row for it.

Troubleshooting Slack and Teams

The bot isn’t in that channel and doesn’t have chat:write.public. Either add the scope and reinstall the app, or invite the bot to the channel.
Sending by email needs users:read.email so Slack can resolve the address to a person. Without it, or if that email doesn’t belong to anyone in the workspace, there’s nobody to deliver to.
Bot tokens are revoked when the app is uninstalled or reinstalled. Reinstalling issues a new xoxb- token, and every profile storing the old one has to be updated.
Incoming webhook URLs are tied to the channel they were created for. Deleting or archiving that channel, or removing the app, kills the URL permanently — you create a new one rather than repointing it.
A Workflows webhook is owned by the person who made it, not by the channel. It stops if they leave the organisation, or if the workflow is turned off in the Workflows app. Add a co-owner. Teams also throttles at more than four requests a second and rejects messages over 28 KB.
The webhook accepted the request, then Teams dropped it — the Teams template is in Markdown. Switch to JSONNET. Confirm in the channel, not just the logs.
The card version is too new for a webhook. Set it to 1.4 or 1.5.
App Type on Vendors → MS Teams doesn’t match your Azure bot. Bots created after 31 July 2025 are Single tenant.
The bot isn’t in the team that owns the channel. @mention the bot once in that channel.

Next steps

Send in order, not all at once

Smart channel routing tries one channel, then the next, and stops as soon as one lands.

Let users choose

Preference categories and per-channel opt-outs, so people control which channels reach them.

Notify a team, not a person

Model a Slack channel, a shared inbox or a squad as an object that people subscribe to.

Go live

Connect your own vendors for every channel you added, and run the pre-launch checks.