Why it happens
Automations don't remember which event is a copy of which. A trigger like "new or updated event" fires again whenever the original changes, and without a stored link the next step can't find the copy it made last time, so it creates another one. Add a second automation going the other way and each one's copies trigger the other, which is how calendars fill up with duplicates and how monthly task or operation limits get used up. Deletions are the other gap: Zapier's Outlook integration can't trigger on a deleted event, so removing a meeting on one side rarely removes its copy.
How Kelbra handles it
Kelbra records which event is the original and which are its copies, so an edit updates the existing copy instead of making a new one, and the copies it writes never set off another round. Deleting an event removes its copies, and if the same event changes on both sides at once it pauses for you to choose instead of overwriting either. Repeating meetings arrive as individual occurrences, up to 12 months ahead. It works with Google, Microsoft/Outlook, iCloud and other CalDAV calendars, at a flat monthly price rather than per-task credits.
Fixing it yourself
Pick one direction. Decide which calendar is the source and copy from it to the other only. Two automations running in opposite directions will keep triggering each other.
Save the original's ID on every copy, in the copy's description or in a data store (Make data stores and Zapier's Storage both work). This is the link that stops duplicates.
Before creating anything, search the destination calendar for that ID. If a copy is found, update it; only create a new event when nothing is found.
Handle cancellations separately. Google Calendar has an "Event Cancelled" trigger you can use to find the copy by its ID and delete it. Deleted Outlook events can't be used as a Zapier trigger, so a common workaround is renaming the event to something like "Deleted" first and filtering on that.
Filter the copies out of your trigger (for example by skipping events whose description contains the saved ID), so nothing your automation created can start it again.
If keeping the automation working is costing you more time or credits than it saves, connect both calendars to Kelbra instead. It does the linking, updating and deleting above for every event, and you can try it free for 7 days.
Questions
Why does my Zap create two Outlook events for one Google event?
The "New or Updated Event" trigger fires once when the event is created and again when it changes. Without a saved link to the copy it made the first time, the second run creates another event. Storing the original event ID on the copy and searching for it before creating fixes this.
Can Zapier sync deletions between Google Calendar and Outlook?
Only partly. Google Calendar has an "Event Cancelled" trigger you can use to delete the copy, but Zapier's Outlook integration can't trigger on a deleted event, so deletions made in Outlook need a workaround such as renaming the event before deleting it.
Is it safe to run two Zaps for two-way sync?
Not without careful filtering. Each Zap's copy looks like a new event to the other Zap, so they can keep creating events for each other. Keeping the sync one-way, or using a tool built for two-way sync, avoids the loop.
What happens to repeating meetings?
Automation triggers usually treat each occurrence of a repeating meeting as a separate event, which multiplies the number of runs and copies. Kelbra also copies repeating meetings as individual occurrences, but it links each one to its original and only syncs up to 12 months ahead, so an open-ended series doesn't flood the other calendar.
How is Kelbra different from building this in Zapier or Make?
Kelbra is built only for keeping calendars in agreement. It remembers which events are copies, updates them in place, removes them when the original is deleted, and pauses conflicts for your review. You connect each calendar once instead of maintaining automations, and there are no per-task credits to run out of.