Google Calendar
List, read, create, update and delete events, and check free/busy, as a connected Google account.
The Google Calendar app reads and writes calendars as a connected Google account. A Calendar step's Calendar field lists your own calendars by name, fetched with the account you picked — pick the account first.
An event's start and end come back as strings, not the nested objects Google sends, so {{ upstream.<nodeId>.output.result.0.start }} reads directly.
The New or updated event trigger is the only app trigger with exact change tracking: Google hands back a sync token and each check gets exactly what changed, cancellations included. See What "new" means.
Operations
The App step's own settings — account, resource, operation, and { value, valueMode } per input — are described in the Apps overview. These are this app's operations.
| Operation | What it does | Inputs (bold = required) | Permission |
|---|---|---|---|
calendar.list | List calendars | — | calendar.readonly |
event.list | List events | calendarId, timeMin, timeMax, query, singleEvents | calendar.readonly |
event.get | Get an event | calendarId, eventId | calendar.readonly |
event.create | Create an event | calendarId, summary, start, end, timeZone, description, location, attendees, sendUpdates | calendar |
event.update | Update an event | calendarId, eventId, summary, start, end, timeZone, description, location, attendees, sendUpdates | calendar |
event.delete | Delete an event. Cannot be undone. | calendarId, eventId, sendUpdates | calendar |
availability.free-busy | Free/busy | calendarIds, timeMin, timeMax, timeZone | calendar.readonly |
Triggers
Use these on an App trigger node. It polls every pollMinutes and starts one run per new item.
| Trigger | Fires for | Inputs (bold = required) |
|---|---|---|
event-changed | New or updated event — Fires once for every event that is created, changed or cancelled in a calendar. | calendarId |
Example
name: Book visit
description: Books a service visit in the primary calendar.
graph:
nodes:
- id: start
type: trigger_manual
position: { x: 0, y: 0 }
data: { description: 'Pass customer, start and end.' }
- id: book
type: app
position: { x: 280, y: 0 }
data:
app: google-calendar
version: 1.0.0
resource: event
operation: create
connection: google-account
inputs:
calendarId: { value: 'primary', valueMode: fixed }
summary: { value: 'Service visit: {{ trigger.customer }}', valueMode: expression }
start: { value: '{{ trigger.start }}', valueMode: expression }
end: { value: '{{ trigger.end }}', valueMode: expression }
timeZone: { value: 'Europe/Sofia', valueMode: fixed }
edges:
- { id: start-to-book, source: start, target: book }In a Package
The step travels whole; the account becomes a credential Slot the installer binds one of their own Google accounts to. See Apps in a Package.
slots:
- id: google-account
type: credential
scheme: oauth2
app: google
compliance:
providers: [google]- Travels:
app,version,resource,operation,inputs - Converted:
connectionId→connection(thecredentialSlot) - Never carried: none