# Google Calendar

Create, update and find events in Google Calendar.

## Connect Google Calendar

1. In the sidebar, open **Connections** and press **Add connection**.
2. Type `calendar` and choose **Google Calendar**.
3. Press **Sign in with Google**.
4. Choose your account in Google’s window and allow access.

You should see **Signed in as** and the account’s address. GoRunner can then see and edit its calendars.

You can also connect from a step: under **Connection**, press **New**.

**What if it says “Google sign-in isn’t set up here”?**

This installation has no Google app yet. An admin of the installation sees **Set up Google sign-in** instead, and sets it up once for everyone:

1. In Google Cloud, create an OAuth client of type **Web application**, and turn on the API for Google Calendar.
2. In GoRunner, copy the **Redirect address to add in Google Cloud**, and add it to the client.
3. Paste the **Client ID** and **Client secret**, then press **Save and sign in**.

Publish the app in Google Cloud. An app left in Testing signs everyone out after 7 days.

Everyone else sees who to ask. Until it is set up, **Paste an access token instead** lets you try a step. A pasted token lasts about an hour and can’t renew itself.

[Set up Google sign-in for connections](https://docs.gorunner.io/self-host/oauth-apps)

**Can I use my own Google app?**

Yes. In the sheet, open **Use your own Google app** and paste its **Client ID** and **Client secret**. Add the **Redirect address to add in Google Cloud** to your app first. The connection then signs in through your app instead of the installation’s.

[Connections](https://docs.gorunner.io/build/connections) says how to sign in again, rename or delete it. In a product that embeds GoRunner, **Add connection** can be missing: then [your provider makes connections](https://docs.gorunner.io/embed/customer-connections) for you.

## Start a workflow

Add a trigger and choose **Google Calendar**. The trigger uses the same connection as the steps.

### On Event Change

Polls a calendar (about once a minute) and fires for each newly created, updated, or cancelled event.

- **Calendar · Optional**: Calendar id (an email address) to watch, or 'primary'. Default: primary.
- **Trigger On · Optional**: Fire when an event is created, updated, or cancelled. Options: Event Created, Event Updated, Event Cancelled. Default: Event Created.
- **Search Term (optional) · Optional**: Only fire for events matching this free-text search.

A later step can use its data, such as `{{trigger.change_type}}`, `{{trigger.end}}`, `{{trigger.htmlLink}}` and 5 more. See [Use data from earlier steps](https://docs.gorunner.io/build/use-data-from-earlier-steps).

## Do things in Google Calendar

Add a **Google Calendar** step, choose a **Resource**, then an **Operation**. Choose a row to see its fields.

- [Event](https://docs.gorunner.io/apps/google-calendar#fields-f-event): Create · Get · Get Many · Update · Delete · Add Attendees
- [Calendar](https://docs.gorunner.io/apps/google-calendar#fields-f-calendar): Get Availability · Create Quick Event · Add Calendar to Calendar List

Later steps read a step’s output by its name: see [Use data from earlier steps](https://docs.gorunner.io/build/use-data-from-earlier-steps).

Not in your list? See [When an app isn’t here](https://docs.gorunner.io/apps/when-an-app-isnt-here#q-not-in-list).

## For developers

In the API, which calls apps pieces, Google Calendar is `pieceId: "googlecalendar"` with `actionId: "googlecalendar"`, set by `resource` and an `operation_…` field, such as `operation_calendar`. Its trigger is `googlecalendartrigger` / `googlecalendar_poll`. [Get an app](https://docs.gorunner.io/api/apps/get-app) returns every field.

It can change something outside the run (`writes_external`). See [How versions and side effects work](https://docs.gorunner.io/apps#q-versions).

### Google Calendar › Event

### Create

- **Calendar · Optional**: Calendar id (an email address), or 'primary' for your main calendar. Default: primary.
- **Start · Required**: Start time, ISO-8601 (such as 2026-02-01T09:00:00). For an all-day event use the date only.
- **End · Required**: End time, ISO-8601 (such as 2026-02-01T10:00:00).
- **Title · Optional**: The event title/summary.
- **Description · Optional**: Event description.
- **Location · Optional**: Where the event is.
- **Attendees · Optional**: Comma-separated attendee email addresses.
- **Time Zone · Optional**: IANA time zone for the start/end (such as Europe/London). Needed when they are written without an offset (2026-02-01T09:00:00); a time with one (…Z, …+01:00) is that instant.
- **Recurrence (RRULE) · Optional**: An iCal RRULE, such as FREQ=WEEKLY;INTERVAL=1;COUNT=10. Blank = a single event.
- **Color ID · Optional**: Event color id (1–11).
- **All Day · Optional**: Treat start/end as whole-day dates. Off by default.
- **Use Default Reminders · Optional**: On: the calendar's default reminders. Off: the Reminders below. Left unset, a new event gets the calendar's default reminders and an updated one keeps its own.
- **Reminders · Optional**: Reminder overrides, such as [{"method":"popup","minutes":10},{"method":"email","minutes":60}]. Shows when **Use Default Reminders** is off.
- **Add Google Meet · Optional**: Attach a Google Meet video conference to the event. Off by default.
- **Visibility · Optional**: Event visibility. Options: Default, Public, Private, Confidential.
- **Show Me As · Optional**: Whether the event blocks time on your calendar. Options: Busy, Available.
- **Guests Can Modify · Optional**: Guests Can Modify. Left unset, a new event gets Google's default (off) and an updated one keeps its setting.
- **Guests Can Invite Others · Optional**: Guests Can Invite Others. Left unset, a new event gets Google's default (on) and an updated one keeps its setting.
- **Guests Can See Other Guests · Optional**: Guests Can See Other Guests. Left unset, a new event gets Google's default (on) and an updated one keeps its setting.
- **Send Updates · Optional**: Who to notify about the change. Options: Default, All guests, External only, Nobody.

### Get

- **Calendar · Optional**: Calendar id (an email address), or 'primary' for your main calendar. Default: primary.
- **Event ID · Required**: The event id.

### Get Many

- **Calendar · Optional**: Calendar id (an email address), or 'primary' for your main calendar. Default: primary.
- **Return All · Optional**: Fetch every page of events. Off by default.
- **Limit · Optional**: Max events when not returning all. Default: 50. Shows when **Return All** is off.
- **After (Time Min) · Optional**: Only events that end after this ISO-8601 time (UTC when written without an offset).
- **Before (Time Max) · Optional**: Only events that start before this ISO-8601 time (UTC when written without an offset).
- **Search Text · Optional**: Free-text search across event fields.
- **Updated After · Optional**: Only events modified after this ISO-8601 time (UTC when written without an offset).
- **Order By · Optional**: Sort order. Options: Default, Start Time, Updated.
- **Expand Recurring Events · Optional**: Expand recurring events into individual instances (required for Order By Start Time). On by default.
- **Show Deleted · Optional**: Include cancelled events. Off by default.

### Update

- **Calendar · Optional**: Calendar id (an email address), or 'primary' for your main calendar. Default: primary.
- **Event ID · Required**: The event id.
- **Start · Optional**: New start time, ISO-8601 (leave blank to keep).
- **End · Optional**: New end time, ISO-8601 (leave blank to keep).
- **Title · Optional**: The event title/summary.
- **Description · Optional**: Event description.
- **Location · Optional**: Where the event is.
- **Attendees · Optional**: Comma-separated attendee email addresses.
- **Time Zone · Optional**: IANA time zone for the start/end (such as Europe/London). Needed when they are written without an offset (2026-02-01T09:00:00); a time with one (…Z, …+01:00) is that instant.
- **Recurrence (RRULE) · Optional**: An iCal RRULE, such as FREQ=WEEKLY;INTERVAL=1;COUNT=10. Blank = a single event.
- **Color ID · Optional**: Event color id (1–11).
- **All Day · Optional**: Treat start/end as whole-day dates. Off by default.
- **Use Default Reminders · Optional**: On: the calendar's default reminders. Off: the Reminders below. Left unset, a new event gets the calendar's default reminders and an updated one keeps its own.
- **Reminders · Optional**: Reminder overrides, such as [{"method":"popup","minutes":10},{"method":"email","minutes":60}]. Shows when **Use Default Reminders** is off.
- **Visibility · Optional**: Event visibility. Options: Default, Public, Private, Confidential.
- **Show Me As · Optional**: Whether the event blocks time on your calendar. Options: Busy, Available.
- **Guests Can Modify · Optional**: Guests Can Modify. Left unset, a new event gets Google's default (off) and an updated one keeps its setting.
- **Guests Can Invite Others · Optional**: Guests Can Invite Others. Left unset, a new event gets Google's default (on) and an updated one keeps its setting.
- **Guests Can See Other Guests · Optional**: Guests Can See Other Guests. Left unset, a new event gets Google's default (on) and an updated one keeps its setting.
- **Send Updates · Optional**: Who to notify about the change. Options: Default, All guests, External only, Nobody.

### Delete

- **Calendar · Optional**: Calendar id (an email address), or 'primary' for your main calendar. Default: primary.
- **Event ID · Required**: The event id.
- **Send Updates · Optional**: Who to notify about the change. Options: Default, All guests, External only, Nobody.

### Add Attendees

- **Calendar · Optional**: Calendar id (an email address), or 'primary' for your main calendar. Default: primary.
- **Event ID · Required**: The event id.
- **Attendees to Add · Required**: New attendee email addresses to add to the event, comma-separated, or a JSON array (such as ["a@x.io","b@x.io"]). Existing attendees are kept.
- **Send Updates · Optional**: Who to notify about the change. Options: Default, All guests, External only, Nobody.

### Google Calendar › Calendar

### Get Availability

- **Calendar · Optional**: Calendar id (an email address), or 'primary'. Default: primary.
- **Start · Required**: Start of the interval to check, ISO-8601.
- **End · Required**: End of the interval to check, ISO-8601.
- **Output Format · Optional**: What to return. Options: Available (true/false), Booked slots, Raw response. Default: Available (true/false).
- **Time Zone · Optional**: IANA time zone for the query (optional): start and end times written without an offset are read in it (in UTC when it is blank).

### Create Quick Event

- **Calendar · Optional**: Calendar id (an email address), or 'primary'. Default: primary.
- **Summary · Required**: Natural-language text describing the event (such as 'Lunch with Jane next Tuesday at 1pm').
- **Send Updates · Optional**: Guests who should be notified about the new event. Options: Nobody, All guests, External only. Default: Nobody.

### Add Calendar to Calendar List

- **Calendar ID · Required**: The id of the calendar to add to your calendar list (find it in that calendar's settings).

Source: https://docs.gorunner.io/apps/google-calendar
