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.

FieldTypeRequiredDefaultConstraintsExample
calendar_id
Calendar id, or 'primary'. Changing it re-initialises the trigger.
stringNoprimary——
mode
created = new events only; updated = edits and deletions (change_type 'cancelled'); starting_soon = fires lead_minutes before each occurrence starts.
stringNocreatedone 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.
numberConditional151–1440; only with mode—
poll_interval_sec
How often to check (30-86400 seconds).
numberNo6030–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

FieldTypeExample
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.

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.