“I really don’t enjoy scheduling meetings, can I delegate this work to Power Automate – to find free time for everyone and schedule a Teams meeting?”
One of the benefits of Power Automate is to get rid of the boring work. A work that everyone could do, that doesn’t need your skills yet it consumes your valuable time. And one of such tasks is scheduling meetings. It’s not exactly rocket science to find a free time slot for all attendees and send an invitation… Why not let the flow to do the work? To find the first available time slot and send the invite?
Building the flow
Such flow will need 4 pieces of information: attendees, title, description, and duration.
Start from the manually triggered flow (which can be started even on mobile phones) and define the inputs. Alternatively you could start the flow also from Teams, but that’s another topic.
The next step is to find the meeting time. Power Automate has a dedicated action called ‘Find meeting times’ that’ll do what you might expect – it’ll find the time slots where all attendees are free.
Use the entered Attendees as Required attendees, Duration as the Meeting duration, and expressions as range for the Start time and End time. In this example it’ll look for the first available time slot, earliest on tomorrow, latest in 30 days. Since it’s looking only for 1 candidate, the end time doesn’t really matter, it should be just far enough in the future to find at least 1 potential date.
Start time: startOfDay(addDays(utcNow(),1))
End time: addDays(utcNow(),30)
Now, when you have the available time slot, you can schedule the meeting with the ‘Create a Teams meeting’ action. Use the Title as the meeting Subject, the Description as the meeting Message, and the Attendees as Required attendees.
The tricky part comes with the Start and End time. As Outlook keeps all the dates and times in UTC time zone, you can’t use the proposed times directly. You must convert them to your local time zone first.
In the example below I used also the first(…) expression to get rid of an ‘Apply to each’.
Start time:
ConvertTimeZone(first(outputs('Find_meeting_times_(V2)')?['body/meetingTimeSuggestions'])?['meetingTimeSlot/start/dateTime'], 'UTC', 'Central European Standard Time')
End time:
ConvertTimeZone(first(outputs('Find_meeting_times_(V2)')?['body/meetingTimeSuggestions'])?['meetingTimeSlot/end/dateTime'], 'UTC', 'Central European Standard Time')
The last step should be to send yourself a notification about the meeting date. Since you’re the organiser you won’t receive any invitation – it will appear in your calendar, but if you want the information also in another form you must send it in the flow.
Summary
As you can see, you can automate even small tasks in Power Automate, e.g. to schedule a Teams meeting. Not only will it save a few clicks, but it’ll save also the decisions related to meeting planning. It’ll take the first available time slot and send the meeting, not considering other time slots to be “better”.
But with that comes also a downside – it’ll pick any free time slot within the user’s working hours. If it’s not in the calendar, it doesn’t exist and the user is available, even during lunch time.
The solution can also be used only in your organisation as you can’t search in calendars of external users.
Hello there! Great work! Can you please show how to maybe set the earliest time that it searches for openings beginning at like 9 or 10am, instead of 8am/start of day? I believe StartofHour.
Hello Mike,
it depends on the Outlook calendar settings, in Settings -> Calendar -> View you can define your Meeting hours.
Is there anyway to have this where you can manually select a date and time? Have been trying for a while but is driving me absolutely mad,
Hello Scott,
you can extend the inputs of the trigger action, but unfortunately it’ll allow you to add only Date input so the time would have to be a text input. That makes it a bit problematic as you’d have to use some fixed format for the time to be able to put the Date+time together to create a valid date. I don’t think it’d be a reliable solution.
I don’t seem to have the option of inserting the ‘attendees’ item in the Find Meeting Times field, I get a drop down list of Dynamic Content, including ‘user name’ , ‘user email’ (i.e. the mail address of the user who triggered the flow_) and list of other stuff like ‘City’, ‘state’, ‘latitude’, etc. but not ‘attendees’ . Also for duration , the ‘duration’ item doesn’t appear in my drop down menu
Hello Hamid,
the ‘Attendees’ value is a parameter entered in the trigger – when the flow is started it’ll ask the user to enter the attendees. The same goes for the ‘Duration’
Does this work when there is 3+ attendees in all different time zones?
Hello Q,
I didn’t try that, but I think it should as it’s using the working hours that every user defines in their own Outlook settings.
Hi Tom,
Great post. I have a related question. Whenever I run my flow only specifying the meeting duration it works just fine. But, I need my flow to book an appointment from 15 to 17. So I need it to check the availability of the users from 15 to 17 everyday in order for it to bring me the day that the most users can attend.
These are my actual parameters:
{
“body/MaxCandidates”: 3,
“body/MinimumAttendeePercentage”: “50”,
“body/IsOrganizerOptional”: true,
“body/ActivityDomain”: “Work”,
“body/RequiredAttendees”: “xxxxxxxx”,
“body/MeetingDuration”: 119,
“body/Start”: “15:00”,
“body/End”: “17:00”
}
My problem comes with this error:
{
“@odata.context”: “https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.meetingTimeSuggestionsResult”,
“emptySuggestionsReason”: “Unknown”,
“meetingTimeSuggestions”: []
}
Its not giving me any output of when to book it. Before it gave me an error saying that it was because the organizar didnt have availability which was incorrect.
How do you recommend me to solve this problem?
THANK YOU SO MUCH FOR YOUR HELP.
Could you please let me know how can I draft an expression for Start time and end time in Find Meeting times between Monday to Friday only and that also morning 9 AM to 5 PM