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_botevents 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'srecording_idis set) and the Meet transcript asTRANSCRIPT_RECEIVEDevents, 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.
⚠️ 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
- Configure the OAuth consent screen for the project.
- Create an OAuth client ID of type Web application.
- 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
- US:
- 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.
- In IAM & Admin → Service accounts, create a service account.
- 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 thecloud-platformscope. - Create a JSON key for it and keep the file: you need its
client_emailandprivate_key.
Step 4: Enter your credentials in Unified
- In the Unified app, open Integrations and activate Google Meet (meeting bot).
- Enter the OAuth client's Client ID and Client Secret.
- Enter the OAuth client's project ID in the Google Cloud Project ID (of this OAuth client) field.
- Paste the service account's
private_key(from-----BEGIN PRIVATE KEY-----to-----END PRIVATE KEY-----) in the OAuth 2 X.509 Certificate (.PEM) field. - Enter the service account's
client_emailin the Service account email field. - Select the permissions you need:
calendar_bot_read,calendar_bot_writeandcalendar_botevent_readfor bots,calendar_event_readto list events (creating a bot from anevent_idneeds onlycalendar_bot_write), andcalendar_recording_readto 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:
- creates a Pub/Sub topic for the connection in your project, and lets Google's Meet events service account publish to it;
- creates a push subscription from that topic to the webhook;
- 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
- Create a
calendar_botwith the Meet link (meeting_url,https://meet.google.com/abc-mnop-xyz), or with theidof acalendar_eventlisted on the same connection (event_id; the event must have a Meet link). Use theidexactly as the connection lists it: a bare Google Calendar event id is looked up on the user's primary calendar only. The bot isREADY, orIN_CALL_NOT_RECORDINGif a conference is already running. - Create a native webhook for
calendar_botevent/createdon the same connection. - Start the meeting as the connected user: expect
BOT_STATUS_CHANGEtoIN_CALL_NOT_RECORDINGandPARTICIPANT_JOINEDevents. Start recording: expectRECORDING_STARTEDandBOT_STATUS_CHANGEtoIN_CALL_RECORDING. - End the meeting: expect
BOT_STATUS_CHANGEtoCALL_ENDED. Later, expectRECORDING_READYandTRANSCRIPT_RECEIVEDevents if the meeting was recorded or transcribed. - 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 toDONE. Watch forRECORDING_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 anyrecording_config.automatic_leaveisn'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,DONEorFATAL) returns409. - Only
namecan be updated. An update withmeeting_urlorevent_idreturns400. - Other errors on create:
400for malformed input,404when the calendar event or meeting space doesn't exist, and422when 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
idplusstatus_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_boteventwebhook 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