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.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.

Add the channels in SuprSend
The template needs content for the new channel, and the workflow needs to deliver on it.- Dashboard Agent
- Dashboard
Cmd+/ and paste:
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.- AI editor
- Write it yourself
Copy the prompt
Copy the prompt
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.Troubleshooting SMS and WhatsApp
The execution completed but nothing arrived
The execution completed but nothing arrived
The channel was skipped in the execution log
The channel was skipped in the execution log
add_sms or add_whatsapp line. Run it again.WhatsApp is stuck on Approval Pending
WhatsApp is stuck on Approval Pending
Utility, not Marketing. Edit the
draft and commit again; the new version is reviewed separately.The SMS template went to Approval Pending, not Live
The SMS template went to Approval Pending, not Live
The message arrived with a blank where the variable should be
The message arrived with a blank where the variable should be
{{order_id}}, the same key your trigger sends in data. Open the
message in Logs → Messages and use Message preview to see what rendered.A channel stopped working after sending fine for a while
A channel stopped working after sending fine for a while
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.

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.Add the channels in SuprSend
- Dashboard Agent
- Dashboard
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.- AI editor
- Write it yourself
Copy the prompt
Copy the prompt
localhost is exempt in most browsers, so local development works, but a
staging site served over plain HTTP will not.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.Troubleshooting inbox and web push
The inbox renders but stays empty
The inbox renders but stays empty
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.Invalid token or signature errors
Invalid token or signature errors
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.The browser never asks to allow notifications
The browser never asks to allow notifications
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.Web push registers but nothing arrives
Web push registers but nothing arrives
/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 web push notification arrives but clicking does nothing
The web push notification arrives but clicking does nothing
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
.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
- Dashboard Agent
- Dashboard
Cmd+/ and paste:Add the SDK to your app
Your app has two jobs: identify the user with the samedistinct_id your backend already syncs, and
hand SuprSend the device token that FCM or APNS issues. The calls differ per platform.
- AI editor
- Write it yourself
Copy the prompt
Copy the prompt
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.androidpush or iospush. Once
it’s there, trigger the workflow and the notification arrives on the device.Troubleshooting mobile push
No push identity on the user profile
No push identity on the user profile
The execution shows the channel skipped
The execution shows the channel skipped
iOS says BadDeviceToken or the send is rejected
iOS says BadDeviceToken or the send is rejected
The notification arrives but looks wrong or has no image
The notification arrives but looks wrong or has no image
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.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.- Webhook
- Bot
Get the address
- Slack
- Microsoft Teams
Create a Slack app

Activate incoming webhooks

Point it at a channel

Copy the URL
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.Or use a bot token — any channel, and DMs
Or use a bot token — any channel, and DMs
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.Add the channels in SuprSend
- Dashboard Agent
- Dashboard
Cmd+/ and paste:Store the address and trigger
The value you copied goes on the user profile, the same way a phone number did.- AI editor
- Write it yourself
Copy the prompt
Copy the prompt
Confirm delivery
Troubleshooting Slack and Teams
channel_not_found or not_in_channel
channel_not_found or not_in_channel
chat:write.public. Either add the scope and
reinstall the app, or invite the bot to the channel.The DM never arrives, but the send succeeded
The DM never arrives, but the send succeeded
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.invalid_auth or an expired token
invalid_auth or an expired token
xoxb- token, and every profile storing the old one has to be updated.The webhook worked, then stopped
The webhook worked, then stopped
The Teams webhook stopped working on its own
The Teams webhook stopped working on its own
Logs say delivered, but nothing appears in Teams
Logs say delivered, but nothing appears in Teams
Teams shows "We're sorry, this card couldn't be displayed"
Teams shows "We're sorry, this card couldn't be displayed"
version is too new for a webhook. Set it to 1.4 or 1.5.Teams bot sends fail with 401
Teams bot sends fail with 401
Single tenant.BotNotInConversationRoster
BotNotInConversationRoster








