Trigger n8n Workflows from Google Calendar Events
Ready to automate?
Browse 5,600+ copy-paste n8n workflow templates.
If your team relies on a shared Google Calendar for client meetings, on-call handoffs, or interview slots, you already know the failure mode: someone reschedules an event, the change lands quietly in the calendar, and nobody notices until they show up to the old time slot. Native Google Calendar notifications only reach the people already on the invite, and they don't reach Slack, a CRM, or a log you can search later.
n8n's Google Calendar Trigger node solves this by watching a calendar for changes and starting a workflow the moment one happens. In this guide, you'll build a workflow that monitors a calendar for created, updated, and cancelled events and posts a labeled alert to Slack for each one, with the event title, time, and a direct link. The same skeleton adapts to logging changes in Google Sheets, filtering by keyword, or watching multiple calendars at once.
What You'll Build
- Three Google Calendar Trigger nodes watching one calendar, one each for created, updated, and cancelled events
- Set nodes that normalize each trigger's output into a common shape (change type, title, start time, organizer, link)
- A Merge node that combines all three paths into a single stream
- A Slack node that posts a formatted alert to a designated channel for every change
Prerequisites
- An n8n instance (Cloud or self-hosted) with the workflow active, since trigger nodes only run on activated workflows
- A Google Cloud project with the Calendar API enabled, and a Google Calendar OAuth2 API credential configured in n8n
- The ID of the calendar you want to monitor (your primary calendar's email address, or a shared calendar's ID from its settings page)
- A Slack workspace with a bot token authorized to post in the target channel
Step 1: Add the Google Calendar Trigger Nodes
Create a new workflow and add three Google Calendar Trigger nodes to the canvas. Each one watches the same calendar for a different kind of change:
- Node 1 — "On Event Created": Calendar set to your target calendar, Trigger On set to
Event Created - Node 2 — "On Event Updated": same calendar, Trigger On set to
Event Updated - Node 3 — "On Event Cancelled": same calendar, Trigger On set to
Event Cancelled
For all three, set Poll Times to a cadence that fits your team, such as Every 5 Minutes for a busy shared calendar or Every Minute for time-sensitive scheduling like interview slots. Authenticate each node with the same Google Calendar OAuth2 API credential.
n8n's Calendar Trigger polls the Calendar API on that interval and compares results to the last poll, firing the workflow only when it detects a matching change. There's no webhook or public URL to expose.
Step 2: Normalize Each Trigger's Output with a Set Node
Google Calendar returns a different-shaped payload depending on the event, but you want a single consistent format downstream. Add a Set node directly after each trigger node and define the same four fields in each one:
- changeType — a fixed string:
"created","updated", or"cancelled"depending on which Set node it is - eventTitle — expression:
{{ $json.summary }} - eventStart — expression:
{{ $json.start.dateTime || $json.start.date }}(handles both timed events and all-day events) - eventLink — expression:
{{ $json.htmlLink }}
Name the three Set nodes something like "Format Created," "Format Updated," and "Format Cancelled" so the workflow reads clearly at a glance.
Step 3: Merge the Three Paths
Add a Merge node set to Append mode with three inputs. Connect each of the three Set nodes into one of the Merge node's inputs. The output is a single stream of normalized event-change records, regardless of which trigger produced them, which means every downstream node only has to handle one shape of data.
Step 4: Filter Out Noise with an IF Node
Shared calendars generate updates you don't care about, like a guest changing their own RSVP status on an event they didn't create. Add an IF node after the Merge node with a condition such as {{ $json.eventTitle }} is not empty, and route anything that fails the check to a NoOp node instead of Slack. This keeps the alert channel useful instead of noisy.
If you only want alerts for events matching a pattern, like external client meetings, add a second condition here: {{ $json.eventTitle.toLowerCase().includes('client') }}.
Step 5: Format and Send the Slack Alert
Add a Set node before the Slack node to build the message text. Use an expression that labels the change type explicitly instead of relying on color or icons alone:
{{ $json.changeType.toUpperCase() }}: "{{ $json.eventTitle }}" — {{ $json.eventStart }}
{{ $json.eventLink }}
Then add a Slack node in Post Message mode:
- Channel:
#calendar-alerts(or whatever channel your team monitors) - Message Text: the field from the Set node above
- Credential: your Slack bot token, authorized to post in that channel
Save and activate the workflow. Create a test event on the target calendar, then edit its time, then cancel it. You should see three distinct Slack messages, one for each change.
Adapting This Pattern
- Log to Google Sheets instead of Slack. Swap the Slack node for a Google Sheets node in Append mode, writing changeType, eventTitle, eventStart, and a timestamp to a row. Useful as an audit trail for compliance-sensitive scheduling like interviews or client contracts.
- Watch multiple calendars. Duplicate the three trigger nodes for each additional calendar ID and route them all into the same Merge node. Add a calendarName field in the Set nodes so alerts identify which calendar changed.
- Route by event type. Add a Switch node after the IF node to send interview-related events to a recruiting Slack channel and client meetings to a sales channel, using a keyword check on eventTitle.
- Combine with an approval flow. For high-stakes calendar changes, like cancelling an event within 24 hours of the start time, route "cancelled" events through an IF node checking the time delta, and post those to a channel that requires a manual acknowledgment before archiving.
When to Build This vs. a Dedicated Tool
If all you need is a personal reminder, Google Calendar's built-in notifications already cover that. Where this workflow earns its place is when calendar changes need to reach a system Google Calendar doesn't talk to directly: a Slack channel your whole team watches, a spreadsheet used for compliance tracking, or a CRM record that should reflect a rescheduled client call. Once you're combining calendar events with other tools, a purpose-built n8n workflow is more reliable and far cheaper than a dedicated calendar-monitoring SaaS subscription, and you control exactly which changes are worth an alert.
Templates and Further Reading
Browse the full template library at n8nresources.dev/templates for pre-built starting points you can adapt into this pattern. If you're building broader event-driven automations beyond calendars, the webhook automation use cases page covers related trigger patterns, and the Slack integration page has more on formatting and routing Slack messages from n8n.
Subscribe to n8n Resources for new workflow tutorials and templates delivered weekly.
Enjoyed this article?
Share it with others who might find it useful