How to Set Up a Google Meet Meeting Bot with Unified

Updated:


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'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.


⚠️ 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

ScopeUnified permissionWhy
https://www.googleapis.com/auth/meetings.space.readonlycalendar_bot_read, calendar_bot_write, calendar_botevent_read, calendar_recording_readFind the meeting space; read conference records, participants, recordings and transcripts
https://www.googleapis.com/auth/calendar.events.readonlycalendar_bot_write, calendar_event_readCreate a bot from a calendar event_id; list events
openidcalendar_botevent_readIdentify 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
Share
All guidesAccounting Account Type Hierarchy in UnifiedAdvertising Report Metrics by IntegrationAmazon S3: Required IAM PermissionsATS to Vector DB: How to Power Talent Intelligence with Real-Time DataBuilding AI applications with Unified and LangbaseConcur & Concur (Company) — Connection GuideConfigure Greenhouse Native Candidate WebhooksConfigure Salesforce Meetings and Notes for UnifiedConnect Amazon Seller Central to Unified.toConnecting BambooHR via OAuth 2Connecting Google Workspace Integrations with a Service AccountCorrect WelcomeKit Scopes for Jungle IntegrationCreating Ads using the Unified Ads APICreating Walmart Items via UnifiedEnd-Users, Integrations, and ConnectionsEnriching Unified Objects with Custom MetadataEnterprise-managed authorization (EMA) with a static keyEnterprise-managed authorization (EMA) with a workspace secretEnterprise-managed authorization (EMA) with Microsoft Entra IDExtended observability — pushing API logs to ClickHouseExtended observability — pushing API logs to Grafana / LokiExtended Observability - Pushing API Logs to your Datadog InstanceFacebook Messenger Webhook SetupFireflies Integration GuideGetting started with WorkableHandling Delegated vs. Application Scopes in Microsoft IntegrationsHiBob & Unified: connection and time off guideHow long are logs retainedHow to access employees and usersHow to add API support for the Create Activity in CrelateHow to Associate a Connection ID with Your End-UserHow to build a Candidate Assessment product withHow to build a candidate sourcing or job board app with Unified.toHow to build a Discord support bot with Unified.to and LangbaseHow to Build a Fintech Application with Unified's Payments APIHow to Build an E-Commerce Product Integration with UnifiedHow to build an invoicing system with Unified.toHow to build Enterprise Search using RAGHow to configure Bullhorn Redirect URI for creating a connectionHow to configure webhooks in HubSpotHow to configure webhooks in Thrive LearningHow to configure webhooks in Toast for UnifiedHow to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Cohere to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP ServerHow to connect HiBob (Bob) to Unified with OAuth 2.0How to Connect LLMs to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Zoom and Zoom PhoneHow to create a Connection In Microsoft TeamsHow to create a token-based connection in HighlevelHow to Create a Unified.to Connection to HighLevelHow to Create a Xero Connection in Unified.toHow to create and configure webhooksHow to create Connection with HubspotHow to customize portal URLs for Stripe and GoCardlessHow to filter webhook eventsHow-to Get a Private Support Channel for Your Unified IntegrationHow to get help fromHow to get your 8x8 Connect API Key and Account ID: Step-by-step guideHow to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key: Step-by-step guideHow to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret: Step-by-step guideHow to get your Ashby API Key: Step-by-step guideHow to get your Brex API token: Step-by-step guideHow to get your Bullhorn OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password: Step-by-step guideHow to get your Ceridian Dayforce Username, Password and Client Namespace: Step-by-step guideHow to get your Crelate API key: Step-by-step guideHow to get your Dashlane API Key: Step-by-step guideHow to get your Deel Access Token: Step-by-step guideHow to get your Dialpad API Key: Step-by-step guideHow to get your Discord OAuth 2 credentials and bot tokenHow to get your ELMO client ID and client secret: Step-by-step guideHow to get your Gainsight Client ID, Client Secret and Gainsight API Domain: Step-by-step guideHow to get your Greenhouse API Key and Job board token: Step-by-step guideHow to get your Helpscout API Key: Step-by-step guideHow to get your HiBob Service User ID and Service User Token: Step-by-step guideHow to get your HighLevel API Key and Location ID: Step-by-step guideHow to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)How to get your Humaans API Key: Step-by-step guideHow to get your iCIMS API Username, API Password and Customer ID: Step-by-step guideHow to get your JobDiva Client ID, Username/email and Password: Step-by-step guideHow to get your Jobvite API Key, API Key Secret and Email: Step-by-step guideHow to get your Lever API Key: Step-by-step guideHow to get your Loxo Agency slug, API Key and Agency ID: Step-by-step guideHow to get your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID: Step-by-step guideHow to get your Microsoft Azure AD OAuth 2 credentialsHow to get your OAuth 2 credentials for GmailHow to get your OAuth 2 credentials for Microsoft Dynamics 365How to get your OAuth 2 credentials in PipeDriveHow to get your OpenAI API Key: Step-by-step guideHow to get your Paycom SID/Username and Token/Password: Step-by-step guideHow to get your PCRecruiter Username, Password, Database ID, App Key and App ID: Step-by-step guideHow to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL: Step-by-step guideHow to get your SAP SuccessFactors Username, Company ID, Password and API URL: Step-by-step guideHow to get your Shopify Admin API access token and Store ID: Step-by-step guideHow to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key: Step-by-step guideHow to get your Workable API Token and Subdomain: Step-by-step guideHow to get your yotpo APP Key / Store ID and Secret Key: Step-by-step guideHow to Handle Attachments in Invoice, Bill and Credit MemoHow to migrate or import your integrations into Unified.toHow to obtain your GitHub OAuth2 credentialsHow to Power Claude with Live Customer Data Using Unified MCPHow to receive assessment orders from an ATS with Unified.toHow to register a Google developer app and get OAuth 2 credentialsHow to register a Salesforce developer app and get OAuth 2 credentialsHow to register a Slack developer account and get OAuth 2 credentialsHow to Register a Workday Developer App and Get OAUTH2 CredentialsHow to Register a Workday Developer App and Get OAUTH2/ SOAP CredentialsHow to Register a ZendeskSell Developer App and Get OAUTH2 CredentialsHow to Register a Zoho Developer App and Get OAUTH2 CredentialsHow to Register an ADP Developer App and Get OAUTH2 CredentialsHow to Register an Atlassian Developer App and Get OAUTH2 CredentialsHow to Register your Facebook OAuth2 ApplicationHow to Register your Google Ads OAuth2 ApplicationHow to Register your MetaAds OAuth2 applicationHow To Request & Write Raw Integration DataHow to Retrieve Microsoft Dynamics 365 Business Central CredentialsHow to set up a custom API URL with a CNAMEHow to set up a HiBob marketplace installHow to Set Up a Microsoft Teams Bot with UnifiedHow to Set Up a Microsoft Teams Meeting Bot with UnifiedHow to Set Up a Webex Meeting Bot with UnifiedHow to Set Up a Zoom Meeting Bot with UnifiedHow to set up and configure NotionHow to set up Google Business Profile API access and get OAuth 2 credentialsHow to Set Up LinkedIn Webhooks with UnifiedHow to set up native webhooks for QuickBooks Online with UnifiedHow to set up Slack webhooks using event subscriptionsHow to set up Telegram (bot) with Unified.toHow to set up your scopes in HubSpotHow to setup a Freshbooks developer appHow to setup a TikTok Shop applicationHow to Setup AWS Assume Role for AWS Secret ManagerHow to setup Oracle JD EdwardsHow to Setup Quickbooks DesktopHow to setup Sage 100 with Unified.toHow to test webhooks in the Synthetic Data (Sandbox) environmentHow to troubleshoot unhealthy connectionsHow to troubleshoot unhealthy webhooksHow to use SCIM with the Unified APIHow to use the Passthrough APIHow to Use Unified.to's Generative AI API with OpenAI and ClaudeHow to use User Provisioning and Verification with UnifiedHow virtual webhook retry and recovery worksIntegration set-up guide for LeverManaging custom validation rules in SalesforceNetSuite Authentication Setup for UnifiedNotice of Deprecation of Fields and Objects (Nov 2025)Oracle HCM / Taleo OAuth Credentials GuideRetrieval-Augmented Generation (RAG)SalesForce (External Client Apps) on Multiple OrganizationsSAML Single-Sign-OnScaling MCP Tools with Anthropic's (& OpenAI's) Defer LoadingSet Environments for your Unified.to WorkspaceSetting up a Slack Bot Connection with Unified.toSetting up OAuth 2 Credentials for Greenhouse's APIsTrello Connection Guide in UnifiedUnderstanding OAuth2 Authorization flowsUnderstanding Response Time Headers in the Unified APIUnified Assessment API: Embed Assessments Inside ATS PlatformsUnified's MCP ServerUnified MCP Server with LangChain and LangGraphUnlock real-time data with virtual webhooksUse Unified to sign in your users into your applicationVincere OAuth Setup Guide for UnifiedWorkable: Creating candidates and attaching them to jobsWorkday vs Workday Legacy — Why Unified.to Supports BothWorking with hierarchical tree data in Storage, Messaging, and KMS APIs
Are we missing anything? Let us know
Was this page helpful?