*** NOTE: ALL INFORMATION IS ACCURATE AT DATE OF PUBLISHING ***
I started writing about Microsoft Bookings in 2020, wanting to learn as much as I could and then share that insight with others. To this day, some of my most read blog posts are on the topic of Bookings and how to get the most from it. Back then, the only way to get data from Bookings was either using the Microsoft Bookings API in Microsoft Graph, or by creating some crafty little flows in Power Automate using the Outlook connector. Given my previous interest, I was excited to see Microsoft had introduced a connector for Bookings. It’s currently in Preview, but I decided to take a look and see what options it had, and if it would make much of a difference to organisations using Bookings and wanting to do a bit more with it. Rather than a step by step post on how to do something, I’ve put together a list of what I think is The Good, The Bad and The Ugly.
The Good
So what is good about the connector?
We Now Have One
Well, obviously the best thing is that one now exists. Microsoft Bookings has sat without one for years. You could use the Outlook connector and the Get events action step, but needed to know the password for the user account linked to the Bookings calendar (the user being created when the Bookings calendar gets created). It wasn’t tricky to provide a password, but it wasn’t ideal. Failing that, you needed to understand how to use an API in Microsoft Graph, which isn’t as ‘low-code friendly’ and a barrier to many people. So having the connector is AWESOME, and a massive step. We have three triggers which are when an appointment is cancelled, created or updated.
Oh, and side note, do not be put off by the trigger asking for the Bookings Business SMTP Address. For me this is misleading as it also shows, ‘this can be found in your business’s bookings page‘. It is not clear what it is at all. What it’s referring to is the email address linked to the Bookings Calendar. If you are not sure, just open up the public Bookings calendar, the link where people go to book an appointment. The email address will show inbetween calendar/ and then /bookings. Just copy and paste that to link it to your Bookings Calendar.
Ability To Access Data From Booking
Using Power Automate without this new Microsoft Bookings connector, a series of variables and steps were needed to split out data with potentially complex expressions (complex depending on your level of comfort with Power Automate) to get simple things like the customer name, email, phone number and any notes provided. Getting any custom questions and answers was even more challenging as you might not make those required so sometimes the body of the appointment contained information, sometimes it didn’t. Using the new connector, we now get access to all of the data dynamically in a clearly defined way. Appointments where only one person can book are defined in 1:1 values, where appointments that can have more than one person book the same date and time are defined in 1:N values.
Appointment Data For Attendees Greater Than One
As shown above, we can easily get data for Bookings where the number of attendees is greater than one. There are two values that get returned that could help you with your flows depending what requirements you might have. One is the Max Attendees Count, showing the number of possible people who could book a specific service at the same date, time and for the same staff member. The other is the Filled Attendees Count which is the number of attendees who have booked the appointment slot. So using those together to check and make sure an email gets sent out only when the Filled Attendees Count on a booking equals the Max Attendees Count on a booking could be a good way to send a final summary to the Staff Member showing them all of the people who will be attending that appointment. Could work well for group bookings if that’s something your organisation hosts.
Support Of Multi Staff Scenarios On The Way
One of the FAQs on the Microsoft Bookings connector documentation page asks why the Staff Members detail is an array when only one staff member can be assigned per booking. The answer states that in the future, Bookings will support multi staff scenarios. This might be great news for some organisations. For now it just means it’s a bit annoying to try and get the one Staff Members name if you want to include that in some kind of email notification or to update data elsewhere. It’s pretty straightforward, but does need a few steps. Here is one way to do it. Add a Parse JSON step and use the StaffMembers value from the trigger in the Content step. Then paste in the following code as the Schema.
{ "type": "array", "items": { "type": "object", "properties": { "DisplayName": { "type": "string" }, "EmailAddress": { "type": "string" } }, "required": [ "DisplayName", "EmailAddress" ] } }
Then add in a Compose step, or your Outlook Email step or wherever you want to add the Staff Members name to, and paste in this expression. We know currently you can only have 1 Staff Member, so this gets the first record returned from the Parse JSON step, and gives us the Display Name. If you wanted the email address just replace DisplayName with EmailAddress.
@{body('Parse_JSON')?[0]?['DisplayName']}
The Bad
What about the bad stuff?
No Actions Available
Sadly, no Actions are available yet. Not sure if any are on the way, but I would have liked to see the ability to get a list of appointments linked to a Bookings Calendar. That way we could send a summary of the days or weeks appointments to a staff member. Fingers crossed getting the Triggers is just the first step, and there are Actions on the way!
Only Bookings Admins Can Create Triggered Flows
As per the known issues and limitations of the trigger from the Microsoft Bookings connector documentation, only Bookings admins can create appointment triggers. This is a shame, because it’s unlikely that the Admin for a Bookings Calendar is also the same person creating the flow in Power Automate. It’s easy enough to add someone as an Administrator under the Staff section in Microsoft Bookings but it does mean an extra step each time. It might also be that a Bookings Calendar is created and it’s not something you want others accessing and potentially making changes to, so there could be potential for security challenges or issues. Using the Outlook connector and getting the events (booking appointments) does mean you can get access to the data without needing to be an Administrator of the Bookings Calendar, but then tit’s not as easy to get all of the data… so that’s not ideal either.
Only 5 Flows Per Bookings Mailbox
Also in the known issues and limitations from Microsoft is that currently you can only have 5 flows per Bookings Mailbox. So depending on your requirements, you might need to get creative and combine flows together in to one. Another consideration is that each trigger is linked up to the email address of the Bookings Calendar, so you might need multiple sets of the same flows depending on how many calendars you have.
The Ugly
So what’s not so pretty about it?
No Trigger For Create AND Update
Anyone familiar with the Dataverse connector will know we have a trigger of ‘when a row is added, modified or deleted‘ then from there you can indicate if the flow should run if something is Added, Modified, or either of those two things (among other change types). Unfortunately there is no such combined trigger for Microsoft Bookings, so you will need to have two different flows if you want to do something if either of those two things happen (see the next point for a good example).
Handling Of Multiple Attendee Bookings
So while it’s great we can get data for bookings where the maximum number of attendees is greater than 1, it’s worth noting that this means the data coming through is a little bit different for those where the max equals 1. When someone books an appointment for a service when there is a 1:1 relationship, the Customer related values are populated. When there is more than one possible a Customers array value gets populated instead. Also, keeping in mind the triggers we have, the trigger will only run the flow for the FIRST time when someone books an appointment where more than 1 person could book it. Let’s say 2 people could book the same date, time and service. John Doe books it, and the flow triggers upon creation of the bookings appointment. Jane Doe books it, and that is considered an update to the existing appointment, so the flow would not trigger. So for this we would need two flows potentially, or one flow based on update only, and only do something when the filled attendees count equals the max attendee count. Just something to keep in mind.
Lots Of Data Returned As Arrays
We’ve already looked at the Staff Members where I highlighted the one Staff Member on the booking is returned as an array. You can also see in the item above, for booking appointments where the Max Attendee Count can be greater than 1, the Customers detail is returned in an array also. Any custom questions are also then within an Answers array. So there is the potential for a lot of extra knowledge of Power Automate if you want to get the right data without getting in to a tangled web of ‘Apply to each’ steps.
Final Conclusion
I think it’s fantastic that this connector is finally here. It’s giving more options and an easier way to access the right data for an organisation to then take the necessary steps for their own requirements to extend the solution. Hopefully we see some Actions coming soon. What are your thoughts? Do you use Microsoft Bookings? Have you taken a look at the connector yet? Let me know what you think in the comments below!
Check out the latest post:
Split Your Audience By Number Or Percentage In Customer Insights - Journeys
This is just 1 of 480 articles. You can browse through all of them by going to the main blog page, or navigate through different categories to find more content you are interested in. You can also subscribe and get new blog posts emailed to you directly.
Great to see Microsoft finally rolling this out. This preview release is seriously underwhelming and needs support for custom fields without doing complex filtering. This should also NOT be a premium connector.
Agree, agree, agree!
Hi Megan! I’m new in the business and I just wanted to let you know you’ve been a wonderful help to me these past few months. Thanks a million !
Also, I’m here because of this new connector. I have a flow I’m trying to create today and as you said in your article, it seems to be quite incomplete. I will have to do some workaround and figure out a way to make it happen somehow. Hopefully, they will add some action soon!
I think it’s great that the connector is out and available, but I could have waited a few more weeks for it to be complete when it officially launches!
Thanks again!
Hi Marc, so glad my posts have been useful! I guess it depends what your requirements are if it’s complete or not. For some it might give them what they need. For me, we need a lot more and particularly we need actions. Stay tuned as I do believe more will be on the way!
Is there a supported way to update the appointment with the Dynamics 365 set regarding. This would complete the journey back into Dynamics so that the appointment was visible in Dynamics and re-schedules, etc were applied.
Hi Imbuzy2, the appointment is not a D365 Appointment, so no. You would need to add a step to create an Appointment in D365 and set that new appointments regarding field.
Hi! Have you worked out how to pull through the data from Custom Fields? I have 4 required custom fields in my bookings setup, but I can’t seem to pull these through at all.
Hi Chris, custom questions are stored with an Answers array, so you would need to parse the JSON from that. If you build out a flow and then make a booking, you should see the data come through in the output of your trigger. From there you can copy the JSON and add a Parse JSON step and work from that.
Hi Megan,
The problem is that the Bookings connector passes me the “CustomQuestionAnswers”: [] array and its ALWAYS blank. I’m viewing the data in the compose function.
The resultant calendar event has the data inside it’s (the calendar event) body however.
Any idea how to extract the Custom questions array data using the Booking connector?
Hi Dan. I just went through and ran a flow again by making a booking on an appointment with custom questions. I am seeing the same thing as you now unfortunately! Nothing getting past back any more in to the CustomQuestionAnswers. What I also notice is a disconnect between the names of things. In the initial trigger it’s passed through as CustomQuestionAnswers. Then if you select it as Dynamic content it shows as Customers Answers. Then if you use it, the array is actually called [‘Answers’]. Definitely a change there somewhere! I’ll raise it to someone at Microsoft. Sorry for any confusion Dan!
Its no longer a Premium connector but I still can’t get it to work…
Have you contacted Microsoft support, or posted on any of the widely used forums to see if someone can help? https://powerusers.microsoft.com/t5/Microsoft-Power-Automate/ct-p/MPACommunity
I attempted to use the trigger to then call get appointments/{id} graph api, but the {id} the is returned from the trigger is NOT valid {id}. If I list all the appointments the trigger {id} does not exist anywhere in the booking calendar. Further testing reveals the trigger {id} never changes. Same ID for every appointment.
Hi Paul, currently it only has 3 triggers (booking is cancelled, booking is created, booking is updated). I don’t see anything for actions that would allow you to then get a full list of appointments as the trigger would only be related to one. If you are using the Graph API, unfortunately I can’t help as I’ve never used it. Have you tried posting your question/issue here? https://powerusers.microsoft.com/t5/Microsoft-Power-Automate/ct-p/MPACommunity
Hi Megan
Very helpful post! Coming back to you for a query as you seem to be the most knowledgeable person about this connector.
I wondered if you had any idea what’s blocking my attempted flow.
I’m trying to trigger it based on a booking on my personal booking page. I grabbed the SMTP address, which is a string of alphanumeric characters @domain.name (rather than my email address – not sure if this is a clue there’s something misconfigured…).
The error message in Power Automate is
{“ErrorMessage”:”Bookings Business SMTP address not valid or staff not part of bookings calendar.”}
The SMTP address comes straight from my Bookings page URL and I have no idea why I wouldn’t be part of my own bookings calendar.
If you have any pointers, I’d gladly take them!
Hi Charlie, that I am not sure about. You might need to check with Microsoft. It’s not just the format of the email address that is different on a personal booking page, but the entire URL string.
Bookings Calendar URL – https://outlook.office365.com/owa/calendar/BOOKING-CALENDAR-NAME@meganvwalker.com/bookings/
Bookings with me URL – https://outlook.office.com/bookwithme/user/RANDOMSTRING@meganvwalker.com?anonymous&ep=plink
I looked here, and in the Before you begin section, it does state, you must provide the Bookings BUSINESS SMTP adress:
https://learn.microsoft.com/en-us/microsoft-365/bookings/power-automate-integration?view=o365-worldwide#before-you-begin
So I am guessing that is the key, likely created to work only with the business bookings calendars.
A year later and Microsoft still does NOT offer actions and still offers only 3 triggers (create, update, cancel), and still asks for the “Bookings Page”, when in fact, it should be the SMTP of the booking page. Microsoft is NOT my favorite to say it nicely.
Ah, yes, it’s certainly got some challenges and room for improvement!
Would love to see something about tracking data for a campaign so we can pass say campaign code from a PPC to know where the booking came?
Also I look but are you able to parse first and last name or put 2 custom quest answers in the same record; it is creating new records.
Hi Gus, I don’t know how you would be able to get the UTM parameters from the URL and pass in to the form as you don’t have access to add a script in to the Bookings form directly so thinking it would not be possible. For custom question answers, it feels like that is definitely not something easy to get! Not sure if that is possible at this point… but I haven’t dug in to it much further since I originally wrote the blog post.
I need to retrieve the service price when a bookings appointment is created, but I don’t see such field under Dynamic Content.
Is this possible at all?
Hi Dijana, I don’t do anything with service price so not sure. I would suggest reviewing the official documentation to see if you find anything here. https://learn.microsoft.com/en-gb/connectors/microsoftbookings/
If not, you could always post a comment on the Community Forum for Power Automate – someone there might have an answer for you: https://powerusers.microsoft.com/t5/Microsoft-Power-Automate/ct-p/MPACommunity
Hi Dijana,
any idea how to get the url for a specific appointment?
I don´t know how to get these id in the end of the url:
https://outlook.office365.com/owa/calendar/DEVBookings@xxxxx.onmicrosoft.com/bookings/iS9m9FxRF0KQ71jWyVHRUA2
It´s not the appointment id.
Is this possible now with PowerAutomate and MS Booking?
Have a custom question asking user for their manager email address.
When they create their booking, then have an automated email also go to this email address to alert their manager that they have made a booking?
Hi Paul. You would need to include steps in your flow to get the custom field response for the manager email. I’ve not looked at the connector in a while, but it used to be difficult to get the responses to those custom questions. However, you could still likely use parts of the flow I built for this post, then once you have accessed the email address you could send off an email to the manager: https://meganvwalker.com/email-daily-summary-of-bookings-using-power-automate/
Hope that helps!