How to Sync Google Calendar with Outlook (the clean way)
The built-in import options leave you with stale, duplicated events. Here is how I keep Google Calendar and Outlook genuinely in sync.

Jakub Beneš
Founder, CalendarPipe · June 14, 2026 · 8 min read
A few months ago I moved a client call from Tuesday to Thursday in Google Calendar. On Thursday morning, a colleague who books around my Outlook calendar asked why I'd no-showed the Tuesday slot — which, on his screen, I was apparently still attending. My Google calendar was right. My Outlook copy was a ghost of a decision I'd already changed. That tiny gap is the whole reason I care about how to sync Google Calendar with Outlook properly, instead of with the duct-tape methods most guides hand you.
If you've ever tried to connect Google Calendar to Outlook and watched it drift out of step, this one's for you. I'll cover what the built-in options actually do, why they let you down, what real Google and Outlook calendar sync should look like, and how I keep mine genuinely in sync — including true two-way, done without the usual mess.
Why the built-in options disappoint
There are two "official" ways to get Google events into Outlook, and both ship with a catch nobody mentions upfront.
Subscribing to a Google ICS link. Every Google calendar has a secret iCal URL. Paste it into Outlook as a subscribed calendar and your Google events appear — so far so good. The catch is what "subscribed" really means: it's read-only, and Outlook refreshes it on its own schedule, which can lag by hours. Reschedule a meeting in Google and Outlook keeps showing the stale time until it decides to poll again. Edits never flow back, because the subscription is one-directional by nature. It's not sync. It's a slow, occasional photocopy.
Exporting and importing a file. You export your Google calendar to an .ics file and import it into Outlook. This is even more brittle: it's a frozen snapshot of the moment you exported. Nothing ever updates. Cancel an event in Google and the imported copy lingers in Outlook forever. Add new events and they're simply missing. Run the import again to "fix" it and you get duplicates, because Outlook has no idea the new file describes events it already has.
Neither is real sync. One is read-only and slow; the other is a one-time copy that starts rotting the second it lands. A rough at-a-glance view? The ICS subscription is fine. But if you actually depend on your calendar being right, you'll feel the gap fast — usually at the worst possible moment, like I did.
What "in sync" should actually mean
Before fixing anything, it's worth being honest about what we're even after. When I say two calendars are in sync, I mean four specific things:
- Fresh. A new event appears within minutes, not hours and not never.
- Correct. Move or rename something and the copy reflects it.
- Cancellations honored. Delete an event and its copy disappears too — no zombies.
- No duplicates. One real event, one copy. Re-running the sync doesn't pile up clones.
That's a low bar, honestly. The built-in tools just don't clear it. This is the whole reason I ended up building CalendarPipe — I wanted a calendar copy I could actually trust.
How CalendarPipe syncs Google Calendar with Outlook
CalendarPipe works with sync rules. A sync rule connects a source calendar to a target calendar and runs a small TypeScript function — a gate — on every event to decide whether it passes through and how it should look on the other side. It runs automatically on a schedule, picks up changes, and removes copies when the original is cancelled. That covers all four points above.
The setup is short:
- Connect both accounts. Add your Google account and your Microsoft Outlook account. This works with personal
outlook.comaccounts and work/school Microsoft 365 accounts alike. (Apple/CalDAV and read-only ICS feeds are supported too, if you live in that world.) - Create a sync rule. Pick Google as the source and Outlook as the target.
- Decide how events flow. Start from a ready-made template — "copy everything" is the obvious one if you just want all your Google events mirrored into Outlook. Or attach a gate to filter and transform events: use the visual builder (no code), describe what you want in plain English and let the AI write it, or drop into the TypeScript editor if that's your thing.
- Activate it. From there it runs on its own.
One thing I want to be straight about: a sync rule is one-way by design. Source → target, full stop. The rule above pushes Google into Outlook and never touches Google. That's deliberate — one-way is predictable, and predictable is exactly what you want from something running unattended.
A single one-way rule like this fits the free plan (two calendar connections, one sync rule, a 15-minute interval, direct delivery). If you only need events flowing in one direction — and plenty of people genuinely do — I wrote a focused walkthrough of a true one-way Google → Outlook sync that goes deep on that narrower case. The rest of this guide is about the bigger picture, and about doing real two-way the right way.
A rule I actually use
"Copy everything" is fine, but it's rarely what I want. My Google calendar has dentist appointments, kid logistics, and the occasional 11pm reminder to take the bins out. None of that belongs on my work Outlook calendar, and I really don't want a colleague opening my availability and reading "bins."
So my Google → Outlook rule does two things in the gate:
- It only lets through events whose title starts with a
[work]tag I add myself. Everything else is blocked and never reaches Outlook. - For the events that do pass, it clears the title to a plain "Busy", strips the location and description, and sets the event to private.
The result: my Outlook calendar shows accurate busy blocks at exactly the right times, so nobody books over me — but the actual content stays on Google where it belongs. The time block is always preserved (a gate can transform what an event says — title, description, location, visibility, busy/free, buffers, out-of-office — but never its start, end, or duration), so the busy blocks line up perfectly.
You can describe that whole thing to the AI generator in a sentence — "only sync events tagged [work], show them as a private busy block" — and it writes the gate for you. The AI generator is a Pro feature; if you'd rather stay free, click the same logic together in the visual builder instead. Either way it took me about two minutes.
Setting up true two-way Google and Outlook calendar sync
Here's the part most "sync everything both ways" tools get dangerously wrong. CalendarPipe does true two-way by combining two one-way rules pointed in opposite directions:
- Rule 1: Google → Outlook, with its own gate.
- Rule 2: Outlook → Google, with its own gate.
That's it. Edit a meeting in Google and Rule 1 carries it to Outlook; edit one in Outlook and Rule 2 carries it back to Google. Two clear directions, no guessing about what writes where.
Why bother being this explicit instead of one magic "mirror everything" toggle? Because mirror-everything is how you get feedback loops. A naive bidirectional tool copies an event from Google to Outlook, then sees the new Outlook copy as a change and copies it back to Google… and you end up with duplicates breeding duplicates. Splitting it into two named one-way rules kills that at the root: each rule knows precisely which calendar is its source of truth and which target it's allowed to write to. No ambiguity for the system to trip over.
Being explicit also lets you treat the two directions differently, which is usually what you actually want. For example:
- Google → Outlook: only events tagged
[work], retitled to "Busy", private — like my rule above. - Outlook → Google: copy everything across so your personal calendar shows your full work load in real detail.
Same model in both directions, two independent gates, total control over what crosses each way. For the full menu of what a gate can do — clearing titles, busy/free, privacy, pre/post buffers, out-of-office — the docs have the complete list.
The honest pricing note: two rules means Pro, because the free plan includes one. Pro is $4/month ($3.33/month billed annually, 14-day trial), and it also unlocks the faster 5-minute interval, AI rule generation, invitation delivery, hosted calendars, and the API. So a single one-way sync is genuinely free; real two-way is four bucks a month. I'd rather say that plainly than bury it.
The short version
The built-in Google-to-Outlook options aren't really sync. The ICS subscription is read-only and refreshes slowly; the file import is a snapshot that rots into duplicates. Both are fine for a fuzzy glance and a liability for anything you depend on.
Real sync means fresh, correct, cancellations honored, no clones — something that runs on a schedule and respects what you change. In CalendarPipe that's a one-way sync rule (free) for a single direction, or two one-way rules (Pro) for true two-way without the feedback-loop chaos. Either way, you decide exactly what crosses over and what stays private — which, to me, is the entire point.
If you want to stop nursing a stale calendar copy, give CalendarPipe a try — this is the exact problem I built it to solve.
— Jakub
Frequently asked questions
Can I sync Google Calendar and Outlook for free?
Outlook can subscribe to a Google Calendar ICS link for free, but it is read-only and refreshes slowly. For a reliable two-way or near-real-time sync you need a dedicated tool.
Why do my synced events show up duplicated or out of date?
ICS subscriptions are one-way snapshots that Outlook refreshes on its own schedule. Edits do not flow back, and cancellations can linger, which looks like duplicates and stale events.
Keep reading
Set this up in CalendarPipe
Connect Google, Outlook, or Apple Calendar and build a pipe that filters and transforms your events exactly how you want — in a couple of minutes.
Get started free