google-calendar-book-meeting implementation guide

---
availability: INSTALLABLE
installation_asset_uuid: 01417f3b-3b4d-4405-9303-0399ddae4e45
description: Create a meeting, invite attendees, and add a video link in one go.
name: Book a Meeting
purple_chat_link: https://marketplace.moveworks.com/purple-chat?conversation=%7B%22messages%22%3A%5B%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Book+a+meeting+on+Google+Calendar+with+Sarah+about+the+Q4+Roadmap+for+30+minutes+tomorrow+at+10+AM.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ESearching+for+employees+named+%3Cb%3ESarah%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22moveworks%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI+found+two+people+named+%3Cb%3ESarah%3C%2Fb%3E.+Which+one+should+I+invite%3F%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESarah+Jenkins%3C%2Fb%3E+%28Finance+Manager%29%3C%2Fli%3E%3Cli%3E%3Cb%3ESarah+Miller%3C%2Fb%3E+%28Product+Lead%29%3C%2Fli%3E%3C%2Ful%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Sarah+Miller%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22%3Cp%3EOkay%2C+I%27ve+prepared+the+calendar+invitation%3A%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESubject%3A%3C%2Fb%3E+Q4+Roadmap%3C%2Fli%3E%3Cli%3E%3Cb%3EAttendees%3A%3C%2Fb%3E+Sarah+Miller%3C%2Fli%3E%3Cli%3E%3Cb%3EDate%3A%3C%2Fb%3E+Tomorrow%2C+October+24%3C%2Fli%3E%3Cli%3E%3Cb%3ETime%3A%3C%2Fb%3E+10%3A00+AM+-+10%3A30+AM%3C%2Fli%3E%3Cli%3E%3Cb%3EPlatform%3A%3C%2Fb%3E+Google+Meet%3C%2Fli%3E%3C%2Ful%3E%3Cp%3E%3Cstrong%3EReady+to+send+this+out%3F%3C%2Fstrong%3E%3C%2Fp%3E%22%7D%2C%7B%22buttons%22%3A%5B%7B%22buttonText%22%3A%22Send+Invite%22%2C%22style%22%3A%22filled%22%7D%2C%7B%22buttonText%22%3A%22Edit+Details%22%2C%22style%22%3A%22outlined%22%7D%2C%7B%22buttonText%22%3A%22Cancel%22%2C%22style%22%3A%22outlined%22%7D%5D%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Send+Invite%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ECreating+the+calendar+event+in+%3Cb%3EGoogle+Calendar%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22google-calendar%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EDone%21+I%27ve+scheduled+the+meeting+and+sent+the+invitation+to+%3Cb%3ESarah+Miller%3C%2Fb%3E.%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22google-calendar%22%2C%22citationTitle%22%3A%22Q4+Roadmap+Meeting%22%7D%5D%7D%5D%7D%5D%7D
solution_tags:
- Finance - Other
- HR - Other
- IT
- Productivity
- Sales
systems:
- google-calendar
---

# Description

Book a meeting directly from your AI Assistant — set the time, invite attendees, add a description, and include a video call link, all in one conversation.

# User Experience Preview

Please refer to the following [**Purple Chat**](https://marketplace.moveworks.com/purple-chat?conversation=%7B%22messages%22%3A%5B%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Book+a+meeting+on+Google+Calendar+with+Sarah+about+the+Q4+Roadmap+for+30+minutes+tomorrow+at+10+AM.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ESearching+for+employees+named+%3Cb%3ESarah%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22moveworks%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI+found+two+people+named+%3Cb%3ESarah%3C%2Fb%3E.+Which+one+should+I+invite%3F%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESarah+Jenkins%3C%2Fb%3E+%28Finance+Manager%29%3C%2Fli%3E%3Cli%3E%3Cb%3ESarah+Miller%3C%2Fb%3E+%28Product+Lead%29%3C%2Fli%3E%3C%2Ful%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Sarah+Miller%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22%3Cp%3EOkay%2C+I%27ve+prepared+the+calendar+invitation%3A%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESubject%3A%3C%2Fb%3E+Q4+Roadmap%3C%2Fli%3E%3Cli%3E%3Cb%3EAttendees%3A%3C%2Fb%3E+Sarah+Miller%3C%2Fli%3E%3Cli%3E%3Cb%3EDate%3A%3C%2Fb%3E+Tomorrow%2C+October+24%3C%2Fli%3E%3Cli%3E%3Cb%3ETime%3A%3C%2Fb%3E+10%3A00+AM+-+10%3A30+AM%3C%2Fli%3E%3Cli%3E%3Cb%3EPlatform%3A%3C%2Fb%3E+Google+Meet%3C%2Fli%3E%3C%2Ful%3E%3Cp%3E%3Cstrong%3EReady+to+send+this+out%3F%3C%2Fstrong%3E%3C%2Fp%3E%22%7D%2C%7B%22buttons%22%3A%5B%7B%22buttonText%22%3A%22Send+Invite%22%2C%22style%22%3A%22filled%22%7D%2C%7B%22buttonText%22%3A%22Edit+Details%22%2C%22style%22%3A%22outlined%22%7D%2C%7B%22buttonText%22%3A%22Cancel%22%2C%22style%22%3A%22outlined%22%7D%5D%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Send+Invite%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ECreating+the+calendar+event+in+%3Cb%3EGoogle+Calendar%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22google-calendar%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EDone%21+I%27ve+scheduled+the+meeting+and+sent+the+invitation+to+%3Cb%3ESarah+Miller%3C%2Fb%3E.%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22google-calendar%22%2C%22citationTitle%22%3A%22Q4+Roadmap+Meeting%22%7D%5D%7D%5D%7D%5D%7D) for a sample conversational experience between a user and the AI Assistant for this plugin.

# Prerequisites

Before installing and using the **Book a Meeting** plugin, ensure the following requirements are met.

### 1. Google Calendar Connector

This plugin requires an active **Google Calendar connector** configured with the OAuth 2.0 Authorization Code (User Consent Auth) flow.

- If you have not already set up the connector, follow the [**Google Calendar Connector Guide**](https://marketplace.moveworks.com/connectors/google-calendar) before proceeding.
- The connector must be fully configured and tested before installing this plugin.

### 2. Zoom Connector (Optional)

If you want the plugin to automatically create a Zoom meeting link when booking, a **Zoom connector** must also be configured.

- If you do not have a Zoom connector, the plugin will still book the meeting in Google Calendar — it just won't attach a video conferencing link.
- To set up the Zoom connector, follow the [**Zoom Connector Guide**](https://claude.ai/chat/005dca93-ffec-40c2-82a4-7f1284f9a0aa#).

### 3. Plugin Installation

Once the connector is ready, follow the [**plugin installation documentation**](https://help.moveworks.com/docs/ai-agent-marketplace-installation) for steps on how to install and activate the plugin in Agent Studio.

### 4. Google Workspace System Requirements

### a. End User Permissions

To book a meeting through this plugin, end users must have:

- A licensed Google Workspace account with Google Calendar enabled
- Permission to create events on their own primary calendar

Note: The plugin automatically retrieves the authenticated user's timezone from their Google Calendar settings and applies it when creating the event. No manual setup is required.

### b. API Permissions

The Google Calendar connector uses **delegated permissions** to create calendar events on behalf of the authenticated user. The following permission is required for this plugin:

| Permission | Purpose |
| --- | --- |
| `https://www.googleapis.com/auth/calendar` | Create and update calendar events on the user's primary calendar |

# Implementation Details

This plugin works by making a sequence of API calls to book the meeting in Google Calendar and, if Zoom is selected as the video conferencing provider, create a Zoom meeting and attach the link to the calendar event.

### Visual Representation of How the Plugin Works

![image.png](Book%20a%20Meeting/image.png)

### API Details

This plugin uses up to four API calls depending on whether Zoom is selected as the video conferencing provider.

### API #1: Get User's Primary Calendar

Retrieves the authenticated user's primary calendar details, including their timezone. This is used to correctly set the event start and end times in the user's local timezone.

```bash
curl --request GET \
  --url 'https://www.googleapis.com/calendar/v3/calendars/primary/events' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json'
```

---

### API #2: Create Calendar Event

Creates the meeting in the authenticated user's primary Google Calendar with all the provided details — title, description, attendees, recurrence, visibility, and event type.

```bash
curl --request POST \
  --url 'https://www.googleapis.com/calendar/v3/calendars/primary/events' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "summary": "{{event_title}}",
    "description": "{{event_description}}",
    "start": {"dateTime": "{{start_date_time}}", "timeZone": "{{user_time_zone}}"},
    "end": {"dateTime": "{{end_date_time}}", "timeZone": "{{user_time_zone}}"},
    "attendees": [{"email": "{{attendee_email}}", "optional": false}, ...],
    "recurrence": ["{{recurrence_rules}}"],
    "transparency": "{{show_as}}",
    "visibility": "{{visibility}}",
    "eventType": "{{event_type}}"
  }'
```

**Input Arguments:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `start_date_time` | string | Yes | Start time in ISO 8601 format, excluding timezone. Example: `2025-12-20T10:00:00` |
| `end_date_time` | string | Yes | End time in ISO 8601 format, excluding timezone. Example: `2025-12-20T10:30:00` |
| `user_time_zone` | string | Yes | The user's timezone in IANA format, retrieved from API #1. Example: `America/Los_Angeles` |
| `event_title` | string | Yes | Title of the event |
| `event_description` | string | No | Description or agenda for the event |
| `required_attendees` | list of strings | No | Email addresses of required attendees. Does not include the current user |
| `optional_attendees` | list of strings | No | Email addresses of optional attendees. Does not include the current user |
| `recurrence_rules` | list of strings | No | Recurrence rules in iCal RFC 5545 format. Example: `RRULE:FREQ=WEEKLY;INTERVAL=2`. Defaults to one-time event if not provided |
| `show_as` | string | Yes | Calendar status — `opaque` (busy) or `transparent` (free). Defaults to `opaque` |
| `visibility` | string | Yes | Event visibility — `default` or `private`. Defaults to `default` |
| `is_all_day` | boolean | Yes | Whether the event is an all-day event. Defaults to `false` |
| `event_type` | string | Yes | Type of event — `default`, `focusTime`, or `outOfOffice`. Defaults to `default` |

**Key nuances:**

- The current user is automatically added as the organizer — they do not need to be included in the attendees list.
- For `focusTime` and `outOfOffice` event types, attendees are not added even if provided.

### API #3: Create Zoom Meeting *(conditional — only runs if Zoom is selected)*

If the user requests a Zoom link, a Zoom meeting is created using the Zoom connector before the calendar event is updated.

```bash
curl --request POST \
  --url 'https://api.zoom.us/v2/users/me/meetings' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "topic": "{{meeting_title}}",
    "type": 1
  }'
```

### API #4: Update Calendar Event with Zoom Link *(conditional — only runs if Zoom is selected)*

After the Zoom meeting is created, the calendar event is updated via a PATCH request to embed the Zoom join link, meeting ID, and passcode in the event description.

```bash
curl --request PATCH \
  --url 'https://www.googleapis.com/calendar/v3/calendars/primary/events/{{event_id}}' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'If-Match: {{etag}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "description": "{{zoom_details}}",
    "location": "{{zoom_join_url}}"
  }'
```

Now that you understand how the plugin works under the hood, let's walk through what it can and can't do. We recommend reading both sections before going live to ensure the best experience for your users.

# What Is In Scope for This Plugin?

This plugin supports the following capabilities:

- Book a one-time or recurring meeting on the authenticated user's primary Google Calendar
- Add required and optional attendees by name or email address.
- Attach a **Zoom meeting link** automatically if Zoom is selected as the video conferencing provider.
- Create **Focus Time** and **Out of Office** blocks in addition to standard meetings.
- Support **all-day events.**
- Set event visibility (`default` or `private`) and calendar status (`busy` or `free`).

# What Is Out of Scope for This Plugin?

This plugin does **not** support the following:

- Google Meet is not currently supported as a video conferencing option — only Zoom or no video link.
- Optional attendees are not currently supported — all attendees are added as required
- Booking on behalf of another user's calendar — events are always created on the authenticated user's primary calendar.
- Updating or cancelling an existing meeting — handled by separate Update a Meeting and Cancel a Meeting plugins.
- Adding rooms to a meeting - needs Recommend Rooms plugin to be enabled as well.