Add New or Update Event on Outlook Calendar from Google Calendar

Hello all!
On Zapier this is very easy, but on Make I haven’t been able to achieve it. I need to create a new event on Outlook Calendar every time a new event is created on Google Calendar. Also if an existing event is updated on Google Calendar, it should update Outlook Calendar’s equivalent.
I don’t need this to work backwards from Outlook to Google. ONLY from Google to Outlook.

This is what I’ve been trying but I must have the parameters wrong:

Thanks in advance!

Hi @WaltLlanos ,

Can you please be more specific about what the issue is you are experiencing?

What is going wrong and how did you set the filters? Is your scenario triggered when you add something to your calendar? The more detail you can provide, the higher the chance we can help you. :slight_smile:

Glenn - Callinetic

Hi Glenn!
Thanks for taking the time to reply!
Let me explain my scenario a bit more:

  1. I use a “watch” module for Google Calendar so Make is checking every X hours if there’s a new event in Google Calendar or if something was updated. (I put a limit of 1000, but honestly this was random. I guess the number I write here is the amount of recent events Make will monitor?)

  2. Then I link it to a “search” module with Outlook Calendar to have information that can be crossed referenced with the info gathered from Google Calendar in the previous step. (Again, a 1000 limit)

  3. Here I add a Router module and noticed that maybe analyzing 1000 pieces of info form the previous steps was too much since I don’t update the calendars too often, so here I added a filter that only uses 10 events from the calendar, by using the condition “Bundle order position” with a numeric operator less than or equal to 10.

At this point what I think I’ve done is constantly watch the last 1000 entries from Google, then get info from the last 1000 entries from Outlook and then take into account only the last 10 of each.

  1. The router will check if the Google Calendar event exists among the 10 entries from Outlook Calendar or doesn’t and then weather update it or create a new one. I try to do this by linking it to two Outlook Calendar modules, one with a “create an event” action, and the other one with an “update an event” action.

The way I think Make can identify a match is by checking the name of the event, because I noticed that’s the only shared thing both events will have. To do this, I add a filter to each link with a condition of “Text operator: Equal” or “Not Equal” and I compare Google Calendar’s “Summary” to Outlook Calendar’s “Subject” (That’s how each one calles their events)

(EDIT: I see the “Exists” filter picture is showing a “Datetime operator” instead of a “Text operator” but that was because before writing this post I tried editing a few things and forgot to put it back. When I ran the tests I’m sure it was a “Text operator”)

At this point Make should either find a match and UPDATE the event; or don’t find a match and CREATE an event.

I think it kind of worked, but it was creating a huge bunch of events (like 200+ on a said day) and I had that calendar synced with my client whom immediately asked me what was happening.

So obviously I turned the automation off and only up until now I’m trying to figure it out.

1 Like

Thanks for the explanation @WaltLlanos ,

Certainly, there are some improvements you can make to the scenario.
First of all, if you want to work with only 10 events, then set the limit of the watcher to 10. You can remove your first filter as well.
You’re having trouble with duplicates in the calendar because of the way you’ve set the filter condition. It will always create a new event if I’m right. And that’s because your filter is comparing the current bundle of module 1 with the current bundle of module 10. Depending on the total amount of bundles you retrieved from module 1 and module 10, you’re also burning a lot of operations. Right? (at least bundles of module 1 x bundles of module 10)
What you should do is set an array aggregator behind your first module and store the data you need. The same should be done for the second module.
Then start iterating over your first array and define a filter where you check the result of a temporary array, with the function {{map(<second aggregator ID>.array; "subject"; <iterator ID>.summary)}}, if it contains the value of your Google Calendar event. In that case, you create the event; otherwise, you update it.
I created a simplified version of the scenario to show you the principles.

I also uploaded the blueprint.
blueprint (8).json (11.6 KB)

It is already a slightly advanced solution, but it works.
Hope this answers your question.

Glenn - Callinetic

1 Like

Hi @Callinetic !
Again, thanks a lot for your response. It really was very helpful and you taking the time to build the scenario was very kind. I really appreciate it.
There was a flaw with our method of using the event names and is that if there’s an event with the same name but different info, Make will still replace it and that wouldn’t be ideal.
Good thing my brother is a developer and he helped me out with making it all work. What we thought of was using Google’s Event ID as a reference and embed it inside every new event created.
Honestly it’s hard for me to explain what we ended up doing, but here are some screenshots:

  1. Full Scenario
  2. Function on a “Set Variable” module
  3. Config on the “Create an event” Outlook module, adding the Event ID from Google in the “Location” parameter for it to maintain the format.
  4. Config on the “Update an event” Outlook module, adding the Event ID from Google in the “Location” parameter for it to maintain the format.

Now guess what? Since I created a fresh new Outlook calendar because the previous one was ruined with 200+ event days, I wanted to sync the past 2 years of events and they ended up using all my operations quota. I ran 1600/1000 operations just by catching up with the current date (and some trial and errors before that). Meaning I’ll have to wait for the quota reset to actually enjoy the automatization and even to try the “update” feature because at first I was only re-creating all the events in the new calendar.
Another thing to try and add is another route to the Router that deletes events when they’re deleted from Google Calendar, but that will have to wait for the quota reset.

I can see Make is definitely more on the technical side than on the plug&play side, and maybe Syncing Google Calendar to Outlook Calendar is not something very common to do since there’s no template available for that. I hope this post may help more people with the same need.


Hi @WaltLlanos welcome to the community :wave:

I just wanted to say awesome work figuring this out with the help of @Callinetic and your brother! And thank you so much for stepping back into the thread and sharing the solution with the community. We really appreciate it :pray:

Also, sorry to hear about you burning your operations sooner than you’d like to. If it ever happens that you need more ops urgently, you can always buy extras. Here’s a link to an article in our help center that tells you how to do that.

Keep up the great work :clap:

Hi @WaltLlanos ,

I think the original question is solved. It’s great to see that it helped you to improve your scenario. However, because you burned your operations, I looked at your scenario again, and it can be improved so you consume less operations.

You have two options. You can update the original google event, or you can work with a datastore to retrieve details about the newly created Microsoft event.

  1. Update Google event
    With this method, you actually update the original Google event once you’ve created the Microsoft event. You can update the description by adding the Microsoft Event ID at the end.
    Then, when your watcher is triggered, you can parse the event ID from the description using Regex. \(M365 event ID: (.*)\)
    When the event ID is not available, you know immediately that you need to create a new event in Microsoft. Otherwise, you can use the parsed event ID to update the Microsoft event. (Or delete it)
    This will result in the following scenario.

Note 1: Make sure you enable the option Continue the execution of the route even if the module finds no matches in your regex module.
Note 2: Change your filter to check if the regex result exists.

  1. Using datastore
    You can easily keep track of the relation between two events using a 2 column datastore.

    Once the watcher is triggered, you can search in your datastore to see if a record already exists with the Google Event ID. If not, you know you need to create a new event. Otherwise, you need to update the Microsoft event with the ID that is returned from your datastore. This will result in the following scenario.

    Note 1: Make sure you enable the option Continue the execution of the route even if the module finds no matches in your datastore module.
    Note 2: Change your filter to check if the Microsoft Event ID was returned.

Extra tip
When developing your scenario, you can easily select from which point you want to start your synchronization. During the development phase, it’s therefore more interesting to select a recent date so you don’t sync all your events since the start of your calendar. This will prevent you from burning operations as well.
Once you want to go live, you can set it to the date you would like it to start from.
You can do this by right clicking your watcher and selecting the Choose where to start option.

So, these are the two options I currently see to cut some operations. Nevertheless, if someone in the community can cut even more (without using custom apps :slight_smile: ) that would be very interesting to know as well.

Glenn - Callinetic