Google Calendar to Outlook Bridge
Two-way syncs events between a Google Calendar and an Outlook calendar: new/changed Google events create or update matching Outlook events (and vice versa), with a source tag to prevent loops. Posts a daily agenda combining both calendars to Teams. Helps people who straddle Google and Microsoft ecosystems keep one unified schedule.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This solution keeps a Google Calendar and an Outlook calendar in sync both ways and posts a daily combined agenda to Teams. New or changed Google events create/update matching Outlook events, and new or changed Outlook events create/update matching Google events. A Dataverse Calendar Sync Map table (Google event ID to Outlook event ID plus a content hash) and an Outlook category tag (SyncedFromGoogle) prevent sync loops and duplicate creation. People who straddle Google and Microsoft ecosystems — contractors, partners, dual-tenant staff — double-book or miss meetings; a loop-safe two-way sync gives them one reliable schedule, and the Teams agenda surfaces everything for the day in one place.
Use Case
Someone maintains meetings in both Google Calendar and Outlook and wants them mirrored so either calendar shows everything, plus a daily agenda in Teams. Because a single cloud flow has one trigger, the two-way sync plus agenda is delivered as three flows in one solution that share the env vars and the Calendar Sync Map table.
Flow Architecture
Google to Outlook (Recurrence 15 min)
RecurrencePolls Google events over a look-ahead window and upserts matching Outlook events, creating a Dataverse map row and updating on content-hash change.
Outlook to Google (event trigger)
Office 365 Outlook - CalendarGetOnUpdatedItemsV3On Outlook add/update, a loop guard skips SyncedFromGoogle events, then creates or updates the matching Google event and the map row.
Daily Agenda to Teams (Recurrence 07:00 UTC)
RecurrenceLists today's Google and Outlook events, builds an HTML agenda table, and posts it to a Teams channel.
Calendar Sync Map (Dataverse)
Dataverse - ListRecords/CreateRecord/UpdateRecordflowlibs_calendarsyncmap stores Google event ID, Outlook event ID, source, and content hash so duplicates are blocked and echoes are gated.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_GoogleCalendarId | String | primary | Source Google calendar (primary selects the signed-in user's main calendar). |
| flowlibs_OutlookCalendarId | String | Calendar | Target Outlook calendar (table path parameter). |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams team (group) id for the daily agenda channel. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Teams channel id for the daily agenda channel. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Google Calendar | shared_googlecalendar | ListEvents CreateEvent UpdateEvent |
| Office 365 Outlook | shared_office365 | CalendarGetOnUpdatedItemsV3 V4CalendarPostItem V4CalendarPatchItem V4CalendarGetItems |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord UpdateRecord |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Selective sync
- Add a Filter Array / Condition after the event list to mirror only events matching a category or keyword, avoiding personal items.
- Free/busy only
- For privacy, create busy placeholders (generic subject, no body/attendees) instead of full details.
- Delete handling
- Propagate cancellations: add a Google OnDeletedEventInCalendar flow (and an Outlook delete branch) that looks up the map and deletes the mirrored event plus the map row.
- Time zone
- Change the Time Zone Initialize Variable (or promote it to an env var) if your calendars are not UTC.
- Agenda timing/format
- Adjust the daily recurrence startTime and the HTML table styling in Flow 3.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Loop guard (Outlook to Google)
Proceeds only when the Outlook event was not created by this solution.
EXPR.02Content hash (change detection)
Summary/start/end fingerprint that gates echo updates.
EXPR.03Outlook V4 date format
Formats event start to the no-offset format Outlook expects on item/start.
EXPR.04Agenda day window
Day end bound; Day start is startOfDay(utcNow()), used in the Outlook $filter.
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.