---
title: "How to Set Up a Google Meet Meeting Bot with Unified"
img: https://s3.us-east-2.amazonaws.com/unified-article-images/how_to_set_up_a_google_meet_meeting_bot_with_unified-icon.webp
date: 2026-11-07T22:12:00.000Z
updated: "2026-11-09T14:48:38.056Z"
tag: Guides
integrations: googlemeetmeetingbot
description: "Google Meet (meeting bot) (`googlemeetmeetingbot`) is the integration that gives you a `calendarbot` and `calendarbotevent`s for Google Meet meetings. It is..."
url: "https://docs.unified.to/guides/how_to_set_up_a_google_meet_meeting_bot_with_unified"
---

# How to Set Up a Google Meet Meeting Bot with Unified
------
_November 7, 2026_

## Overview


**Google Meet (meeting bot)** (`googlemeetmeetingbot`) is the integration that gives you a `calendar_bot` and `calendar_botevent`s for Google Meet meetings. It is separate from the **Google Meet** integration: existing Google Meet connections don't change, and your end users connect Google Meet (meeting bot) on its own.


**No bot joins the call.** A Google Meet meeting bot is a monitor: nothing is added to the meeting, and no audio, video or chat is captured. Unified follows the meeting through the Google Workspace Events API and the Meet REST API:

- while the meeting runs: meeting started and ended, participants joined and left, recording started and stopped
- after the meeting: `RECORDING_READY` (the bot's `recording_id` is set) and the Meet transcript as `TRANSCRIPT_RECEIVED` events, one per transcript entry

The same connection also gives you Google Meet's `calendar_calendar`, `calendar_event`, `calendar_busy` and `calendar_recording` objects. They work as on the Google Meet integration, and their scopes are requested only when you select their permissions.


For how to create bots and receive events, see [How to Build a Meeting Bot with Unified](https://docs.unified.to/guides/how_to_build_a_meeting_bot_with_unified_zoom_microsoft_teams_webex_google_meet).


---


## ⚠️ Important: your own Google Cloud project


Google Meet (meeting bot) needs **your own Google OAuth client**. Unified has no shared credentials for this integration.


Meet events are delivered through Pub/Sub, and Google requires the Pub/Sub topic to be in the **same Google Cloud project as the OAuth client** that creates the event subscription. So the OAuth client your users authorize, the Pub/Sub topic and the APIs all belong to one project, and you give Unified a service account that can manage Pub/Sub in that project.


---


## What you'll need

- A Google Cloud project you can administer
- End users on Google Workspace accounts who own (usually organize) the meetings you want to follow
- Your Unified region: US (`api.unified.to`), EU (`api-eu.unified.to`) or AU (`api-au.unified.to`)

---


## Step 1: Enable the APIs


In the Google Cloud console, in your project, enable:

- **Google Meet REST API**
- **Google Workspace Events API**
- **Cloud Pub/Sub API**

If you also select calendar permissions (to create bots from calendar events, or to list calendars, events or free/busy), enable the **Google Calendar API** too.


---


## Step 2: Create the OAuth client

1. Configure the OAuth consent screen for the project.
2. Create an OAuth client ID of type **Web application**.
3. Add the Unified redirect URI for your region:
    - US: `https://api.unified.to/oauth/code`
    - EU: `https://api-eu.unified.to/oauth/code`
    - AU: `https://api-au.unified.to/oauth/code`
4. Copy the **Client ID** and **Client Secret**.

### Scopes


| Scope                                                      | Unified permission                                                                             | Why                                                                                       |
| ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| `https://www.googleapis.com/auth/meetings.space.readonly`  | `calendar_bot_read`, `calendar_bot_write`, `calendar_botevent_read`, `calendar_recording_read` | Find the meeting space; read conference records, participants, recordings and transcripts |
| `https://www.googleapis.com/auth/calendar.events.readonly` | `calendar_bot_write`, `calendar_event_read`                                                    | Create a bot from a calendar `event_id`; list events                                      |
| `openid`                                                   | `calendar_botevent_read`                                                                       | Identify the connected user for the event subscription                                    |
If you select other permissions, add the scopes the Google Meet integration uses for them: `calendar.readonly` (`calendar_calendar_read`), `calendar` (`calendar_calendar_write`), `calendar.events` (`calendar_event_write`), and `calendar.freebusy` with `calendar.events.freebusy` (`calendar_busy_read`).


`meetings.space.readonly` is a sensitive scope: Google requires your app to be verified before users outside your organization can authorize it.


---


## Step 3: Create the service account


Unified uses a service account to create and manage the Pub/Sub topic and subscription for each connection in your OAuth client's project. The service account can belong to any project, as long as it has Pub/Sub admin rights in the OAuth client's project.

1. In **IAM & Admin → Service accounts**, create a service account.
2. In the OAuth client's project, grant it a role that can administer Pub/Sub. Unified needs to get, create and delete topics, get and set a topic's IAM policy, and create and delete subscriptions. **Pub/Sub Admin** (`roles/pubsub.admin`) is the smallest built-in role with all of these (Pub/Sub Editor can't set IAM policy), or use a custom role with exactly those permissions. Unified's token for the service account uses the `cloud-platform` scope.
3. Create a **JSON key** for it and keep the file: you need its `client_email` and `private_key`.

---


## Step 4: Enter your credentials in Unified

1. In the Unified app, open **Integrations** and activate **Google Meet (meeting bot)**.
2. Enter the OAuth client's **Client ID** and **Client Secret**.
3. Enter the OAuth client's project ID in the **Google Cloud Project ID (of this OAuth client)** field.
4. Paste the service account's `private_key` (from `-----BEGIN PRIVATE KEY-----` to `-----END PRIVATE KEY-----`) in the **OAuth 2 X.509 Certificate (.PEM)** field.
5. Enter the service account's `client_email` in the **Service account email** field.
6. Select the permissions you need: `calendar_bot_read`, `calendar_bot_write` and `calendar_botevent_read` for bots, `calendar_event_read` to list events (creating a bot from an `event_id` needs only `calendar_bot_write`), and `calendar_recording_read` to read recordings.

The PEM and service account fields appear after you enter the client ID. Without the project ID and service account, creating the `calendar_botevent` webhook returns `400`.


---


## Step 5: Webhook setup


There is nothing to configure in Google Cloud beyond Steps 1–4. When you create the native `calendar_botevent` webhook on a connection, Unified:

1. creates a Pub/Sub topic for the connection in your project, and lets Google's Meet events service account publish to it;
2. creates a push subscription from that topic to the webhook;
3. creates a Google Workspace Events subscription on the connected user, for meeting started and ended, participant joined and left, recording started, stopped and ready, and transcript ready.

Google limits these subscriptions to 7 days. Unified renews them automatically by deleting and recreating the topic and both subscriptions, so events sent during that short switch-over are lost. Deleting the Unified webhook removes the subscription, the push subscription and the topic.


Pub/Sub pushes to `/webhook/googlemeetmeetingbot/{webhook_id}` without a signing token. Unified accepts a delivery only when it comes from this webhook's own Workspace Events subscription, and reads every meeting, participant, recording and transcript back from the Meet API with the connection's token before acting on it.


**One** **`calendar_botevent`** **webhook per connection.** Creating a second returns `409`. Create the webhook before the meeting starts, or the bot misses it.


**One events subscription per Google user.** If the same Google user has connected more than once, creating the webhook on a second connection returns `409`. Remove the other connection's webhook first.


---


## How end users connect


End users authorize **Google Meet (meeting bot)** through Unified's authorization flow (embedded authorization or the authorization link) with their Google account, and approve the scopes above. OAuth is the only way to connect: Google supports only user authentication for Meet event subscriptions.


---


## Test the setup

1. Create a `calendar_bot` with the Meet link (`meeting_url`, `https://meet.google.com/abc-mnop-xyz`), or with the `id` of a `calendar_event` listed on the same connection (`event_id`; the event must have a Meet link). Use the `id` exactly as the connection lists it: a bare Google Calendar event id is looked up on the user's primary calendar only. The bot is `READY`, or `IN_CALL_NOT_RECORDING` if a conference is already running.
2. Create a native webhook for `calendar_botevent` / `created` on the same connection.
3. Start the meeting as the connected user: expect `BOT_STATUS_CHANGE` to `IN_CALL_NOT_RECORDING` and `PARTICIPANT_JOINED` events. Start recording: expect `RECORDING_STARTED` and `BOT_STATUS_CHANGE` to `IN_CALL_RECORDING`.
4. End the meeting: expect `BOT_STATUS_CHANGE` to `CALL_ENDED`. Later, expect `RECORDING_READY` and `TRANSCRIPT_RECEIVED` events if the meeting was recorded or transcribed.
5. Read the recording with `GET /calendar/{connection_id}/recording/{recording_id}` on the same connection.

---


## Limits

- **Only meetings the connected user owns.** Google sends events only for meeting spaces the connected user owns, usually because they organized the Calendar event. A bot for someone else's meeting is created but stays `READY`.
- **Recordings and transcripts** exist only when someone in the meeting starts them, or the organizer turned on automatic recording or transcripts. Google saves them to the organizer's Drive.
- **Final status is** **`CALL_ENDED`****.** Meet doesn't say whether a recording or transcript will follow, so a Google Meet bot never moves to `DONE`. Watch for `RECORDING_READY`.
- **One conference per bot.** A bot follows the first conference held in its meeting space after it is created. A later meeting in the same space needs a new bot.
- **Unsupported features return** **`501`** (`Not supported by this integration: …`): `join_at`, and any `recording_config`. `automatic_leave` isn't used.
- **No live transcript, chat, media, webcam, screen-share or speaking events**, and no smart notes. Transcripts arrive after the meeting, and Unified reads up to 50 pages of 100 entries per transcript.
- **Suspended subscriptions.** If Google suspends the Workspace Events subscription, Unified only logs it; you aren't notified.
- **One active bot per meeting link** per connection: creating another while an earlier bot for exactly the same link is still active (not `CALL_ENDED`, `DONE` or `FATAL`) returns `409`.
- **Only** **`name`** **can be updated.** An update with `meeting_url` or `event_id` returns `400`.
- **Other errors on create:** `400` for malformed input, `404` when the calendar event or meeting space doesn't exist, and `422` when the calendar event has no Meet link.
- **Status-change event ids repeat** when the bot returns to a status (recording stopped, then started again), so de-duplicate status changes on `id` plus `status_change.changed_at`.
- Deleting a bot stops following the meeting; no event is sent.

---


## Troubleshooting


### ❌ Creating the webhook returns 400


The project ID, or the service account email or private key, is missing from the integration in Unified (Step 4).


### ❌ Creating the webhook fails at Google

- One of the three APIs isn't enabled (Step 1)
- The service account can't administer Pub/Sub in the project (Step 3)
- The project ID isn't the OAuth client's project, or the service account has no Pub/Sub admin rights in it
- The **Service account email** field is empty or doesn't match the service account (Step 4)

### ❌ The bot stays READY

- The connected user doesn't own the meeting space
- The `calendar_botevent` webhook was created after the meeting started
- Google suspended the events subscription (Unified only logs this)

### ❌ No recording or transcript events

- Nobody started recording or transcription, and auto-recording was off
- The connection is missing `meetings.space.readonly`