Create, move, RSVP to and read Google Calendar events — recurring series included — from any Windmill script, flow or app.
What you can do with Google Calendar
Complete, deployable projects built around Google Calendar — the fastest way to get something real running.
Set up in 2 steps
Connect from the Resources page
Open Resources, click Add a resource/API and pick gcal from the OAuth APIs list. Click Connect and sign in with the Google account that owns the calendars, then name the resource and save it.
Run your first script
Fork any script below and read before writing anything.
Scripts
Building blocks, if none of the projects above fit. Fork one, run it, or call it as a step inside your own flow.
Update Following Instances
Update Event Instance
Respond to Event
List Event Instances
Get Event
Query Free/Busy
Update Attendees of an Event
Create Quick Event
Update Event
Delete Event
List Events
Create Event
Get Calendar Metadata
Get Calendar List
Trigger flows from Google Calendar
Google Calendar is not only a destination. These inbound paths are supported today.
Calendar changes (native Google trigger)
Add a Google trigger of type Calendar on a script or flow and pick a calendar: Windmill subscribes to Google's push notifications and starts a run whenever an event on it is created, updated or deleted. The notification says that the calendar changed, not what changed, so start from the Google native trigger template script in the gworkspace integration: it keeps a sync token in state and returns the changed events, deletions included. Set its resource path to your gcal resource. The first notification only stores the sync token and returns no events.
Resource type
The shape of the credential every script on this page expects.
gcal
View raw schema →| Field | Type | Required | What it is |
|---|---|---|---|
| token | string | Yes | The OAuth token, refreshed if necessary |
Questions
What can Windmill do with my account?
By default, read and write events on every calendar the connected account can access — the connection asks for calendar.events, not full calendar access. Listing calendars, reading calendar metadata and querying free/busy need extra read-only scopes: tick calendar.calendarlist.readonly, calendar.calendars.readonly and calendar.freebusy (or calendar.readonly) when you connect.
Can I create the resource by hand instead of connecting?
Nothing stops you — the resource is a single token field. But Google's access tokens last about an hour and only the OAuth flow returns the refresh token that renews them, which is why this page has no CLI lane.
There is no Connect button on my instance
Self-hosted instances need a Google OAuth client configured once by an admin before the tile appears.