This feature is currently in public beta, please contact us at support@novu.co to enable it for your organization.
Check out the agents documentation for more information on how to build agents using Microsoft Teams.
Prerequisites
- Access to Azure Portal with App Registration permissions.
- Access to Microsoft Teams Developer Portal
- Administrator privileges for granting API permissions
- Access to Novu dashboard
Azure and Teams configuration
Before you can configure Novu, you must create the infrastructure that hosts your bot. This involves two distinct portals:- Azure portal: To create the identity (App Registration) and infrastructure (Bot Service).
- Teams Developer Portal: To create the app package that your customers can install.
Create the app identity (Azure AD)
First, create a multi-tenant identity for your bot.Log in to Azure Portal
Log in to the Azure Portal.
Fill in the form
Fill in the form:
- Name: Enter any name of your choice.
- Supported account types: Select Accounts in any organizational directory (Any Microsoft Entra ID directory - Multitenant).

Configure client secret
Add Novu’s redirect URI
When a tenant administrator accepts admin consent, Microsoft redirects the browser to Novu at this URL. Register it in Azure on your app registration during setup — before any organization connects Teams. This is not the optional Redirect URL on the Novu integration. That Novu field only controls where the administrator is sent in your application after Novu finishes processing the callback.Set the redirect URI
In the Redirect URI field, set the redirect URI to the Novu OAuth callback URL:
- US region
- EU region

Add Microsoft Graph app permissions
These permissions let your app list teams and channels and decide where to send messages.Add required permissions
Search for and select the following Application permissions:
Team.ReadBasic.All— list teams in a connected tenantChannel.ReadBasic.All— list channels in a teamAppCatalog.Read.All— resolve your Teams app in the org catalogTeamsAppInstallation.ReadWriteSelfForTeam.All(optional) — programmatically install the app into a teamTeamsAppInstallation.ReadWriteSelfForUser.All(required only for OAuth DM linking) — install the app for a user during the link-user flow
User.Read
openid and profile during the link-user OAuth flow; Azure includes these automatically for sign-in. Application permissions (above) cover tenant connect and channel messaging. Delegated User.Read is only needed for the separate link-user flow.
Grant admin consent in your home tenant
On the API permissions page, click Grant admin consent for [your tenant] and confirm. This applies the application permissions in the tenant where you registered the app. Each organization that connects Teams later grants consent separately through the Novu OAuth flow.
Create an Azure Bot resource
Now you register your bot with the Azure AI Bot Service and link it to the app registration that you just created.Fill in the basics
Fill in the basics:
- Bot handle: The unique display name in Azure.
- Subscription: Select the Azure subscription.
- Resource group: A collection of resources that share the same lifecycle, permissions, and policies, you can either select or create one.
- Data residency: Specify an option for data residency, either global or regional.
Configure Microsoft App ID
Under Microsoft App ID:
- Type of app: Select Single-tenant app registration.
- Creation type: Choose “Use existing app registration” and use app IDs you created earlier:
- App ID: Replace with the Application (client) ID.
- App tenant ID: Replace with the Directory (tenant) ID.

Enable the Microsoft Teams channel
This connects your bot resource to Teams and lets your Teams app install cleanly.Choose environment
In the Messaging section, choose the appropriate environment, typically Microsoft Teams Commercial.
Create a Teams app
Now you create the Teams “wrapper” around your app registration and bot.Open Teams client
Open the Teams client (desktop or web).
Open Developer Portal
In the left sidebar, click Apps.
Search for Developer Portal and click Add, then open it.

Fill in Basic information
In the left sidebar, click Basic information.
Fill in the required fields (names, descriptions, developer info, URLs) and then click Save.
Enter bot ID
Under Identify your bot, select Enter a bot ID and then paste your Application (client) ID from Microsoft Azure.
Configure bot capabilities
In the What can your bot do? section, select “Only send notification” (at minimum).
Enable scopes
Under Select the scopes where people can use your bot, enable the scopes based on your use case:
- Team
- Personal
- Group chat
Add supportsChannelFeatures (Team scope)
If you enabled the Team scope, add the
supportsChannelFeatures property to your app manifest. Without it, uploading or installing the app fails with:Applications with manifest version 1.25 or higher that support the ‘team’ scope must include the ‘supportsChannelFeatures’ property.In the Developer Portal, go to Configure → App package editor → manifest.json, and add
"supportsChannelFeatures": "tier1" at the root level of the manifest. tier1 is the only supported value.Upload your app
Next, you must install the app into a specific Team or for a specific User. Follow the steps in the Microsoft Teams documentation to learn how to upload the just downloaded app package and also how to add the app to a specific location.Configure the Teams (Bot) integration in Novu
Now that you’ve configured your Azure Bot, provide Novu with the credentials to integrate it.Enter credentials
Enter the credentials you saved from the Azure Portal:
- Client ID: Enter your
BOT_APP_ID. - Client Secret: Enter your
BOT_APP_SECRET. - App Tenant ID: Enter your
APP_TENANT_ID. This value identifies the tenant where you registered the app. - Redirect URL (Optional): Where the tenant administrator is sent in your application after Novu processes the OAuth callback. This is not the Azure redirect URI — see Add Novu’s redirect URI.

Try the Microsoft Teams integration with a demo appIf you’ve completed the previous steps, you can test your bot configuration end to end with this demo app.
Let organizations connect their Microsoft 365 tenant
Each organization you notify has its own Microsoft 365 tenant. Before you can send Teams messages on their behalf, a tenant administrator from that organization must grant your app a one-time admin consent. This authorizes your bot in their tenant using application permissions (app-only / client credentials).Tenant connect and user linking are separate steps. Admin consent connects the organization’s Microsoft 365 tenant. Linking a Novu subscriber for direct messages is a separate OAuth flow — see Link a subscriber for direct messages.
Generate a Connect Teams URL
Call this from your backend when someone starts the connect flow in your product (for example, when a tenant administrator clicks Connect Microsoft Teams).POST /v1/integrations/channel-connections/oauth with the same body if you are not using the TypeScript SDK. Authenticate with your Novu secret key.
Novu returns a URL pointing to Microsoft’s administrator consent endpoint (login.microsoftonline.com/organizations/v2.0/adminconsent). It includes your Client ID, redirect URI, and the https://graph.microsoft.com/.default scope.
Provide either subscriberId or context to scope the channel connection in Novu. If you pass subscriberId, that subscriber must already exist in your Novu environment.
For tenant-wide admin consent, prefer context and set autoLinkUser: false (or omit autoLinkUser — the API treats omitted as false). Only when autoLinkUser is explicitly true and subscriberId is set does Novu chain a second OAuth flow after admin consent to link that subscriber for DMs.
@novu/react MsTeamsConnectButton defaults autoLinkUser to true in subscriber mode. That is intended for in-app end-user connect flows. For server-side tenant admin consent (Java, REST, or @novu/api), pass autoLinkUser: false explicitly.Show it in your UI
Open the URL in a new tab or window when the tenant administrator is ready to consent:What the tenant administrator does
The tenant administrator is someone at the connecting organization (not a Novu dashboard user). They grant consent in Microsoft — they do not need a Novu account.Click Connect Microsoft Teams
They click Connect Microsoft Teams. Your backend generates a fresh OAuth URL and opens it.
admin_consent=True and the organization’s tenant ID. Novu stores the tenant on a channel connection and the flow is complete. You do not handle the callback yourself.
If you set an optional Redirect URL on the MS Teams integration in the Novu dashboard, the administrator is sent there after success; otherwise the consent window shows a success message and can be closed.
Install the app in Teams
Admin consent only authorizes your bot in the organization’s tenant. It does not add the bot to a specific team or chat. For the bot to send messages, someone must install the app where notifications should appear:- For channel messages: Install the app in the specific Team.
- For direct messages: Install the app for the specific user in their personal scope.
TeamsAppInstallation.ReadWriteSelfForTeam.All permission, your backend can programmatically install the app into a specific Team using the Microsoft Graph API.
Tell Novu where to send the messages
Decide where notifications should land in Teams, collect the required IDs, and register them as channel endpoints in Novu. You can choose between two destination types:- Channels: Send a message to a specific channel within a Team.
- Users: Send a direct message to a specific user.
Sending message to channels
To send a notification to a specific channel, you must discover the Team ID and Channel ID from Microsoft, and then register them in Novu.Find the Team and Channel IDs (Microsoft Graph)
You can discover these IDs using the Microsoft Graph API. This requires an App-Only Token (Client credentials) scoped to the customer’s tenant.Get a Graph access token
Get a Graph access token:The
SUBSCRIBER_TENANT_ID represents the customer’s tenant ID, which Novu stored on the ChannelConnection object after completing the Admin Consent flow.Register the channel endpoint (Novu)
Once you have the IDs, create anms_teams_channel endpoint in Novu. This maps a subscriber to that specific channel.
ChannelEndpoint<'ms_teams_channel'>. You can later target it from workflows via subscriberId + context.
Send a direct message to a user
To send a direct message (DM), register anms_teams_user channel endpoint for the subscriber. You can do this with OAuth or by supplying the Teams user ID manually.
Link a subscriber for direct messages
Prerequisites:- Admin consent has already connected the organization’s tenant (see above).
- The subscriber exists in Novu.
- Application permission
TeamsAppInstallation.ReadWriteSelfForUser.Alland delegatedUser.Readare configured in Azure (see Add Microsoft Graph app permissions).
autoLinkUser: true on generateConnectOAuthUrl. Use generateLinkUserOAuthUrl instead:
POST /v1/integrations/channel-endpoints/oauth with the same body when using the REST API.
This opens a Microsoft sign-in flow with delegated scopes (openid, profile, User.Read). Novu reads the user’s identity from the token, installs the bot for that user when possible, and creates an ms_teams_user channel endpoint.
Find the user ID manually (Bot framework)
Alternatively, discover the Teams user ID yourself and register the endpoint without OAuth. Use the Bot framework API to inspect the roster of the Team where you installed the bot.
From the returned members, take the member’s
id; this value represents the Teams user ID (29:...) you’ll use as userId.
Register the user endpoint (Novu)
Once you have the IDs, create the endpoint in Novu using thems_teams_user type.
ChannelEndpoint<'ms_teams_user'>. From here, any workflow that resolves to this endpoint can send a DM from your bot to that user.
Workflows for Teams (Webhook-style)
If you don’t need a full Bot identity or Direct Message capabilities, then you can support a simplified, channel-only integration using Workflows for Microsoft Teams. This approach relies on a unique Webhook URL generated by the Teams client. It requires no Azure app registration and no administrator consent.User generates the webhook URL (Teams client)
The setup begins inside the Microsoft Teams app. Instruct your users to follow these steps:Register the webhook endpoint (Novu)
Unlike the Bot integration, you don’t usems_teams_channel here. Instead, you treat this as a generic webhook endpoint. Your app should provide a form where the user can paste the URL they generated in the previous step.
Sending the notification
When you trigger a workflow that targets this subscriber:Using Microsoft Teams with agents
Microsoft Teams is a supported agent provider. Connect your Teams bot to an agent so users can message the bot and get replies in the same chat — without building Bot Framework webhook handling yourself.Build agents on Teams
Learn how Novu agents work, including managed and custom code agents.
What you get
When Teams is connected to an agent:- Users message your bot in Teams and your agent responds in the same chat
- Conversations appear in the dashboard under Agent Conversations
- Supported content includes text, markdown, files, and interactive cards
Agent conversations vs. workflow notifications
| Use case | What happens |
|---|---|
| Agent conversation | The user messages your bot and your agent replies in the same Teams chat. |
| Workflow notification | You trigger a workflow with a Chat step and Novu sends a one-way message via your Teams integration or workflow webhook. |
Related
Agents and providers
Connect Teams and other providers to an agent.









