A certain amount of frustration is evident in Teams users who schedule meetings and add teams as meeting attendees, only to find that the team members don’t receive individual meeting invitations. The same problem happens for channel meetings.
When you add a team as a meeting attendee (Figure 1), you add an Microsoft 365 group, and group settings dictate which (if any) of the members of that group receive meeting invitations. Creating a channel meeting adds the meeting to the group calendar, but team members don’t receive invitations unless they are explicitly added as a meeting participant.
Figure 1: Scheduling a Teams meeting with Microsoft 365 Groups
As I explain in this post, the reason why this happens is due to the way Teams manages members of the Microsoft 365 group. Basically, Teams adds members to the membership list, which you expect, but it does not add the members to the group’s subscriber list. Because they are not subscribers, members do not receive copies of messages (like calendar events) sent to the group. There’s a lack of joined-up thinking between Teams and Microsoft 365 groups on this point that might be due to the fact that Groups were originally designed to serve Outlook before Microsoft changed their primary focus to be a membership and identity service for Microsoft 365 apps.
No doubt Microsoft is busily working out how to make things better. What seems clear is that people naturally assume that if they schedule a meeting with a team, the members of the team should receive invitations. This stance is eminently reasonable, even if it’s not currently implemented in Teams.
Scripting a Solution
What can you do about this? Well, as suggested in a response to Teams User Voice, you (in reality, a tenant administrator) can update group settings to automatically subscribe new users to receive event notifications and add existing users to the group’s subscriber list. Justin Horne contributed a script to do the job. I’ve taken the liberty of updating the script by:
Only process Microsoft 365 Groups enabled for Teams. Then filter to find the groups where members are not auto-subscribed or where members are not auto-subscribed to calendar events.
Update group settings to auto-subscribe new members to receive calendar events like meeting notifications. Note: guest members are always subscribed to groups.
Update the group subscriber list with existing members. You’ll see that I use the external directory object identifier to reference the group and the primary SMTP address to reference members. This is to ensure that the values are unique.
Reporting updates in a PowerShell list which is exported to a CSV file at the end of the script.
Updating subscriber lists for groups is not a swift process, so updating many groups will take time. You’ll also need to run the script on a regular basis to find and update new groups.
# UpdateSubscribersInGroupsUsedByTeams.PS1
CLS
Write-Host "Finding team-enabled Groups to process..."
$Groups = Get-UnifiedGroup -Filter {ResourceProvisioningOptions -eq "Team"} -ResultSize Unlimited
$Groups = $Groups | ? {$_.AutoSubscribeNewMembers -eq $False -Or $_.AlwaysSubscribeMembersToCalendarEvents -eq $False}
$Report = [System.Collections.Generic.List[Object]]::new() # Create output file
#initialize progress bar
$ProgDelta = 100/($Groups.count)
$CheckCount = 0 ; $GroupNumber = 0 ; CLS
ForEach ($Group in $Groups) {
$GroupNumber++
$CheckCount += $ProgDelta
$GroupStatus = "Processing " + $Group.DisplayName + " ["+ $GroupNumber +"/" + $Groups.Count + "]"
Write-Progress -Activity "Updating subscriber information for group" -Status $GroupStatus -PercentComplete $CheckCount
# Update group so that new members are added to the subscriber list and will receive calendar events
Set-UnifiedGroup -Identity $Group.ExternalDirectoryObjectId -AutoSubscribeNewMembers:$True -AlwaysSubscribeMembersToCalendarEvents
# Get current members and the subscribers list
$Members = Get-UnifiedGroupLinks -Identity $Group.ExternalDirectoryObjectId -LinkType Member
$Subscribers = Get-UnifiedGroupLinks -Identity $Group.ExternalDirectoryObjectId -LinkType Subscribers
# Check each member and if they're not in the subscriber list, add them
ForEach ($Member in $Members) {
If ($Member.ExternalDirectoryObjectId -notin $Subscribers.ExternalDirectoryObjectId) { # Not in the list
# Write-Host "Adding" $Member.PrimarySmtpAddress "as a subscriber"
Add-UnifiedGroupLinks -Identity $Group.ExternalDirectoryObjectId -LinkType Subscribers -Links $Member.PrimarySmtpAddress
$ReportLine = [PSCustomObject] @{
Group = $Group.DisplayName
Subscriber = $Member.PrimarySmtpAddress
Name = $Member.DisplayName}
$Report.Add($ReportLine) }
} #End ForEach
} #End ForEach
$Report | Export-CSV -NoTypeInformation c:\temp\SubscriberGroupUpdates.csv
Write-Host "All done. Details of updates are in c:\temp\SubscriberGroupUpdates.csv"
Remember that you’ll need to run this script periodically to update newly created teams. Alternatively, use a script to create teams and include the necessary code to update the group for each team. Also, while some team members will like to receive invitations for channel meetings, others will hate the idea. Be prepared to remove these users from the group’s subscribers list to stop them receiving invitations. You can do this by running the Remove-UnifiedGroupLinks cmdlet. For example, this command removes an account from a group’s subscribers list.
Remove-UnfiedGroupLinks -Identity "Group to Remove User from" -LinkType Subscriber -Links John.Smith@office365itpros.com
Optional and Required Attendees
Team members who receive invitations sent to channel meetings because they are subscribed to the group for calendar events are considered optional attendees. This is because they are not included in the set of required attendees and effectively only learn about the meeting because they are subscribers. If you want team members to be required attendees, you need to schedule a personal meeting and invite the team.
Describing solutions to problems in Office 365 tenants is what the Office 365 for IT Pros eBook is all about. Subscribe to support our project and allow us to continue helping people to probe the dark corners of Office 365.
Hi, sounds interesting. But even after setting this for a group via
Set-UnifiedGroup -Identity “My Group” -AutoSubscribeNewMembers:$True -AlwaysSubscribeMembersToCalendarEvents
the box for “send copies of group conversations and events to group members” is not ticked.
Do these settings have the same meaning? It seems that hte box cannot be set through Set-UnifiedGroup…
Thanks!
You need to use Get-UnifiedGroupLinks -Id “My Group” -LinkType Subscribers to check if any users are subscribed to the group. If they are, run Remove-UnifiedGroupLinks to remove each user.
Not sure if we are talking about the same thing.
In the exchange admin center, I have three settings for a M365 group:
o Allow external senders to email this group
x send copies of group conversations and events to group member
x Hide from my organization’s address list
Getting the third option set is easy (-HiddenFromAddressListsEnabled:$True).
I I understand correctly
-AutoSubscribeNewMembers:$True -AlwaysSubscribeMembersToCalendarEvents
does what the second option means.
But the box will not be checked. Is that what you mean, that subscriptions have to be reset for it to appear checked?
Loading...
All of those points are valid, but what I think is happening is that some of the users have been automatically added to the group’s subscriber list and therefore receive updates, including calendar invitations, sent to the group. This often happens for older Teams.
Loading...
I am having the same issue currently where we want to find the code to automate this did you find the exact code to do this as i am very new to powershell i have as i have used all these commands like yourself and nothing seems to tick that box
Nope. haven’t found a way. We will probably let the script run periodically.
Loading...
This is absolutely brilliant. We found out about the -AlwaysSubscribeMembersToCalendarEvents setting in order to get rid of the channel meeting spam, so we could consoladate meetings recordings into the channel onedrive site. However we had no way to understand or administrate this on a per user level. Some googling led me here and gave me the tools to complete the puzzle, we now have a viable way forward to get users off of streams recordings! Thank you so much for this post!
Tony wrote on 21 October 2020 “No doubt Microsoft is busily working out how to make things better.” Does anyone have any inkling as to whether Microsoft is getting anywhere with this? My concern is that if l produce a whole raft of “work-around” user guidance then at the point I publish that guidance Microsoft will release some updates resolving the issues – rendering my work unnecessary.
Tony also wrote: “If you want team members to be required attendees, you need to schedule a personal meeting and invite the team.” I think by “personal meeting” you mean a standalone (non-channel) meeting. This breaks the scenario for a Teams channel meeting where all the meeting content is attached to the channel (e.g. meeting side-chat and meeting recording file). In a standalone/personal meeting the meeting-chat and recording is owned by the meeting organiser and so potentially lost to team members if the meeting organiser leaves the organisation. I’m afraid that currently I advise people to add all the Team members individually to the channel meeting (or use the @ mention team message and get the team members to add the meeting themselves)
How can I do if i only want a sub-group of my team members to join a meeting in a channel? when i create the meeting through the channel, everyone in the Team gets a notification or gets it in their calendars, but i want only a few people of the group to be part of that meeting.
Tony you wrote on 21 October 2020 “No doubt Microsoft is busily working out how to make things better.” Did Microsoft make things better regarding this functionality? It would be good if there was a Teams owner level option on the user interface to opt-in everyone to receive channel meeting invites even if previously they were opted out.
It’s technically possible, but you would have to write some code to read the calendar events from the group calendar and add the new member as a participant.
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
Hi, sounds interesting. But even after setting this for a group via
Set-UnifiedGroup -Identity “My Group” -AutoSubscribeNewMembers:$True -AlwaysSubscribeMembersToCalendarEvents
the box for “send copies of group conversations and events to group members” is not ticked.
Do these settings have the same meaning? It seems that hte box cannot be set through Set-UnifiedGroup…
Thanks!
You need to use Get-UnifiedGroupLinks -Id “My Group” -LinkType Subscribers to check if any users are subscribed to the group. If they are, run Remove-UnifiedGroupLinks to remove each user.
Not sure if we are talking about the same thing.
In the exchange admin center, I have three settings for a M365 group:
o Allow external senders to email this group
x send copies of group conversations and events to group member
x Hide from my organization’s address list
Getting the third option set is easy (-HiddenFromAddressListsEnabled:$True).
I I understand correctly
-AutoSubscribeNewMembers:$True -AlwaysSubscribeMembersToCalendarEvents
does what the second option means.
But the box will not be checked. Is that what you mean, that subscriptions have to be reset for it to appear checked?
All of those points are valid, but what I think is happening is that some of the users have been automatically added to the group’s subscriber list and therefore receive updates, including calendar invitations, sent to the group. This often happens for older Teams.
I am having the same issue currently where we want to find the code to automate this did you find the exact code to do this as i am very new to powershell i have as i have used all these commands like yourself and nothing seems to tick that box
Nope. haven’t found a way. We will probably let the script run periodically.
This is absolutely brilliant. We found out about the -AlwaysSubscribeMembersToCalendarEvents setting in order to get rid of the channel meeting spam, so we could consoladate meetings recordings into the channel onedrive site. However we had no way to understand or administrate this on a per user level. Some googling led me here and gave me the tools to complete the puzzle, we now have a viable way forward to get users off of streams recordings! Thank you so much for this post!
Tony wrote on 21 October 2020 “No doubt Microsoft is busily working out how to make things better.” Does anyone have any inkling as to whether Microsoft is getting anywhere with this? My concern is that if l produce a whole raft of “work-around” user guidance then at the point I publish that guidance Microsoft will release some updates resolving the issues – rendering my work unnecessary.
Tony also wrote: “If you want team members to be required attendees, you need to schedule a personal meeting and invite the team.” I think by “personal meeting” you mean a standalone (non-channel) meeting. This breaks the scenario for a Teams channel meeting where all the meeting content is attached to the channel (e.g. meeting side-chat and meeting recording file). In a standalone/personal meeting the meeting-chat and recording is owned by the meeting organiser and so potentially lost to team members if the meeting organiser leaves the organisation. I’m afraid that currently I advise people to add all the Team members individually to the channel meeting (or use the @ mention team message and get the team members to add the meeting themselves)
Yes, a personal meeting is a standalone meeting organized by an individual who controls who attends the meeting.
How can I do if i only want a sub-group of my team members to join a meeting in a channel? when i create the meeting through the channel, everyone in the Team gets a notification or gets it in their calendars, but i want only a few people of the group to be part of that meeting.
It sounds like you want to organize a personal meeting rather than a channel meeting. By design, a channel meeting is available to everyone.
Tony you wrote on 21 October 2020 “No doubt Microsoft is busily working out how to make things better.” Did Microsoft make things better regarding this functionality? It would be good if there was a Teams owner level option on the user interface to opt-in everyone to receive channel meeting invites even if previously they were opted out.
AFAIK, the functionality remains the same as it ever was.
How can i set it so that when i add a new member to a group any existing 365 group meetings are added to their calendar.
It’s technically possible, but you would have to write some code to read the calendar events from the group calendar and add the new member as a participant.