OK before I start, a word of warning, Power Automate is powerful!  I had a few "issues" with cancelling my meetings when I was building this workflow... don't test in production kids...

The challenge

I'm setting up a few events and webinars at work at the moment and wanted an easy way for people to register.  Because we're likely to have a larger audience with presenters from outside the company, I'd like to use Zoom to run these (rather than Teams).  Since I don't have a webinar enabled Zoom account, I didn't have an easy way to create a registration process that would automate sending invitations, so I set out to try to solve this with Office 365 tools.

There was an easy way to solve this problem (get hold of a webinar Zoom account) but it was a great excuse to learn a little about some of the capabilities available off the shelf these days.

Ingredients

Required

Microsoft Forms - Easily create surveys, quizzes, and polls.
Easily create surveys and polls to collect customer feedback, measure employee satisfaction, and organize team events. Quickly create quizzes to measure student knowledge, evaluate class progress, and focus on subjects that need improvement. Microsoft Forms automatically provides charts to visualize…
Power Automate | Microsoft Power Platform
Easily create automated workflows with Microsoft Power Automate, previously Microsoft Flow, to improve productivity with business process automation
Outlook – free personal email and calendar from Microsoft
Get free Outlook email and calendar, plus Office Online apps like Word, Excel and PowerPoint. Sign in to access your Outlook, Hotmail or Live email account.

Optional

Video Conferencing, Cloud Phone, Webinars, Chat, Virtual Events | Zoom
Zoom’s secure, reliable video platform powers all of your communication needs, including meetings, chat, phone, webinars, and online events.

Method

Before you can do anything, you'll need to have, and be signed into, an O365 account.

1. Create a form

Microsoft Form

I went as minimalist as I could here for an improved UX (user experience).  One field, with a required check box, so that I match the data (the exact name of the event is important for following steps) and filter on later.  The name of the field in the screenshot is "Session", which is important for the Power Automate step.

My form requires an authenticated user within our corporate domain so their name and email address is captured automatically.  I also tested adding fields that required a user to complete their email address (so I could use test users) with no problem, I'll point out where you would use that in the steps below.

2. Create a Zoom call (optional)

Zoom call

This is optional, because you could use any meeting invitation, for example a Teams call would provide the same end result.  However, it created a need for more data, which I added to the subject of the meeting invitation, and set to the same time and duration as the Outlook calendar event.

3. Create a Outlook calendar event

Outlook calendar event

You'll notice that I created a new calendar called "Events" and at the top I have circled the warning that this isn't my primary calendar.  This is helpful for me for administering my calendar, but if you're using a Teams meetings it can be a problem as it doesn't show up in the Teams app.

I've made the name of the event exactly the same as the field in the form and the timing of the event the same as the Zoom call.  In the body of the invitation I have copied the Zoom call details (though I have redacted it in the image).

4. Create a Power Automate flow

So this is where the magic happens.  If you've never used Power Automate (I hadn't), it's a bit like If This Then That on steroids.  I think the old name for it, flow, is probably better too...  it's helpful to have in mind that this is just that, a flow, with data passed in at the top, passing through a series of steps to, to a final action at the bottom.

Step 1

Step 1, above, doesn't do much more that pass the form data into the automation flow, getting the response data when a submission is made.

Step 2

Step 2, above, gets all the events from the "Events" calendar I made specifically for this task.  I then had to perform a data operation, creating a filter to extract only the event which matched the "Session" value from the form data in Step 1.  This is why keeping the Subject of the email and the session the same is helpful in this simple example.

Step 3

Now I have filtered the event that I want, step 3 shows selecting the "Body" that has passed through the filter.  Then, using the "Compose" data operation I assign "Start time" and "End time" to 2 output variables that I have renamed "Start" and "End" respectively.

Select the "Body" that has been filtered

The screenshot above shows that there are 2 "Body" fields, make sure you select the "Filter array" one... if you select the data from "Get events" you'll effectively negate the all the data operations that have been performed so far.

Composing the Start and End output variables

We need to pull the Start and End time out like this so we can apply a fix to a time zone issue I was having.  During testing, when I submitted my form response, the British Summer Time (BST) time zone wasn't honoured and my event time would be changed to UTC by Power Automate (losing one hour).

Step 4

Step 4 updates the event in my calendar.  When testing, I found I couldn't leave any fields empty of the invitation content would be erased.  So using the filtered data, I effectively added the filtered data back into the invitation.  By adding the "Responders' Email" to the "Optional attendees" field (separated by a semi-colon), the email of person who submitted the form is appended to the invitation and outlook then sends it to them.

addHours to fix UTC vs BST time zone issue

The "Start time" and "End time" fields are the final piece of the puzzle.  You may not encounter this problem since it relates to British Summer Time in my case, but if you do need to, here are the expressions used for each of the fields.

addHours(outputs('Start'),1)
Start Time
addHours(outputs('End'),1)
End Time

The addHours function calls the "Start" or "End" output from step 3, and adds 1 hour to it.

I hope this was a helpful post, please leave a comment if you have any questions.