It would appear that the standard actions for Events in Power Automate will send your attendees an email each time a new attendee is added or updated. In addition to this, attendees are visible to all. Using the Graph API and the Update Event call it is possible to add attendees without notifying others. It is also possible to hide all other attendees from each other.
I’ve previously blogged about managing events using Microsoft Forms. Put simply, enable users to register for a specific event using Microsoft Forms and Power Automate. But unfortunately this resulted in all attendees receiving an update when someone new completed the form. If you combine this blog with my solution above or watch my video on my YouTube, you can build yourself a very handy event registration system using Power Automate.
Hiding Attendees
The first challenge is to hide attendees. This can be run either as soon as a new event has been created OR each time a new attendee is added. There doesn’t appear to be a side effect of doing the latter. It’s one action, using the graph connector Send an HTTP request. Note that I have a compose containing the Event ID to simplify the URL in all of the following actions.
In order to hide the attendees, we must set the parameter hideAttendees to true. By default this is set to false on any new event. When I view the event in my personal calendar as an attendee, I can only see my own attendance. As the event organiser I can see the status of all individuals invited and I will continue to get updates when users accept or reject.
Adding new attendees to an event using the API
First of all, we need to send an HTTP request to GET the details of the existing event. This includes a response with the existing attendees. According to the documentation, if we then send a request to update the attendees, only those that have been added will get an email and this is certainly my experience during testing – unlike the native Outlook Connector experience.
We then need to create a new array that includes an object for a new attendee. We can specify if they are required or optional and of course their email address. I have built this using a compose action. The Microsoft documentation has further details and examples of settings that you could consider updating using this endpoint.
Now that we have the new attendee in an array, we need to merge the existing attendees with the new one. We can do this with the union expression. **Note** that I have retrieved the Attendees array by extending the default expression for the body of the HTTP request with ?[‘attendees’]. We then must place this into an Attendees object. Using a compose, we can insert the object squirly brackets {} insert the key “Attendees” and use the union expression below to join the existing and new attendee.
union(outputs('Send_an_HTTP_request_Get_Attendees')?['body']?['attendees'],outputs('Compose_New_Attendee'))
Finally we can PATCH the updated attendee object back to the event. This will ensure that the new attendee is added and sent an email, existing attendees will not receive an email and if you have implemented the hideAttendees parameter, they won’t see how many other users are attending the event.
I would love to hear if this solution has worked for you? Have you previously encountered this issue yourself in your own development? Let me know in the comments below.
Thank you for sharing this! Seams to work as promised. I modified it a lot but the direct API calls are working like we all would expect the “update event” would work in the first place! Version 3 and still unusable. MS what are you thinking? Is anybody @ ms using their stuff?
I am receiving this error on the first HTTP Request
{
“error”: {
“code”: “ErrorItemNotFound”,
“message”: “The specified object was not found in the store.”,
“innerError”: {
“date”: “2022-12-12T21:12:49”,
“request-id”: “ce3dc0ba-e0d2-48ba-9ffe-d40a81d113c6”,
“client-request-id”: “ce3dc0ba-e0d2-48ba-9ffe——–”
}
}
}
I honestly don’t know what would cause that. One for the forum. A similar issue has been discussed here https://powerusers.microsoft.com/t5/Building-Flows/The-specified-object-was-not-found-in-the-store/td-p/550838. Permissions? Is it a shared mailbox? If you find a solution, please share. Thanks
Estou com o mesmo problema, conseguiram resolver?
Are you creating this flow in addition to the original flow that took the Microsoft Form response and put the event in the attendee’s calendar? Or is this flow integrated into that flow? If the former, I assume I’d have to do a flow for each of the events in the Form. If the later, where am I integrating the new steps into the original flow?
The actions, compose etc to Graph API replace the single “Update Event” action in the original solution. I hope that helps.
Hi, could you maybe elaborate this answer.
I’m not sure where to add the ‘manually trigger the flow’ into the original flow.
When you say replace the single ‘update event’ action in the original solution, do I then delete the ‘update event’ action in the original solution and replace it with this flow?
Sorry I’m very new to this, and I’m not sure how to integrate the two flows
Works really smooth!
I would like to use this approach and adding an array of invited persons (>1000) to the meeting. Did anyone experienced any limitations with this approach? Would be great if you could post something about that.
Thanks again for the great post!
Were you able to ever figure this one out? I’ve been using this flow but am encountering issues when trying to add multiple persons to the event nearly simultaneously (I have a SP list where a column is marked Yes and the person gets added – it will get roughly half each time but others are appearing to be added and then removed as there is a canceled email in my sent box).
Hi Kate, by neatly simultaneously, do you mean running flows at the same time? Have you turned off the concurrency of your trigger to prevent the api call running in parallel? Alternatively on the docs https://learn.microsoft.com/en-us/graph/api/event-update?view=graph-rest-1.0&tabs=http there is a mention of a 500 limit? Not sure if that could be it?
You do need to make sure the flows don’t run concurrently e.g. person F fills in the form. The flow gets the existing event attendees ABCDE and prepares to patch person F. During this step, person G registers and the flow gets the registrants (before the previous patch is completed). It also retrieves ABCDE and patches G. The new list of attendees is ABCDEG. Person F is skipped.
Agreed Andrew, this is highlighted in my original post, turn off concurrency on the trigger for this very reason.
Does this work if the event organizer is another user I see it’s not working in that scenario. Are any specific settings to be done?
Hi, you could explore the application permissions. I’ve not tried this myself. https://learn.microsoft.com/en-us/graph/api/event-update?view=graph-rest-1.0&tabs=http#permissions
Hi Damon (Great Stuff) but I am getting an error on the ‘Union’ thus ….
Unable to process template language expressions in action ‘Compose_Attendees’ inputs at line ‘0’ and column ‘0’: ‘The template language expression ‘union(outputs(‘Send_an_HTTP_request_Get_Attendees’)?[‘body’]?[‘attendees’],outputs(‘Compose_New_Attendee’))’ cannot be evaluated because property ‘body’ cannot be selected. Array elements can only be selected using an integer index. Please see https://aka.ms/logicexpressions for usage details.’.
Any ideas?
Cheers Nigel
Hi, I am getting the same error – does anyone have any ideas?
Can you add a new compose with the expression outputs(‘Send_an_HTTP_request_Get_Attendees’)?[‘body’]?[‘attendees’] – does it return any data? If no, take a look at the output history of the HTTP Request, can you see the body and attendees array [ ] ?
Hi,
first of all, thanks a lot for this post! Unfortunately I do run into some kind of weird problem I don’t quite understand.
Because I use German as browser language my steps look a bit different but all in all it should be the same but let’s get to the problem:
this is how my PATCH entry looks like:
“parameters”: {
“Uri”: “https://graph.microsoft.com/v1.0/me/events/AAMkADhmZjBlYmNlLTZlN2YtNDc2Ny1hNzc1LWViYjA5OGZiMGQxNABGAAAAAABBdIzwIJg2Tr6RJZbggparBwCJ4uhZHsrTQ43c52U6ec45AAUje_zrAACJ4uhZHsrTQ43c52U6ec45AAUlu37iAAA=”,
“Method”: “PATCH”,
“Body”: {
“Attendees”: [
{
“type”: “required”,
“status”: {
“response”: “none”,
“time”: “0001-01-01T00:00:00Z”
},
“emailAddress”: {
“name”: “XXXXXXXXXX”,
“address”: “old attendee”
}
},
{
“type”: “required”,
“status”: {
“response”: “none”,
“time”: “0001-01-01T00:00:00Z”
},
“emailAddress”: {
“name”: “XXXX”,
“address”: “old attendee”
}
},
{
“type”: “required”,
“emailAddress”: {
“address”: “new attendee”
}
}
]
},
“ContentType”: “application/json”
}
}
But in the HTTP response the new attendee is nowhere to be seen:
“attendees”: [
{
“type”: “required”,
“status”: {
“response”: “none”,
“time”: “0001-01-01T00:00:00Z”
},
“emailAddress”: {
“name”: “XXXXXXX”,
“address”: “old attendee”
}
},
{
“type”: “required”,
“status”: {
“response”: “none”,
“time”: “0001-01-01T00:00:00Z”
},
“emailAddress”: {
“name”: “XXXXXXXX”,
“address”: “old attendee”
}
}
],
“organizer”: {
“emailAddress”: {
“name”: “XXXXXX”,
“address”: “XXXXX”
}
},
How come?
I am having this same issue. Any luck?
Same issue, action is successful but nothing changes. Did you have any luck?
I’ve been trying this approach, but finding instances where the email invitation is received with no Response Required, despite the meeting having responseRequired:true. Also sometimes the Accept/Decline buttons visible, but no dropdowns to edit the response, and info message says no response required. I even got a case where it showed I’d accepted with a time before the invite was sent. Works ok with MS365 emails but others like gmail seem buggy. So close, but yet….
Hello! I am following the directions as you prescribe, but it gets stuck on the ‘Send an HTTP request Get Attendees’ step. The error details are:
Error Details
URI path is not a valid Graph endpoint, path is neither absolute nor relative or resource/object is not supported for this connector. Resources: groups. Uri: https://graph.microsoft.com/v1.0/me/events/AAMkADYwN2ZmNTRiLTJjMzgtNDM0Mi1iOWJmLTlhMzhmYzZiNjhhMQBGAAAAAABjSsSd0agBS7aE38CW7kXOBwC6ZZbKSAVHR5RjNBPjPZGMAAKV-rPrAAC6ZZbKSAVHR5RjNBPjPZGMAAK0GL4_AAA=?$select=subject,body,bodyPreview,organizer,attendees,start,end,location,hideAttendees
And suggestions as to what may be the cause of this failure? Appreciate any insight you can lend. I greatly enjoy your videos.
Replace the Groups HTTP Request with Outlook HTTP Requests
I would reverse your images above with Compose New Attendee and the HTTP Request Get Attendees.
I don’t understand your logic / request? Can you explain?
Thank you so much for sharing this! Question 1: Does the “Compose Event ID” relate specifically to this particular “event” where a given user is getting added to the invitation list/invited, and not to the calendar event ID? Question 2: Do you think this flow could apply to updating an event that was originally generated in a Team? I need to build a flow that would add an attendee to a meeting that was previously set up in Teams and send it to the user when they select an item in a SharePoint list.
I am trying to pull out list of all attendees along with their response (Accepted/Rejected/None). I am using the exact similar way as you showed in this video. The strange part is that the HTTP request is returning data when testing in Graph API explorer, but the exact same request gives below error when executed via ‘Send an HTTP Request v2’ connector in automate.
Does someone know the possible reason or fix for this? Or is there another way to achieve my requirement?
‘”error”: {
“code”: 400,
“message”: “URI path is not a valid Graph endpoint, path is neither absolute nor relative or resource/object is not supported for this connector. Resources: groups. Uri: https://graph.microsoft.com/v1.0/me/events/AAMkADhlYTU3ZDE1LTNlMmMtNGJhYi1hMzYxLTIxMDY0MjMzMjI0OQBGAAAAAADEDYCYhRMzQrxOJsuZumgGBwAslNPE-unCRJGz3aMQGHSYAAAAAAENAAAslNPE-unCRJGz3aMQGHSYAAACaV8hAAA=?$select=attendees“,
“source”: “flow-apim-europe-002-northeurope-01.azure-apim.net”,
“path”: “choose[12]\\when[1]”,
“policyId”: “”,
“clientRequestId”: “89fe21bb-8ee3-455b-a04d-52ad76177749”
}
}
Hi,
Thank you so much for taking the time to put this out there.
I’ve got a Successful run but the last action “Send an HTTP request” to Update Attendees (Using the Outlook HTTP request action) lists the user account in the Input but the account isn’t receiving the invite and isn’t showing up in the event:
{
“Attendees”: [
{
“type”: “required”,
“status”: {
“response”: “none”,
“time”: “0001-01-01T00:00:00Z”
},
“emailAddress”: {
“name”: “A Name”,
“address”: “a.name@domain.co.uk”
}
},
{
“type”: “required”,
“status”: {
“response”: “none”,
“time”: “0001-01-01T00:00:00Z”
},
“emailAddress”: {
“name”: “A Name”,
“address”: “a.name@domain.co.uk”
}
},
{
“type”: “required”,
“emailAddress”: {
“address”: “dummy.account@domain.co.uk”
}
}
]
}
Just wondered if you had any insight as to why at all, please?
I am having this same issue. Did anyone ever provide an answer?
Hi there!
Using your excellent tutorial, I’ve managed to apply this to a flow that I’ve come up with. But I’m running into a small issue I hope you might be able to explain.
My flow is basically: When a new member is added to a team, add the team member as a required attendee for the channel meetings that are already planned.
I have done this by:
– Recurring: Every day at 3pm
– List group members and turn into array
– For each member in the array: apply the formatting from your tutorial for all the members in the array
– Get All Event ID’s from Group
– For each Event ID: add all the members of the group as required attendees.
Now – everything works perfectly except for one issue:
Every attendee that has already set the meeting response to accepted, receives an e-mail saying the meeting is cancelled.
My hypothesis is that this happens because I am basically adding a new list of members to the meeting, and because in the formatting there is nothing written under “response”, all these members get “Response: none”.
Do you agree with this hypothesis? And would you know a solution?
Looking forward to your reply!
This was super helpful for me for a project that I am working on. I was able to use your guidance here as well as a previous blog/video to create a form to register for training sessions. The only change that I made is I passed the series master id instead of the event id in the send http request to capture a recurring meeting that reoccurs every day for 5 days. It is sharing the meeting series but sends them to the email recipient twice, is there a way to send the whole recurring meeting series so that they only receive one invite?
Thank you for this! I used the forward event endpoint because the update event endpoint wasn’t working. But I was initially only using the ID and thus it was only sending the initial instance. Your comment made me aware of the series master ID which when I used that, the entire series was sent. Using this method, in testing, only one invite was sent.
The HTTP methods don’t seem to work for an event coming from a shared mailbox. Is there a work around?
I’m having an interesting issue with this. When I run the flow, it says successful. When I look at the input to the final Send an HTTP Request it shows the new attendee’s address, but when I look at the output, it’s not there. Did anyone resolve this issue? I even tried with the Update Event step and it ignored the new email address.