Event Change
trigger.google_calendar_event
TriggerBusiness appsconnection requiredruns in-engine
Polls Calendar events.list (incremental sync); one run per change.
Start a run when an event is created, updated, or is about to start.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- OAuth 2.0
- Providers
- Google Calendar
- Secret shape
- {"client_id", "client_secret", "refresh_token"}
- Config it needs
- token_uri
- Resolved by
- config.connection_id, else node.connection_id
Configuration
4 fields, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
calendar_id Calendar id, or 'primary'. Changing it re-initialises the trigger. | string | No | primary | — | — |
mode created = new events only; updated = edits and deletions (change_type 'cancelled'); starting_soon = fires lead_minutes before each occurrence starts. | string | No | created | one of "created", "updated", "starting_soon" | — |
lead_minutes starting_soon only: how far ahead of the start to fire (1-1440 minutes). Keep it at or above poll_interval_sec or an event can start between polls. | number | Conditional | 15 | 1–1440; only with mode | — |
poll_interval_sec How often to check (30-86400 seconds). | number | No | 60 | 30–86400 | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"calendar_id": "primary",
"lead_minutes": 15,
"mode": "created",
"poll_interval_sec": 60
}Output
One shape.
event_change
| Field | Type | Example |
|---|---|---|
change_type created | updated | cancelled | starting_soon. | string | — |
calendar_id The calendar that was polled. | string | — |
event.id Calendar event id (an occurrence id when expanded). | string | — |
event.summary Event title. | string | — |
event.description | string | — |
event.location | string | — |
event.start RFC3339 datetime, or a bare date when all_day. | string | — |
event.end RFC3339 datetime, or a bare date when all_day. | string | — |
event.all_day True when the event has a date and no time. | boolean | — |
event.time_zone Zone of start/end; null for an all-day event. | string | — |
event.attendees Guests: email, display_name, response_status, organizer, self, optional, resource (a meeting room is a resource, not a person). | array | — |
event.organizer Organiser email. | string | — |
event.hangout_link Meet/video entry point, if any. | string | — |
event.status confirmed | tentative | cancelled. | string | — |
event.recurring_event_id Series id when this is one occurrence of a recurring event; null otherwise. | string | — |
event.ical_uid Stable cross-calendar id; what a sync job matches on. | string | — |
event.html_link Link to the event in Google Calendar. | string | — |
event.created RFC3339 creation time. | string | — |
event.updated RFC3339 last-modified time; bumps on every change. | string | — |
{
"calendar_id": "",
"change_type": "",
"event": {
"all_day": false,
"attendees": [],
"created": "",
"description": "",
"end": "",
"hangout_link": "",
"html_link": "",
"ical_uid": "",
"id": "",
"location": "",
"organizer": "",
"recurring_event_id": "",
"start": "",
"status": "",
"summary": "",
"time_zone": "",
"updated": ""
}
}Notes
- Existing events are never replayed: the first poll only mints the sync token (or, for starting_soon, records what is already inside the window).
- Runs are idempotent per change — created/updated key on the event's `updated` timestamp, starting_soon on the occurrence (event id + start).
- Google expires a sync token with 410 GONE; the trigger re-initialises itself and does not replay the gap.
- The sync only covers events that had not ended when the trigger was first armed; edits to finished events are not reported.
- starting_soon skips all-day events — they have no start time to lead up to.
Related Google Calendar nodes
See Event Change run in a workflow.
In a technical demo we add the Google Calendar connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.