From 1e15844dc397c365cf1eb8f3c1f8e6c63fe08bc4 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Fri, 12 Sep 2025 18:31:07 +0530 Subject: [PATCH 01/23] Create Bot-updates-shared-channels.md Content for bot updates for indirect members --- .../Bot-updates-shared-channels.md | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md new file mode 100644 index 00000000000..0cfadd96e63 --- /dev/null +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -0,0 +1,117 @@ +# Enhance collaboration with bots in Microsoft Teams shared channels + +Shared channels in Microsoft Teams enable collaboration across teams and organizations. +Users in these channels can be of two types: +- **Direct members**: These are users that are added explicitly to the channel +- **Indirect members**: These are users who access the channel through a shared team. + +Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. + +## Get member event notifications for shared channels in Microsoft Teams +Previously, bots subscribed to member events in shared channels only received notifications for direct members added to and removed from the shared channel. + +Microsoft Teams now supports bot notifications for both direct and indirect members. This enhancement expands its Bot Framework SDK to support notifications for indirect members in shared channels. +This update improves visibility into membership changes across teams, enabling bots to more effectively track user access in collaborative environments. It builds on the existing capability for bots to subscribe to `conversationUpdate` events in channels. + +With this enhancement, bots now also receive events for indirect members, who gain access through: +* Membership in a team that the channel is shared with +* Updates to the team’s roster + +### Enable member event notifications for shared channels + +To receive `conversationUpdate` event notifications when indirect members are added or removed, configure your bot with the following pre-requisites: +1. Update the App Manifest + +Add the `supportedChannelTypes` property to your app manifest to declare support for shared channels: + + ```json + "supportedChannelTypes": [ + "sharedChannels" + ] + ``` + +2. RSC Permission + +Your app must request the following RSC permission to access channel membership information: + +```json +{ + "authorization": { + "permissions": { + "resourceSpecific": [ + { + "name": "ChannelMember.Read.Group", + "type": "Application" + } + ] + } + } +} +``` + +3. Ensure the bot is enabled in the shared channel + +To receive member event notifications: + +1. Install the bot at the team level. + +2. Manually allow the bot in each shared channel. + +This ensures the bot is active and authorized to receive notifications for both direct and indirect members. + +## Handle member add and remove events + +The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. Ensure your bot is set up with all prerequisites to receive transitive member events. + +### Member added event + +```csharp +public async Task OnMembersAddedAsync(ITurnContext turnContext, AppState turnState, CancellationToken cancellationToken) +{ + var membersAdded = turnContext.Activity.MembersAdded; + + List addedMembers = new List(); + foreach (var member in membersAdded) + { + if (member.Id != turnContext.Activity.Recipient.Id) + { + addedMembers.Add($"Member {member.Name} (ID {member.Id}) added."); + } + } + + await ActivityUtils.SendAdaptiveCard( + "Member Added", + addedMembers, + new List { "membersAdded", membersAdded }, + turnContext, + cancellationToken).ConfigureAwait(false); +} +``` +### Member removed event +```csharp +public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnState, CancellationToken cancellationToken) +{ + var membersRemoved = turnContext.Activity.MembersRemoved; + + List removedMembers = new List(); + foreach (var member in membersRemoved) + { + if (member.Id != turnContext.Activity.Recipient.Id) + { + removedMembers.Add($"Member {member.Name} (ID {member.Id}) removed."); + } + } + + await ActivityUtils.SendAdaptiveCard( + "Member Removed", + removedMembers, + new List { "membersRemoved", membersRemoved }, + turnContext, + cancellationToken).ConfigureAwait(false); +} +``` + +## Code sample + +## See also +[Shared channels in Microsoft Teams](/microsoftteams/shared-channels) From caa233ac8552ada9e7288ce543795153f9b17334 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Fri, 12 Sep 2025 18:43:04 +0530 Subject: [PATCH 02/23] Update Bot-updates-shared-channels.md --- .../concepts/build-and-test/Bot-updates-shared-channels.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md index 0cfadd96e63..fa721d32bcd 100644 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -24,12 +24,11 @@ To receive `conversationUpdate` event notifications when indirect members are ad Add the `supportedChannelTypes` property to your app manifest to declare support for shared channels: - ```json +```JSON "supportedChannelTypes": [ - "sharedChannels" + "sharedChannels", ] - ``` - +``` 2. RSC Permission Your app must request the following RSC permission to access channel membership information: From eb2b2c8aab78adf643f2a5d17f8c5c435032f3d8 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Fri, 12 Sep 2025 18:48:36 +0530 Subject: [PATCH 03/23] Update Bot-updates-shared-channels.md --- .../build-and-test/Bot-updates-shared-channels.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md index fa721d32bcd..c668e7b1bbe 100644 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -1,3 +1,12 @@ +--- +title: Enhance collaboration with bots in shared channels +author: surbhigupta +description: Learn about Teams Connect shared channels to securely collaborate with internal and external users in a shared space without switching tenants. +ms.author: surbhigupta +ms.localizationpriority: high +ms.topic: conceptual +ms.date: 09/12/2025 +--- # Enhance collaboration with bots in Microsoft Teams shared channels Shared channels in Microsoft Teams enable collaboration across teams and organizations. From 97eb731f80661b52176273080ebd0376df8f12f9 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Mon, 15 Sep 2025 08:55:07 +0530 Subject: [PATCH 04/23] Update Bot-updates-shared-channels.md updated content --- .../build-and-test/Bot-updates-shared-channels.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md index c668e7b1bbe..33516aa9711 100644 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -1,18 +1,18 @@ --- title: Enhance collaboration with bots in shared channels author: surbhigupta -description: Learn about Teams Connect shared channels to securely collaborate with internal and external users in a shared space without switching tenants. +description: Learn about updates in indirect membership for bots. ms.author: surbhigupta ms.localizationpriority: high ms.topic: conceptual ms.date: 09/12/2025 --- -# Enhance collaboration with bots in Microsoft Teams shared channels +# Enhance collaboration with bots in shared channels Shared channels in Microsoft Teams enable collaboration across teams and organizations. -Users in these channels can be of two types: -- **Direct members**: These are users that are added explicitly to the channel -- **Indirect members**: These are users who access the channel through a shared team. +Users in these channels are of two types: +- **Direct members**: These users are added explicitly to the channel +- **Indirect members**: These users access the channel through a shared team. Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. @@ -28,7 +28,7 @@ With this enhancement, bots now also receive events for indirect members, who ga ### Enable member event notifications for shared channels -To receive `conversationUpdate` event notifications when indirect members are added or removed, configure your bot with the following pre-requisites: +To receive `conversationUpdate` event notifications when indirect members are added or removed, configure your bot with the following prerequisites: 1. Update the App Manifest Add the `supportedChannelTypes` property to your app manifest to declare support for shared channels: From 853cb2cd05792598231fa891454fcb66e2aee3d2 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Mon, 15 Sep 2025 14:41:35 +0530 Subject: [PATCH 05/23] Update Bot-updates-shared-channels.md updated content for membership changes --- .../Bot-updates-shared-channels.md | 82 ++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md index 33516aa9711..f0111e677a2 100644 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -29,7 +29,7 @@ With this enhancement, bots now also receive events for indirect members, who ga ### Enable member event notifications for shared channels To receive `conversationUpdate` event notifications when indirect members are added or removed, configure your bot with the following prerequisites: -1. Update the App Manifest +1. Update the App manifest Add the `supportedChannelTypes` property to your app manifest to declare support for shared channels: @@ -38,7 +38,7 @@ Add the `supportedChannelTypes` property to your app manifest to declare support "sharedChannels", ] ``` -2. RSC Permission +2. Resource-Specific Consent (RSC)permission Your app must request the following RSC permission to access channel membership information: @@ -119,6 +119,84 @@ public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnS } ``` +### Membership Changes + +When a shared channel is added to another team, the Bot Framework might receive a `conversationUpdate` activity through the ```OnConversationUpdateActivityAsync``` method, but only if the bot is installed in the team or channel. + +```csharp + protected override async Task OnConversationUpdateActivityAsync( + ITurnContext turnContext, + CancellationToken cancellationToken) + { + // Always present on Teams activities + var tcd = turnContext.Activity.GetChannelData(); + var eventType = tcd?.EventType?.ToLowerInvariant(); + + // Read extended shared-channel shape (safe even if fields are absent) + var extended = turnContext.Activity.GetChannelData(); + + // Also keep a raw JObject for logging / future-proof access + var raw = turnContext.Activity.ChannelData as JObject + ?? (turnContext.Activity.ChannelData != null + ? JObject.FromObject(turnContext.Activity.ChannelData) + : new JObject()); + + // Helpful baseline log + _logger.LogInformation("ConversationUpdate eventType={EventType}, channelId={ChannelId}, teamId={TeamId}", + eventType, tcd?.Channel?.Id, tcd?.Team?.Id); + + switch (eventType) + { + case "channelshared": + { + var hostTeam = extended?.Team; // The channel's host team + var sharedWith = extended?.SharedWithTeams ?? new List(); + + _logger.LogInformation("ChannelShared: hostTeam={HostTeamId}, sharedWithCount={Count}", + hostTeam?.Id, sharedWith.Count); + + foreach (var team in sharedWith) + { + _logger.LogInformation("SharedWithTeam: id={Id}, name={Name}, aadGroupId={AadGroupId}, tenantId={TenantId}", + team.Id, team.Name, team.AadGroupId, team.TenantId); + } + + // Optional: surface a quick confirmation in-channel + await turnContext.SendActivityAsync( + MessageFactory.Text($"✅ Channel shared with {sharedWith.Count} team(s)."), + cancellationToken); + break; + } + + case "channelunshared": + { + var unsharedFrom = extended?.UnsharedFromTeams ?? new List(); + + _logger.LogInformation("ChannelUnshared: unsharedFromCount={Count}", unsharedFrom.Count); + + foreach (var team in unsharedFrom) + { + _logger.LogInformation("UnsharedFromTeam: id={Id}, name={Name}, aadGroupId={AadGroupId}, tenantId={TenantId}", + team.Id, team.Name, team.AadGroupId, team.TenantId); + } + + await turnContext.SendActivityAsync( + MessageFactory.Text($"❎ Channel unshared from {unsharedFrom.Count} team(s)."), + cancellationToken); + break; + } + + default: + // No-op; continue normal routing + break; + } + + await base.OnConversationUpdateActivityAsync(turnContext, cancellationToken); + } +``` + +--- + ## Code sample ## See also From 3fddf8a441bd0ddcda748ccd252b99bd47efed46 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Mon, 15 Sep 2025 14:55:43 +0530 Subject: [PATCH 06/23] Update Bot-updates-shared-channels.md --- .../concepts/build-and-test/Bot-updates-shared-channels.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md index f0111e677a2..13db0af0796 100644 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -29,16 +29,17 @@ With this enhancement, bots now also receive events for indirect members, who ga ### Enable member event notifications for shared channels To receive `conversationUpdate` event notifications when indirect members are added or removed, configure your bot with the following prerequisites: + 1. Update the App manifest -Add the `supportedChannelTypes` property to your app manifest to declare support for shared channels: + To declare support for shared channels, add the `supportedChannelTypes` property to your app manifest: ```JSON "supportedChannelTypes": [ "sharedChannels", ] ``` -2. Resource-Specific Consent (RSC)permission +2. Resource-Specific Consent (RSC) permission Your app must request the following RSC permission to access channel membership information: @@ -65,7 +66,7 @@ To receive member event notifications: 2. Manually allow the bot in each shared channel. -This ensures the bot is active and authorized to receive notifications for both direct and indirect members. +These steps ensure the bot is active and authorized to receive notifications for both direct and indirect members. ## Handle member add and remove events From affdce2894502e9dbccc05679daade9dd98e69fa Mon Sep 17 00:00:00 2001 From: Sharan Garcha Date: Mon, 15 Sep 2025 15:01:30 +0530 Subject: [PATCH 07/23] Rename Bot-updates-shared-channels.md to bot-updates-shared-channels.md --- ...-updates-shared-channels.md => bot-updates-shared-channels.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename msteams-platform/concepts/build-and-test/{Bot-updates-shared-channels.md => bot-updates-shared-channels.md} (100%) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md similarity index 100% rename from msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md rename to msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md From 4e35b20bcbf92ee4304159aac2719fd4c36bd5ef Mon Sep 17 00:00:00 2001 From: Sharan Garcha Date: Mon, 15 Sep 2025 15:11:33 +0530 Subject: [PATCH 08/23] Revise section titles --- .../concepts/build-and-test/bot-updates-shared-channels.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 13db0af0796..3567b436e48 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -68,9 +68,9 @@ To receive member event notifications: These steps ensure the bot is active and authorized to receive notifications for both direct and indirect members. -## Handle member add and remove events +## Manage member added and removed events -The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. Ensure your bot is set up with all prerequisites to receive transitive member events. +The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. To receive transitive member events, ensure your bot is set up with all prerequisites . ### Member added event From 77b892b15349773e4b04c84944e7612c192f3f2b Mon Sep 17 00:00:00 2001 From: Sharan Garcha Date: Mon, 15 Sep 2025 15:56:33 +0530 Subject: [PATCH 09/23] Fix formatting issue in bot updates documentation --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 3567b436e48..34e4440b908 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -70,7 +70,7 @@ These steps ensure the bot is active and authorized to receive notifications for ## Manage member added and removed events -The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. To receive transitive member events, ensure your bot is set up with all prerequisites . +The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. To receive transitive member events, ensure your bot is set up with all prerequisites. ### Member added event From 3acda52a7c2e8e8dc5651c761c7fa6374453284b Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Tue, 16 Sep 2025 11:58:51 +0530 Subject: [PATCH 10/23] Update Bot-updates-shared-channels.md --- .../Bot-updates-shared-channels.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md index 13db0af0796..1ac097901e2 100644 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md @@ -11,7 +11,7 @@ ms.date: 09/12/2025 Shared channels in Microsoft Teams enable collaboration across teams and organizations. Users in these channels are of two types: -- **Direct members**: These users are added explicitly to the channel +- **Direct members**: These users are added explicitly to the channel. - **Indirect members**: These users access the channel through a shared team. Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. @@ -68,9 +68,9 @@ To receive member event notifications: These steps ensure the bot is active and authorized to receive notifications for both direct and indirect members. -## Handle member add and remove events +## Manage member added and removed events -The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. Ensure your bot is set up with all prerequisites to receive transitive member events. +The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. To receive transitive member events, ensure your bot is set up with all the prerequisites. ### Member added event @@ -129,20 +129,16 @@ When a shared channel is added to another team, the Bot Framework might receive ITurnContext turnContext, CancellationToken cancellationToken) { - // Always present on Teams activities var tcd = turnContext.Activity.GetChannelData(); var eventType = tcd?.EventType?.ToLowerInvariant(); - // Read extended shared-channel shape (safe even if fields are absent) var extended = turnContext.Activity.GetChannelData(); - // Also keep a raw JObject for logging / future-proof access var raw = turnContext.Activity.ChannelData as JObject ?? (turnContext.Activity.ChannelData != null ? JObject.FromObject(turnContext.Activity.ChannelData) : new JObject()); - // Helpful baseline log _logger.LogInformation("ConversationUpdate eventType={EventType}, channelId={ChannelId}, teamId={TeamId}", eventType, tcd?.Channel?.Id, tcd?.Team?.Id); @@ -150,7 +146,7 @@ When a shared channel is added to another team, the Bot Framework might receive { case "channelshared": { - var hostTeam = extended?.Team; // The channel's host team + var hostTeam = extended?.Team; var sharedWith = extended?.SharedWithTeams ?? new List(); _logger.LogInformation("ChannelShared: hostTeam={HostTeamId}, sharedWithCount={Count}", @@ -162,9 +158,8 @@ When a shared channel is added to another team, the Bot Framework might receive team.Id, team.Name, team.AadGroupId, team.TenantId); } - // Optional: surface a quick confirmation in-channel await turnContext.SendActivityAsync( - MessageFactory.Text($"✅ Channel shared with {sharedWith.Count} team(s)."), + MessageFactory.Text($" Channel shared with {sharedWith.Count} team(s)."), cancellationToken); break; } @@ -182,13 +177,12 @@ When a shared channel is added to another team, the Bot Framework might receive } await turnContext.SendActivityAsync( - MessageFactory.Text($"❎ Channel unshared from {unsharedFrom.Count} team(s)."), + MessageFactory.Text($" Channel unshared from {unsharedFrom.Count} team(s)."), cancellationToken); break; } default: - // No-op; continue normal routing break; } From 350011377c08ee402944d15ca36fc09f695c5bfe Mon Sep 17 00:00:00 2001 From: Sharan Garcha Date: Tue, 16 Sep 2025 12:09:57 +0530 Subject: [PATCH 11/23] Fix punctuation and enhance logging in shared channels bot Corrected punctuation and improved logging messages in bot update handling for shared channels. --- .../build-and-test/bot-updates-shared-channels.md | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 34e4440b908..d127fec03c7 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -11,7 +11,7 @@ ms.date: 09/12/2025 Shared channels in Microsoft Teams enable collaboration across teams and organizations. Users in these channels are of two types: -- **Direct members**: These users are added explicitly to the channel +- **Direct members**: These users are added explicitly to the channel. - **Indirect members**: These users access the channel through a shared team. Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. @@ -129,20 +129,16 @@ When a shared channel is added to another team, the Bot Framework might receive ITurnContext turnContext, CancellationToken cancellationToken) { - // Always present on Teams activities var tcd = turnContext.Activity.GetChannelData(); var eventType = tcd?.EventType?.ToLowerInvariant(); - // Read extended shared-channel shape (safe even if fields are absent) var extended = turnContext.Activity.GetChannelData(); - // Also keep a raw JObject for logging / future-proof access var raw = turnContext.Activity.ChannelData as JObject ?? (turnContext.Activity.ChannelData != null ? JObject.FromObject(turnContext.Activity.ChannelData) : new JObject()); - // Helpful baseline log _logger.LogInformation("ConversationUpdate eventType={EventType}, channelId={ChannelId}, teamId={TeamId}", eventType, tcd?.Channel?.Id, tcd?.Team?.Id); @@ -150,7 +146,7 @@ When a shared channel is added to another team, the Bot Framework might receive { case "channelshared": { - var hostTeam = extended?.Team; // The channel's host team + var hostTeam = extended?.Team; var sharedWith = extended?.SharedWithTeams ?? new List(); _logger.LogInformation("ChannelShared: hostTeam={HostTeamId}, sharedWithCount={Count}", @@ -162,9 +158,8 @@ When a shared channel is added to another team, the Bot Framework might receive team.Id, team.Name, team.AadGroupId, team.TenantId); } - // Optional: surface a quick confirmation in-channel await turnContext.SendActivityAsync( - MessageFactory.Text($"✅ Channel shared with {sharedWith.Count} team(s)."), + MessageFactory.Text($" Channel shared with {sharedWith.Count} team(s)."), cancellationToken); break; } @@ -182,13 +177,12 @@ When a shared channel is added to another team, the Bot Framework might receive } await turnContext.SendActivityAsync( - MessageFactory.Text($"❎ Channel unshared from {unsharedFrom.Count} team(s)."), + MessageFactory.Text($" Channel unshared from {unsharedFrom.Count} team(s)."), cancellationToken); break; } default: - // No-op; continue normal routing break; } From 92b84cc6a59f35c5bf7a3516d6ceae1d7b249edf Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Tue, 16 Sep 2025 17:41:37 +0530 Subject: [PATCH 12/23] Update bot-updates-shared-channels.md added content --- .../bot-updates-shared-channels.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 1ac097901e2..b9a6ca64227 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -13,6 +13,7 @@ Shared channels in Microsoft Teams enable collaboration across teams and organiz Users in these channels are of two types: - **Direct members**: These users are added explicitly to the channel. - **Indirect members**: These users access the channel through a shared team. +Bots must be able to distinguish between these member types to operate correctly in collaborative environments. Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. @@ -68,6 +69,50 @@ To receive member event notifications: These steps ensure the bot is active and authorized to receive notifications for both direct and indirect members. +### Detect when your app is added to a channel + +There’s no dedicated API to check if your app is part of a channel. Bots can detect this indirectly: + +When your bot receives a `channelMemberAdded` event for itself in a `conversationUpdate`, your app has been added to the channel. + +Use this event to trigger app-specific logic such as: + +* Sending a welcome message +* Fetching the channel roster +* Configuring tabs +* Starting scheduled jobs + +Bot events (like messages and mentions) will only begin after your app is added to the channel. + +### Identify external users and guests in Teams channels + +When building apps or bots for Microsoft Teams, you need to distinguish between internal, guest, and external (cross-tenant) users. This distinction is useful for: + +* Enforcing access controls for sensitive operations +* Tailoring UI behavior based on user type (for example, hiding features for guests or external users) +* Managing authentication flows in tabs or bots + +### Detect user type at run time +You can use `aadObjectId` received in activity payloads to match the member who invoked the activity with the member list returned by `getPagedMembersAsync`. + +#### Identify guest users + +Use either `TeamsInfo.getMemberAsync` or `TeamsInfo.getPagedMembersAsync`, and check if `userRole === "guest"`. + +#### Identify external users + +Each incoming activity for the bot includes `channelData.tenantId`. Compare this value with `membershipSource.tenantId` from the `getPagedMembersAsync` response. If the tenant IDs do not match, the user is considered as an external user. + + +#### Detect user type from membership data + +Use `TeamsInfo.getPagedMembersAsync` to retrieve membership details. + +- For guest users, check if `UserRole === "guest"` in `TeamsChannelAccount`. +- For external users, compare `conversation.tenantId` with `membershipSource.tenantId` in the member payload. If the tenant IDs differ, the user is external. + +When a channel member is added or removed, the event payload includes both `conversation.tenantId` and `membershipSource.tenantId`. Compare these values to determine if the member is an external user or not. + ## Manage member added and removed events The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. To receive transitive member events, ensure your bot is set up with all the prerequisites. From 43c2614cc9f87ccf7eaa597923419e122bd2d0c7 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Tue, 16 Sep 2025 18:28:21 +0530 Subject: [PATCH 13/23] Delete Bot-updates-shared-channels.md --- .../Bot-updates-shared-channels.md | 198 ------------------ 1 file changed, 198 deletions(-) delete mode 100644 msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md diff --git a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md deleted file mode 100644 index 1ac097901e2..00000000000 --- a/msteams-platform/concepts/build-and-test/Bot-updates-shared-channels.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Enhance collaboration with bots in shared channels -author: surbhigupta -description: Learn about updates in indirect membership for bots. -ms.author: surbhigupta -ms.localizationpriority: high -ms.topic: conceptual -ms.date: 09/12/2025 ---- -# Enhance collaboration with bots in shared channels - -Shared channels in Microsoft Teams enable collaboration across teams and organizations. -Users in these channels are of two types: -- **Direct members**: These users are added explicitly to the channel. -- **Indirect members**: These users access the channel through a shared team. - -Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. - -## Get member event notifications for shared channels in Microsoft Teams -Previously, bots subscribed to member events in shared channels only received notifications for direct members added to and removed from the shared channel. - -Microsoft Teams now supports bot notifications for both direct and indirect members. This enhancement expands its Bot Framework SDK to support notifications for indirect members in shared channels. -This update improves visibility into membership changes across teams, enabling bots to more effectively track user access in collaborative environments. It builds on the existing capability for bots to subscribe to `conversationUpdate` events in channels. - -With this enhancement, bots now also receive events for indirect members, who gain access through: -* Membership in a team that the channel is shared with -* Updates to the team’s roster - -### Enable member event notifications for shared channels - -To receive `conversationUpdate` event notifications when indirect members are added or removed, configure your bot with the following prerequisites: - -1. Update the App manifest - - To declare support for shared channels, add the `supportedChannelTypes` property to your app manifest: - -```JSON - "supportedChannelTypes": [ - "sharedChannels", - ] -``` -2. Resource-Specific Consent (RSC) permission - -Your app must request the following RSC permission to access channel membership information: - -```json -{ - "authorization": { - "permissions": { - "resourceSpecific": [ - { - "name": "ChannelMember.Read.Group", - "type": "Application" - } - ] - } - } -} -``` - -3. Ensure the bot is enabled in the shared channel - -To receive member event notifications: - -1. Install the bot at the team level. - -2. Manually allow the bot in each shared channel. - -These steps ensure the bot is active and authorized to receive notifications for both direct and indirect members. - -## Manage member added and removed events - -The following Bot Framework SDK examples apply to both direct and indirect member add and remove events. To receive transitive member events, ensure your bot is set up with all the prerequisites. - -### Member added event - -```csharp -public async Task OnMembersAddedAsync(ITurnContext turnContext, AppState turnState, CancellationToken cancellationToken) -{ - var membersAdded = turnContext.Activity.MembersAdded; - - List addedMembers = new List(); - foreach (var member in membersAdded) - { - if (member.Id != turnContext.Activity.Recipient.Id) - { - addedMembers.Add($"Member {member.Name} (ID {member.Id}) added."); - } - } - - await ActivityUtils.SendAdaptiveCard( - "Member Added", - addedMembers, - new List { "membersAdded", membersAdded }, - turnContext, - cancellationToken).ConfigureAwait(false); -} -``` -### Member removed event -```csharp -public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnState, CancellationToken cancellationToken) -{ - var membersRemoved = turnContext.Activity.MembersRemoved; - - List removedMembers = new List(); - foreach (var member in membersRemoved) - { - if (member.Id != turnContext.Activity.Recipient.Id) - { - removedMembers.Add($"Member {member.Name} (ID {member.Id}) removed."); - } - } - - await ActivityUtils.SendAdaptiveCard( - "Member Removed", - removedMembers, - new List { "membersRemoved", membersRemoved }, - turnContext, - cancellationToken).ConfigureAwait(false); -} -``` - -### Membership Changes - -When a shared channel is added to another team, the Bot Framework might receive a `conversationUpdate` activity through the ```OnConversationUpdateActivityAsync``` method, but only if the bot is installed in the team or channel. - -```csharp - protected override async Task OnConversationUpdateActivityAsync( - ITurnContext turnContext, - CancellationToken cancellationToken) - { - var tcd = turnContext.Activity.GetChannelData(); - var eventType = tcd?.EventType?.ToLowerInvariant(); - - var extended = turnContext.Activity.GetChannelData(); - - var raw = turnContext.Activity.ChannelData as JObject - ?? (turnContext.Activity.ChannelData != null - ? JObject.FromObject(turnContext.Activity.ChannelData) - : new JObject()); - - _logger.LogInformation("ConversationUpdate eventType={EventType}, channelId={ChannelId}, teamId={TeamId}", - eventType, tcd?.Channel?.Id, tcd?.Team?.Id); - - switch (eventType) - { - case "channelshared": - { - var hostTeam = extended?.Team; - var sharedWith = extended?.SharedWithTeams ?? new List(); - - _logger.LogInformation("ChannelShared: hostTeam={HostTeamId}, sharedWithCount={Count}", - hostTeam?.Id, sharedWith.Count); - - foreach (var team in sharedWith) - { - _logger.LogInformation("SharedWithTeam: id={Id}, name={Name}, aadGroupId={AadGroupId}, tenantId={TenantId}", - team.Id, team.Name, team.AadGroupId, team.TenantId); - } - - await turnContext.SendActivityAsync( - MessageFactory.Text($" Channel shared with {sharedWith.Count} team(s)."), - cancellationToken); - break; - } - - case "channelunshared": - { - var unsharedFrom = extended?.UnsharedFromTeams ?? new List(); - - _logger.LogInformation("ChannelUnshared: unsharedFromCount={Count}", unsharedFrom.Count); - - foreach (var team in unsharedFrom) - { - _logger.LogInformation("UnsharedFromTeam: id={Id}, name={Name}, aadGroupId={AadGroupId}, tenantId={TenantId}", - team.Id, team.Name, team.AadGroupId, team.TenantId); - } - - await turnContext.SendActivityAsync( - MessageFactory.Text($" Channel unshared from {unsharedFrom.Count} team(s)."), - cancellationToken); - break; - } - - default: - break; - } - - await base.OnConversationUpdateActivityAsync(turnContext, cancellationToken); - } -``` - ---- - -## Code sample - -## See also -[Shared channels in Microsoft Teams](/microsoftteams/shared-channels) From a507528804a768904f6b0a354c41cb19772369e1 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 08:54:26 +0530 Subject: [PATCH 14/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 1 - 1 file changed, 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index b9a6ca64227..8c0288afb9d 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -103,7 +103,6 @@ Use either `TeamsInfo.getMemberAsync` or `TeamsInfo.getPagedMembersAsync`, and c Each incoming activity for the bot includes `channelData.tenantId`. Compare this value with `membershipSource.tenantId` from the `getPagedMembersAsync` response. If the tenant IDs do not match, the user is considered as an external user. - #### Detect user type from membership data Use `TeamsInfo.getPagedMembersAsync` to retrieve membership details. From a15d6d3a0406064ffa02a9ec5ae4a2859fb8b937 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 10:03:09 +0530 Subject: [PATCH 15/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 8c0288afb9d..ca4c225fff0 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -71,7 +71,7 @@ These steps ensure the bot is active and authorized to receive notifications for ### Detect when your app is added to a channel -There’s no dedicated API to check if your app is part of a channel. Bots can detect this indirectly: +There’s no dedicated API to check if your app is part of a channel. Bots can detect when youar app is added to a channel indirectly: When your bot receives a `channelMemberAdded` event for itself in a `conversationUpdate`, your app has been added to the channel. @@ -101,7 +101,7 @@ Use either `TeamsInfo.getMemberAsync` or `TeamsInfo.getPagedMembersAsync`, and c #### Identify external users -Each incoming activity for the bot includes `channelData.tenantId`. Compare this value with `membershipSource.tenantId` from the `getPagedMembersAsync` response. If the tenant IDs do not match, the user is considered as an external user. +Each incoming activity for the bot includes `channelData.tenantId`. Compare this value with `membershipSource.tenantId` from the `getPagedMembersAsync` response. If the tenant IDs don't match, the user is considered as an external user. #### Detect user type from membership data From 9fd4d051be909937861a4eba4ad0e68c09eabcb2 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 10:15:23 +0530 Subject: [PATCH 16/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index ca4c225fff0..1234e4ba5af 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -164,7 +164,7 @@ public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnS } ``` -### Membership Changes +### Membership changes When a shared channel is added to another team, the Bot Framework might receive a `conversationUpdate` activity through the ```OnConversationUpdateActivityAsync``` method, but only if the bot is installed in the team or channel. From f85575ec506bbacdeb51fc645a1d056a442a4080 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 10:20:36 +0530 Subject: [PATCH 17/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 1234e4ba5af..5a4e7807de6 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -71,7 +71,7 @@ These steps ensure the bot is active and authorized to receive notifications for ### Detect when your app is added to a channel -There’s no dedicated API to check if your app is part of a channel. Bots can detect when youar app is added to a channel indirectly: +There’s no dedicated API to check if your app is part of a channel. Bots can detect when your app is added to a channel indirectly: When your bot receives a `channelMemberAdded` event for itself in a `conversationUpdate`, your app has been added to the channel. From 5e2ff4e0a1b6421037165a534f34907c06eb5321 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 10:25:46 +0530 Subject: [PATCH 18/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 5a4e7807de6..73ab390bbfd 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -73,7 +73,7 @@ These steps ensure the bot is active and authorized to receive notifications for There’s no dedicated API to check if your app is part of a channel. Bots can detect when your app is added to a channel indirectly: -When your bot receives a `channelMemberAdded` event for itself in a `conversationUpdate`, your app has been added to the channel. +When your bot receives a `channelMemberAdded` event for itself in a `conversationUpdate`, your app is added to the channel. Use this event to trigger app-specific logic such as: From e3c358cb44e27651f452d47a6c8d1252a02d521f Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 15:08:31 +0530 Subject: [PATCH 19/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 73ab390bbfd..b075002c541 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -92,7 +92,7 @@ When building apps or bots for Microsoft Teams, you need to distinguish between * Tailoring UI behavior based on user type (for example, hiding features for guests or external users) * Managing authentication flows in tabs or bots -### Detect user type at run time +#### Detect user type at run time You can use `aadObjectId` received in activity payloads to match the member who invoked the activity with the member list returned by `getPagedMembersAsync`. #### Identify guest users From 7b014e3a73b9d78f31aa3fb1bb6e596c825632d6 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 15:26:03 +0530 Subject: [PATCH 20/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index b075002c541..abbc68f4c42 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -164,7 +164,7 @@ public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnS } ``` -### Membership changes +### Shared or unshared with channel events When a shared channel is added to another team, the Bot Framework might receive a `conversationUpdate` activity through the ```OnConversationUpdateActivityAsync``` method, but only if the bot is installed in the team or channel. From 4f0a598cf3016530a2671f4b7639258737f509b2 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Wed, 17 Sep 2025 15:28:35 +0530 Subject: [PATCH 21/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index abbc68f4c42..1dd0d4e01aa 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -164,7 +164,7 @@ public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnS } ``` -### Shared or unshared with channel events +### Shared/Unshared with Team events When a shared channel is added to another team, the Bot Framework might receive a `conversationUpdate` activity through the ```OnConversationUpdateActivityAsync``` method, but only if the bot is installed in the team or channel. From c9761878c9b76bb02dc74e6f2d85475f6fbcc32e Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Fri, 19 Sep 2025 18:14:34 +0530 Subject: [PATCH 22/23] Update bot-updates-shared-channels.md --- .../bot-updates-shared-channels.md | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 1dd0d4e01aa..89e78d39382 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -17,13 +17,13 @@ Bots must be able to distinguish between these member types to operate correctly Bots in shared channels can automate workflows, deliver notifications, and respond to user actions in real time. You can integrate bots into shared channels to streamline collaboration. -## Get member event notifications for shared channels in Microsoft Teams +## Get member event notifications for shared channels Previously, bots subscribed to member events in shared channels only received notifications for direct members added to and removed from the shared channel. Microsoft Teams now supports bot notifications for both direct and indirect members. This enhancement expands its Bot Framework SDK to support notifications for indirect members in shared channels. This update improves visibility into membership changes across teams, enabling bots to more effectively track user access in collaborative environments. It builds on the existing capability for bots to subscribe to `conversationUpdate` events in channels. -With this enhancement, bots now also receive events for indirect members, who gain access through: +With this enhancement, bots now receive events for indirect members who gain acces through: * Membership in a team that the channel is shared with * Updates to the team’s roster @@ -33,16 +33,16 @@ To receive `conversationUpdate` event notifications when indirect members are ad 1. Update the App manifest - To declare support for shared channels, add the `supportedChannelTypes` property to your app manifest: + To declare support for shared channels, add the `supportedChannelTypes` property to your app manifest: ```JSON "supportedChannelTypes": [ "sharedChannels", ] ``` -2. Resource-Specific Consent (RSC) permission +2. Request Resource-Specific Consent (RSC) permission -Your app must request the following RSC permission to access channel membership information: + Your app must request the following RSC permission to access channel membership information: ```json { @@ -61,17 +61,14 @@ Your app must request the following RSC permission to access channel membership 3. Ensure the bot is enabled in the shared channel -To receive member event notifications: + To receive member event notifications, install the bot at the team level and manually allow it in the shared channel. -1. Install the bot at the team level. -2. Manually allow the bot in each shared channel. + This ensures the bot is active and authorized to receive notifications for both direct and indirect members. -These steps ensure the bot is active and authorized to receive notifications for both direct and indirect members. +### Verify app addition to a channel -### Detect when your app is added to a channel - -There’s no dedicated API to check if your app is part of a channel. Bots can detect when your app is added to a channel indirectly: +There’s no dedicated API to check if your app is part of a channel. Bots can detect when your app is added to a channel indirectly. When your bot receives a `channelMemberAdded` event for itself in a `conversationUpdate`, your app is added to the channel. @@ -164,7 +161,7 @@ public async Task OnMembersRemovedAsync(ITurnContext turnContext, AppState turnS } ``` -### Shared/Unshared with Team events +### Shared and unshared with team events When a shared channel is added to another team, the Bot Framework might receive a `conversationUpdate` activity through the ```OnConversationUpdateActivityAsync``` method, but only if the bot is installed in the team or channel. From ebbf1d3f1f2d68b5b3bbecd4a17abf3bb5faf792 Mon Sep 17 00:00:00 2001 From: v-shgarcha Date: Fri, 19 Sep 2025 18:19:59 +0530 Subject: [PATCH 23/23] Update bot-updates-shared-channels.md --- .../concepts/build-and-test/bot-updates-shared-channels.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md index 89e78d39382..9265ba7f532 100644 --- a/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md +++ b/msteams-platform/concepts/build-and-test/bot-updates-shared-channels.md @@ -23,7 +23,7 @@ Previously, bots subscribed to member events in shared channels only received no Microsoft Teams now supports bot notifications for both direct and indirect members. This enhancement expands its Bot Framework SDK to support notifications for indirect members in shared channels. This update improves visibility into membership changes across teams, enabling bots to more effectively track user access in collaborative environments. It builds on the existing capability for bots to subscribe to `conversationUpdate` events in channels. -With this enhancement, bots now receive events for indirect members who gain acces through: +With this enhancement, bots now receive events for indirect members who gain access through: * Membership in a team that the channel is shared with * Updates to the team’s roster @@ -64,7 +64,7 @@ To receive `conversationUpdate` event notifications when indirect members are ad To receive member event notifications, install the bot at the team level and manually allow it in the shared channel. - This ensures the bot is active and authorized to receive notifications for both direct and indirect members. + This process ensures the bot is active and authorized to receive notifications for both direct and indirect members. ### Verify app addition to a channel