Reference · Tools

Google Calendar

Consume the Google Calendar API to manage calendars and events.

Action Productivity v1

The Google Calendar node lets you read and write to Google Calendar directly from a BusyBot workflow — creating events with attendees, reminders, and Google Meet links, querying free/busy windows, and managing recurring events. A common use case is automatically booking a calendar slot when a form is submitted, complete with a generated Meet conference link. It covers the full event lifecycle: create, get, list, update, and delete.

Node type
Action
Parameters
77
Outputs
Output, Error
Credentials
Google Calendar OAuth2

Google Calendar

Create, get, update, delete calendar events and check availability.

Overview

Google Calendar tool manages calendars and events via the Google Calendar API. Calendar operations: check availability (POST /freeBusy with outputFormat options: availability, bookedSlots, raw). Event operations: create an event (POST /calendars/{calendarId}/events with start/end times, attendees, reminders, recurrence RRULE, conference data, color, visibility, transparency, location, guest permissions, allDay support), delete an event (DELETE /calendars/{calendarId}/events/{eventId}), get a single event (GET /calendars/{calendarId}/events/{eventId}), get many events (GET /calendars/{calendarId}/events with nextPageToken pagination, recurringEventHandling: expand/first/next), update an event (PATCH /calendars/{calendarId}/events/{eventId} with attendees mode: add/replace, modifyTarget: instance/event for recurring events). Calendar ID defaults to “primary”. Conference data uses hangoutsMeet with auto-generated UUID requestId. RRULE built from repeatFrequency/repeatCount/repeatUntil or raw rrule string. Output keys sorted: id, summary, start, end, attendees, creator, organizer, description, location, created, updated.

Category: Productivity
Tool Name: google_calendar
Version: 1

Appearance: Icon: lucide-Calendar | Color: #4285F4

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Google Calendar OAuth2 credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Calendarcalendar
Eventevent

Operations

ResourceOperationValueDescription
CalendarAvailabilityavailabilityCheck when a calendar is free or busy during a time window.
EventCreatecreateAdd an event to a calendar.
EventDeletedeleteDelete an event from a calendar.
EventGetgetRetrieve a single event by ID.
EventGet ManygetAllRetrieve many events from a calendar.
EventUpdateupdateUpdate an event in a calendar.

Parameters

Calendar: Availability (availability)

ParameterTypeRequiredDefaultDescription
Calendar IDstringNoprimaryThe ID of the calendar to check availability for. Use “primary” for the primary calendar. Supports expressions like {{ $json.calendarId }}.
Time MinstringYesLower bound (inclusive) of the interval to check (ISO8601, e.g. “2026-03-10T00:00:00Z”).
Time MaxstringYesUpper bound (exclusive) of the interval to check (ISO8601, e.g. “2026-03-10T23:59:59Z”).
Output FormatoptionsNoavailabilityHow to format the availability response.
Options: availability (returns { available: true/false } — whether the calendar is free), bookedSlots (returns an array of busy time slots with start and end times), raw (returns the full raw freeBusy API response)
Time ZonestringNoIANA timezone identifier (e.g. “America/New_York”). If omitted, UTC is used.

Event: Create (create)

ParameterTypeRequiredDefaultDescription
Calendar IDstringNoprimaryThe ID of the calendar to create the event in. Use “primary” for the primary calendar.
TitlestringNoTitle of the event. Supports expressions like {{ $json.subject }}.
StartstringYesEvent start date/time as ISO8601 (e.g. “2026-03-10T09:00:00”). For all-day events use “YYYY-MM-DD”.
EndstringYesEvent end date/time as ISO8601 (e.g. “2026-03-10T10:00:00”). For all-day events use “YYYY-MM-DD”.
All DaybooleanNofalseWhether this is an all-day event. If true, start and end should be dates (YYYY-MM-DD).
Time ZonestringNoIANA timezone for event start/end (e.g. “America/New_York”). Defaults to UTC if not set.
DescriptionstringNoDescription of the event. Supports expressions.
LocationstringNoGeographic location of the event as free-form text.
Send UpdatesoptionsNononeWhether to send notifications about the event to guests.
Options: all (notifications are sent to all guests), externalOnly (notifications are sent to non-Google Calendar guests only), none (no notifications are sent)
AttendeesfixedCollectionNo{"values":[]}List of attendees to invite. Add one entry per attendee.
— EmailstringNoAttendee email address.
— OptionalbooleanNofalseWhether this attendee is optional.
Use Default RemindersbooleanNotrueWhether to use the calendar’s default reminders for this event.
RemindersfixedCollectionNo{"values":[]}Custom reminder overrides. Add one entry per reminder. (shown when Use Default Reminders is false)
— MethodoptionsNoemailReminder notification method.
Options: email, popup
— Minutes BeforenumberNo30Minutes before the event to send the reminder.
Use Default ConferencebooleanNofalseWhether to automatically add a Google Meet conference link.
Repeat FrequencyoptionsNoHow often the event repeats.
Options: leave empty for a one-off event, DAILY, WEEKLY, MONTHLY, YEARLY
Repeat CountnumberNo0Number of times the event repeats (do not combine with Repeat Until).
Repeat UntilstringNoDate until which the event repeats (ISO8601, do not combine with Repeat Count).
RRULE (Raw)stringNoRaw RRULE string (e.g. “FREQ=WEEKLY;COUNT=10”). Overrides Repeat Frequency/Count/Until.
Color IDoptionsNoColor of the event.
Options: leave empty for the calendar default, 1 (Lavender), 2 (Sage), 3 (Grape), 4 (Flamingo), 5 (Banana), 6 (Tangerine), 7 (Peacock), 8 (Graphite), 9 (Blueberry), 10 (Basil), 11 (Tomato)
VisibilityoptionsNoVisibility of the event.
Options: leave empty for the calendar default, default, public, private, confidential
Show Me AsoptionsNoWhether this event blocks time on the calendar (busy vs free).
Options: leave empty for the calendar default, opaque (busy), transparent (free)
Guests Can ModifybooleanNofalseWhether guests can modify the event.
Guests Can Invite OthersbooleanNotrueWhether guests can invite other people to the event.
Guests Can See Other GuestsbooleanNotrueWhether guests can see other guests in the event.

Event: Delete (delete)

ParameterTypeRequiredDefaultDescription
Calendar IDstringNoprimaryThe ID of the calendar containing the event to delete.
Event IDstringYesThe ID of the event to delete. Supports expressions.
Send UpdatesoptionsNononeWhether to send cancellation notifications to guests.
Options: all, externalOnly, none

Event: Get (get)

ParameterTypeRequiredDefaultDescription
Calendar IDstringNoprimaryThe ID of the calendar containing the event to retrieve.
Event IDstringYesThe ID of the event to retrieve. Supports expressions.
Time ZonestringNoIANA timezone for the response. Defaults to UTC if not set.

Event: Get Many (getAll)

ParameterTypeRequiredDefaultDescription
Calendar IDstringNoprimaryThe ID of the calendar to retrieve events from.
Time MinstringNoLower bound (inclusive) for event start time filter (ISO8601). Leave blank for no lower bound.
Time MaxstringNoUpper bound (exclusive) for event start time filter (ISO8601). Leave blank for no upper bound.
Time ZonestringNoIANA timezone for timeMin/timeMax and for the response (e.g. “America/New_York”).
Order ByoptionsNoThe order of the events returned. startTime is only available when singleEvents is true.
Options: leave empty for the API default, startTime, updated
QuerystringNoFree text search terms to find events that match. Supports expressions.
Show DeletedbooleanNofalseWhether to include deleted events in the results.
Recurring Event HandlingoptionsNoexpandHow to handle recurring events in the results.
Options: expand (expand recurring events into individual instances; recommended), first (return only events created within the Time Min–Time Max window), next (for each recurring event, make an extra API call to get only the next upcoming instance)
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo20Maximum number of events to return. Between 1 and 2500. (shown when Return All is false)

Event: Update (update)

ParameterTypeRequiredDefaultDescription
Calendar IDstringNoprimaryThe ID of the calendar containing the event to update.
Event IDstringYesThe ID of the event to update. For recurring event instances this is the instance ID (contains ”_”).
TitlestringNoNew title for the event. Leave blank to keep existing.
StartstringNoNew start date/time as ISO8601. Leave blank to keep existing.
EndstringNoNew end date/time as ISO8601. Leave blank to keep existing.
All DaybooleanNofalseWhether this is an all-day event. If true, start and end should be dates (YYYY-MM-DD).
Time ZonestringNoIANA timezone for event start/end (e.g. “America/New_York”). Defaults to UTC if not set.
DescriptionstringNoNew description for the event. Leave blank to keep existing.
LocationstringNoNew location for the event. Leave blank to keep existing.
Send UpdatesoptionsNononeWhether to send update notifications to guests.
Options: all, externalOnly, none
Attendees ModeoptionsNoreplaceHow to handle attendees during update.
Options: add (merge new attendees with existing list), replace (replace the entire attendees list)
AttendeesfixedCollectionNo{"values":[]}List of attendees. Behavior depends on Attendees Mode.
— EmailstringNoAttendee email address.
— OptionalbooleanNofalseWhether this attendee is optional.
Use Default RemindersbooleanNotrueWhether to use the calendar’s default reminders for this event.
RemindersfixedCollectionNo{"values":[]}Custom reminder overrides. Add one entry per reminder. (shown when Use Default Reminders is false)
— MethodoptionsNoemailReminder notification method.
Options: email, popup
— Minutes BeforenumberNo30Minutes before the event to send the reminder.
Repeat FrequencyoptionsNoHow often the event repeats.
Options: leave empty to keep the current recurrence, DAILY, WEEKLY, MONTHLY, YEARLY
Repeat CountnumberNo0Number of times the event repeats (do not combine with Repeat Until).
Repeat UntilstringNoDate until which the event repeats (ISO8601, do not combine with Repeat Count).
RRULE (Raw)stringNoRaw RRULE string (e.g. “FREQ=WEEKLY;COUNT=10”). Overrides Repeat Frequency/Count/Until.
Color IDoptionsNoColor of the event.
Options: leave empty for no change, 1 (Lavender), 2 (Sage), 3 (Grape), 4 (Flamingo), 5 (Banana), 6 (Tangerine), 7 (Peacock), 8 (Graphite), 9 (Blueberry), 10 (Basil), 11 (Tomato)
VisibilityoptionsNoVisibility of the event.
Options: leave empty for no change, default, public, private, confidential
Show Me AsoptionsNoWhether this event blocks time on the calendar (busy vs free).
Options: leave empty for no change, opaque (busy), transparent (free)
Guests Can ModifybooleanNofalseWhether guests can modify the event.
Guests Can Invite OthersbooleanNotrueWhether guests can invite other people to the event.
Guests Can See Other GuestsbooleanNotrueWhether guests can see other guests in the event.
Modify TargetoptionsNoinstanceFor recurring event instances (event ID contains ”_”): whether to modify just this instance or the entire series.
Options: instance (modify only this specific instance of the recurring event), event (modify the entire recurring event series)

All Operations

ParameterTypeRequiredDefaultDescription
AuthenticationoptionsNooAuth2Authentication method to use.
Options: oAuth2 (OAuth2, recommended), serviceAccount (Service Account)
Google AccountcredentialNoConnect or select your Google account. (shown when Authentication is oAuth2)
Service Account EmailstringYesThe email address of the Google service account, for example my-service-account@project.iam.gserviceaccount.com. (shown when Authentication is serviceAccount)
Private KeystringYesThe private key from the service account JSON key file. Paste the full PEM block, including the BEGIN and END lines. (shown when Authentication is serviceAccount)
Max ConcurrencynumberNo5Maximum number of items to process concurrently. Between 1 and 20.

Output Data

The API result is merged into the item JSON, so the incoming fields pass through except where a result field uses the same name. Binary data on the input item is not carried to the output.

Most operations produce exactly one output item per input item. Two of them fan out:

OperationOutput
Calendar availability, Output Format availabilityOne item carrying availabletrue when nothing is booked in the window, false otherwise.
Calendar availability, Output Format bookedSlotsFans out — one item per busy slot, each with the slot’s start and end. A free window still emits one item, carrying the input JSON unchanged.
Calendar availability, Output Format rawOne item carrying the full freeBusy response.
Event create, get, updateOne item carrying the event record.
Event deleteOne item carrying success: true. The API returns no body for a delete.
Event getAllFans out — one item per event. A range with no events still emits one item, carrying the input JSON unchanged.

Event records are returned with their most useful keys first: id, summary, start, end, attendees, creator, organizer, description, location, created, updated, followed by the remaining Google Calendar fields.

Because the fan-out operations already emit one item per record, you do not need a Split Out node after them. Reference the result downstream by expression, e.g. {{ $json.id }} or {{ $json.available }}.

Usage Examples

  • Create a new Google Calendar event with attendees
  • Delete an event from a calendar
  • Get a single event by ID
  • List all events in a date range
  • Update an event title or time
  • Check if a calendar is free during a time window
  • Create a recurring weekly meeting
  • Add a Google Meet link to an event
  • Get all events in the next 30 days

Example Configuration

Create an event with two attendees, a Google Meet link and a custom reminder:

{
  "type": "google_calendar",
  "parameters": {
    "authentication": "oAuth2",
    "resource": "event",
    "operation": "create",
    "calendarId": "primary",
    "summary": "{{ $json.title }}",
    "start": "{{ $json.startsAt }}",
    "end": "{{ $json.endsAt }}",
    "timeZone": "America/New_York",
    "description": "{{ $json.agenda }}",
    "location": "Room 4B",
    "sendUpdates": "all",
    "attendees": {
      "values": [
        { "email": "{{ $json.organizerEmail }}", "optional": false },
        { "email": "notes@example.com", "optional": true }
      ]
    },
    "useDefaultReminders": false,
    "reminders": {
      "values": [
        { "method": "popup", "minutes": 15 }
      ]
    },
    "useDefaultConference": true,
    "colorId": "7",
    "showMeAs": "opaque"
  }
}

Create an all-day event that repeats weekly for 10 weeks:

{
  "type": "google_calendar",
  "parameters": {
    "resource": "event",
    "operation": "create",
    "calendarId": "primary",
    "summary": "Sprint planning",
    "allDay": true,
    "start": "2026-03-10",
    "end": "2026-03-11",
    "repeatFrequency": "WEEKLY",
    "repeatCount": 10,
    "visibility": "private"
  }
}

List the events in a date range, one item per event:

{
  "type": "google_calendar",
  "parameters": {
    "resource": "event",
    "operation": "getAll",
    "calendarId": "{{ $json.calendarId }}",
    "timeMin": "{{ $json.from }}",
    "timeMax": "{{ $json.to }}",
    "orderBy": "startTime",
    "recurringEventHandling": "expand",
    "returnAll": false,
    "limit": 100
  }
}

Check whether a calendar is free in a window:

{
  "type": "google_calendar",
  "parameters": {
    "resource": "calendar",
    "operation": "availability",
    "calendarId": "{{ $json.email }}",
    "timeMin": "{{ $json.slotStart }}",
    "timeMax": "{{ $json.slotEnd }}",
    "outputFormat": "availability",
    "timeZone": "Europe/London"
  }
}

Move a single instance of a recurring event and notify the guests:

{
  "type": "google_calendar",
  "parameters": {
    "resource": "event",
    "operation": "update",
    "calendarId": "primary",
    "eventId": "{{ $json.id }}",
    "start": "{{ $json.newStart }}",
    "end": "{{ $json.newEnd }}",
    "modifyTarget": "instance",
    "attendeesMode": "add",
    "sendUpdates": "all"
  }
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

Manage Google Calendar — create, read, update, delete events and check calendar availability.

Frequently asked questions

What credentials do I need to connect this node to my Google account?

The node uses Google Calendar OAuth2 (credential type: googleCalendarOAuth2Api). You'll need to create OAuth2 credentials in Google Cloud Console with the Calendar API enabled, then authorize the connection through BusyBot's credential manager. The node will default to the 'primary' calendar of the authenticated account unless you specify a different Calendar ID.

How does checking availability work, and what formats does it return?

The availability check hits the /freeBusy endpoint and supports three output formats: 'availability' (a simple yes/no summary), 'bookedSlots' (a list of busy time ranges), or 'raw' (the full API response). Choose the format that suits your downstream logic — 'bookedSlots' is useful if you need to display conflicts, while 'availability' is enough for a simple gate check.

Can I create recurring events, and how do I define the recurrence rule?

Yes. You can define recurrence either by setting repeatFrequency, repeatCount, and repeatUntil fields — which the node assembles into an RRULE — or by supplying a raw RRULE string directly if you need full control. When listing or updating recurring events, the recurringEventHandling option lets you choose between expanding all instances, returning only the first, or returning the next upcoming one.

When I update a recurring event, does the change apply to all instances or just one?

You control this with the modifyTarget parameter, which accepts either 'instance' (only the specific occurrence) or 'event' (the entire recurring series). You can also control how attendees are handled on update: 'add' merges new attendees with existing ones, while 'replace' overwrites the attendee list entirely.

What does the node return, and how is the output structured?

The node has two outputs: Output (for successful responses) and Error (for failures, so you can route error-handling logic separately without stopping the workflow). Successful event responses return keys in a consistent sorted order: id, summary, start, end, attendees, creator, organizer, description, location, created, and updated. Conference data for Google Meet is generated automatically using a UUID-based requestId when you enable conference creation.

Build with the Google Calendar node

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Google Calendar OAuth2 credentials first.

Open BusyBot

Last updated . Spotted something wrong? Tell us.