---
title: Google Calendar
description: Integrate with Google Calendar to create, list and update events.
---

Create, read, update and delete Google Calendar events, list your calendars, and check when you are free or busy.

Pick a saved connection in the **Credential** field, or create one from there. It signs in with an OAuth2.

## What it does

The Google Calendar node works on three kinds of things (**Resource**):

* **Event**: **Create**, **Update**, **Delete**, **Get** one event, or **List** events in a time range.
* **Calendar**: **List** the calendars in your account, with their ids.
* **Free/busy**: **Query** the busy times of one or more calendars between two moments.

Without a **Calendar ID**, the node uses your main calendar (`primary`). **Update** only changes the fields you fill; the rest of the event stays as it is. **List** expands recurring events into single occurrences and sorts them by start time, up to **Max results** (50 by default).

When you fill **Source URL**, it is added at the end of the description as `Source: …`, so an event created from a booking page or a webinar sign-up keeps the link.

## When to use it

* Turn a booking confirmation, event page or deadline you are reading into a calendar event.
* Send yourself a morning summary of today's events.
* Check free/busy before proposing a meeting slot.
* Use [Microsoft 365](/nodes/builtin/integration/microsoft-graph/) instead for an Outlook calendar.

## Inputs and settings

Call the Google Calendar API yourself with the HTTP Request node, and pick the same connection in its **Credential** field.

* For a timed event, fill **Start (date-time)** and **End (date-time)**, for example `2026-09-10T09:00:00`, and set **Time Zone** (for example `Europe/Paris`) so the time is not misread.
* For an all-day event, fill **Start (all-day date)** and **End (all-day date)** instead, as `YYYY-MM-DD`. The end day is not included: a one-day event on 10 September ends on `2026-09-11`.
* **Time min** and **Time max** need a full date-time with a time zone offset, for example `2026-09-10T00:00:00Z` or `2026-09-10T00:00:00+02:00`.
* **Recurrence** takes one rule per entry, for example `RRULE:FREQ=WEEKLY;BYDAY=MO;COUNT=8` for eight Mondays.

## Outputs

* **Create**, **Update** and **Get** return the event, including its `id` (reuse it in **Event ID**) and `htmlLink` (a link that opens it in Google Calendar).
* **Event → List** returns the events in `items`. Use [Split Out](/nodes/builtin/datatransformation/splitout/) on `items` to get one item per event.
* **Calendar → List** returns your calendars in `items`, each with its `id`.
* **Free/busy → Query** returns, for each calendar, its `busy` periods with `start` and `end`.
* **Delete** returns `success: true`.

## Dependencies and credentials

* **Credential** (connection, OAuth2): required. See [Create a connection](/app/connections/).

Google Calendar connects by signing in to your Google account (OAuth). You first create your own Google OAuth client once, with the Google Calendar API enabled: follow [Create your OAuth client](/app/connections/oauth-client/#google). Then create a Google Calendar credential, paste the **Client ID** and **Client Secret**, click **Check connection** and approve the Google window. AWFlow asks to read and edit your events and to read your calendars. The sign-in is kept and refreshed for you. See also [Create a credential](/app/connections/create/).

## Example workflow

1. A [Context Menu](/nodes/builtin/trigger/contextmenu/) trigger runs when you right-click a webinar page.
2. [Get All Text](/nodes/extension/getalltext/) reads the page.
3. [Information Extractor](/nodes/builtin/ai/aiagents/informationextractornode/) pulls out `title`, `start` and `end` as date-times.
4. Google Calendar, **Event → Create**, **Title** `{{ $input.title }}`, **Start (date-time)** `{{ $input.start }}`, **End (date-time)** `{{ $input.end }}`, **Time Zone** `Europe/Paris`, **Source URL** `{{ $('Context Menu').pageUrl }}`.

## Common issues

* **The event is at the wrong time.** The start and end have no time zone. Set **Time Zone**, or write the offset in the date-time, such as `2026-09-10T09:00:00+02:00`.
* **"Google Calendar Error: … Not Found".** The **Event ID** does not exist in this **Calendar ID**. Check both; an event from another calendar needs that calendar's id.
* **"… Bad Request" on Event → List or Free/busy.** **Time min** or **Time max** lacks a time zone offset. Add `Z` or `+02:00` at the end.
* **"… insufficient authentication scopes" or a 403 error.** The Google Calendar API is not enabled for your OAuth client, or the sign-in predates a permission change. Enable the API, then click **Check connection** again on the credential.

## Related nodes

* [Gmail](/nodes/builtin/integration/gmail/): email the agenda.
* [Information Extractor](/nodes/builtin/ai/aiagents/informationextractornode/): read dates from a page.
* [Format Date](/nodes/builtin/datatransformation/datetime/formatdate/): turn dates into the format the fields expect.
* [Microsoft 365](/nodes/builtin/integration/microsoft-graph/): Outlook calendar instead.