Skip to main content
This page covers the case where the Teams app and bot belong to the customer, not you. Everything else — objects for channels, users for DMs, the trigger — is the same as Send via your Teams app. Only the credentials change at send time. Let’s say you sell to a hospital network or a bank. Their security team won’t approve a third-party bot in their Entra directory. Instead, they register their own Teams app in their directory, hand you its credentials, and expect every Teams message for their account to come from that app.

Key concepts

1. The customer creates the Teams app

Point their IT team at Create a Teams app. They run those steps in their own Azure and Teams Developer Portal, with three differences from your own setup:
  • Supported account types can stay single-directory (AzureADMyOrg). This bot never leaves their tenant.
  • Azure Bot App Type is still Single tenant.
  • They send you the Application (client) ID, client secret, and Directory (tenant) ID. The app package stays with them — their admins install it from their own org catalog.
If they’d rather you provision it, the Azure CLI script on that page works in a subscription they grant you access to; use --sign-in-audience AzureADMyOrg.

2. The customer installs the app in their tenant

Their admin uploads the app package in Teams admin center → Teams apps → Manage apps → Upload new app, then gives it permission to send:
  • DMs — add the app to the Global setup policy under Teams apps → Setup policies → Installed apps, so it’s installed in personal scope for everyone.
  • Channel posts — @mention the bot once in each channel you’ll post in, which installs the app in that team.
This is the same as Option A on Send via your Teams app. Because the app is theirs and lives in their catalog, there’s no Store listing or .zip from your side.

3. Save their credentials on a tenant vendor

Create the SuprSend tenant for this customer if it doesn’t exist:
Then open Vendors → Microsoft Teams with that tenant selected in the tenant switcher (open vendors) and fill in their values:
SuprSend Microsoft Teams vendor form with App Type and Tenant ID
After you save, SuprSend logs in with these credentials and shows the result in the Access Token field. Empty means the login failed — usually a wrong Tenant ID. Filled means it worked, but a mismatched App Type can still fail every send with 401, so send a test before going further.
Your default (workspace) vendor stays as your bot for customers who install your app. Only customers who bring their own app get a tenant vendor. Passing tenant_id: "customer-a" on a trigger is what selects their vendor.
There isn’t a public API for the vendor form today; set it in the dashboard. Tenant-vendor API access is in beta — email support@suprsend.com if you need it.

4. Save Teams channels and users in SuprSend

Channels go on the service object, DMs on the user’s per-tenant profile — the same as the your-app path. Collecting the IDs works the same way too; see In production, fetch the IDs automatically with Graph.
tenant_id on the entry is optional on this path, because the tenant vendor already knows their directory. Including it is harmless and keeps the entries identical to the your-app path. Don’t put incoming_webhook on these recipients. Webhooks ignore tenant vendors and fire for every URL on the profile.

5. Trigger a workflow

Create a workflow (for example new-incident) with a multi-channel or MS Teams node connected to a Teams template. Trigger it with the service object and the on-call user as recipients, and always pass the customer’s tenant_id — that’s what routes the send through their vendor:
SuprSend authenticates as the customer’s bot, posts to the channel on api-prod, and DMs the on-call engineer from their per-tenant $ms_teams entry.
If everything works, the channel post and the DM arrive from the customer’s app name, not yours. You can also check Logs → Messages in SuprSend for the delivery and later statuses — the tenant column shows which customer’s vendor was used.

FAQs

Yes. Customers who install your app use the default vendor; customers who bring their own app get a tenant vendor. The trigger’s tenant_id decides which vendor a send uses — the same workflow and templates serve both.
The trigger didn’t pass tenant_id, or that tenant has no Microsoft Teams vendor. Without a tenant vendor, SuprSend uses the default workspace vendor — yours.
App Type on their tenant vendor doesn’t match their Azure Bot. Bots created after 31 July 2025 are single-tenant.
Tenant ID on the vendor form isn’t the directory where they registered the bot. Use their Directory (tenant) ID.
The app is in their tenant but not installed in the team that owns that channel. Their admin @mentions the bot once in the channel, or installs the app in the team.

Next

Tenant vendors

How per-tenant credentials override the default vendor, for Teams and every other channel.

User-tenant mapping

Keep a user’s Teams identity separate for each customer they belong to.