Google Meet has no standalone 'create meeting' API. In Bubble, you connect via the Google Calendar API (v3) using OAuth2 User-Agent authentication — users authorize your app with their Google account, and each Meet link is created as a Calendar event with conferenceData.createRequest set. The response contains a hangoutLink field with the meet.google.com join URL. Requires Google Cloud Console setup, an OAuth consent screen, and HTTPS for redirect URIs.
| Fact | Value |
|---|---|
| Tool | Google Meet |
| Category | Communication |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 2–3 hours |
| Last updated | July 2026 |
The truth about the 'Google Meet API' — it does not exist
One of the most common frustrations for Bubble developers searching 'Google Meet API' is discovering that Google has never published a standalone Meet API. A Google Meet link is always a Google Calendar event where the host has requested a video conference. In the Google Calendar API, you include a `conferenceData.createRequest` object in your POST body and add `?conferenceDataVersion=1` to the query string — Google's servers then generate the Meet link and return it in the response's `hangoutLink` field or inside `conferenceData.entryPoints`.
The key implication for Bubble: instead of authenticating with a service account (which would create events on the developer's calendar), you use OAuth2 User-Agent authentication so each user authorizes Bubble to act on their Google Calendar. Bubble's built-in OAuth2 User-Agent type in the API Connector handles the OAuth flow, token storage, and token refresh automatically. The tradeoff is that every user must click a 'Connect Google Calendar' button before they can create Meet links — but this is the architecturally correct approach that creates events on the right person's calendar.
Integration method
Bubble API Connector with OAuth2 User-Agent authentication type — the built-in Bubble OAuth flow handles token storage and refresh automatically for each user who connects their Google account.
Prerequisites
- A Google account with access to Google Cloud Console (console.cloud.google.com)
- The API Connector plugin installed in your Bubble app (Plugins tab → Add plugins → API Connector by Bubble)
- Your Bubble app deployed to a custom domain with HTTPS — OAuth2 User-Agent redirect URIs require HTTPS and will not work on Bubble's http:// test preview URL
- A Bubble paid plan if you want to store Calendar event data server-side using Backend Workflows (recommended for privacy)
Step-by-step guide
Enable Google Calendar API and configure OAuth credentials in Google Cloud Console
Open console.cloud.google.com and create a new project (or select an existing one). In the left sidebar, navigate to 'APIs & Services' → 'Library.' Search for 'Google Calendar API' and click 'Enable.' Once enabled, go to 'APIs & Services' → 'Credentials.' Click 'Create credentials' → 'OAuth client ID.' If prompted to configure the consent screen first, click 'Configure consent screen.' On the consent screen: - Choose 'External' unless all users are in your Google Workspace org - Fill in the app name, support email, and developer contact email - On the 'Scopes' step, click 'Add or remove scopes' and add `https://www.googleapis.com/auth/calendar.events` (for read/write access to events) — search for it in the filter box - Add test users during development (your own Google account at minimum) - Complete the consent screen setup and return to 'Create credentials' Back on 'Create credentials → OAuth client ID,' select 'Web application.' Add your Bubble app's redirect URI in the 'Authorized redirect URIs' field. Bubble's OAuth2 redirect URI format is: `https://bubble.io/oauth_callback` for Bubble-hosted apps, or your custom domain equivalent — check Bubble's documentation for the exact URL format in your API Connector settings. Copy the Client ID and Client Secret when they appear.
1// Required OAuth scope:2https://www.googleapis.com/auth/calendar.events34// Authorized redirect URI for Bubble (add in Google Cloud Console):5https://bubble.io/oauth_callback6// OR your custom domain:7https://yourdomain.com/oauth_callbackPro tip: If your OAuth consent screen is in 'Testing' mode, only test users you explicitly add can authorize the app. To allow any Google user to connect, submit the app for verification — or leave it in Testing mode during development and publish later.
Expected result: Google Calendar API is enabled for your project. You have an OAuth 2.0 Client ID and Client Secret, and the Bubble redirect URI is added as an Authorized redirect URI in Google Cloud Console.
Configure the API Connector in Bubble with OAuth2 User-Agent authentication
In your Bubble editor, click 'Plugins' → 'API Connector.' Click 'Add another API' and name it 'Google Calendar.' In the authentication section at the top of this API group, click the dropdown (default 'None') and select 'OAuth2 User-Agent.' This tells Bubble that this API requires each user to individually authorize their Google account. Fill in the OAuth fields: - **App ID / Client ID**: paste your Google Cloud OAuth Client ID - **App Secret / Client Secret**: paste your Client Secret (Bubble stores this securely server-side — it is Private by default for OAuth2 credentials) - **Scope**: `https://www.googleapis.com/auth/calendar.events` - **Authorization URL**: `https://accounts.google.com/o/oauth2/v2/auth` - **Access Token URL**: `https://oauth2.googleapis.com/token` - **Extra parameters for access token endpoint**: add `access_type=offline` and `prompt=consent` — these ensure Google returns a refresh_token so Bubble can refresh the access token after it expires (Google only returns a refresh_token on the first authorization unless you force the consent screen) After saving the OAuth configuration, Bubble generates a 'Connect to Google Calendar' button automatically that you can add to your pages.
1// API Connector OAuth2 User-Agent settings:2// Authentication Type: OAuth2 User-Agent3// Client ID: [your Google Cloud Client ID]4// Client Secret: [your Google Cloud Client Secret] // Private5// Scope: https://www.googleapis.com/auth/calendar.events6// Authorization URL: https://accounts.google.com/o/oauth2/v2/auth7// Access Token URL: https://oauth2.googleapis.com/token8// Extra params: access_type=offline&prompt=consentPro tip: The `access_type=offline` and `prompt=consent` extra parameters are critical. Without `access_type=offline`, Google does not issue a refresh token and the user must re-authorize every hour. Without `prompt=consent`, Google only returns a refresh token on the first authorization — subsequent logins skip the refresh token if the user already authorized your app.
Expected result: The Google Calendar API group shows 'OAuth2 User-Agent' authentication configured. Bubble displays a 'Connect to Google Calendar' button option that you can place on your pages.
Add the 'Create Meet Event' API Connector call
Under the Google Calendar API group, click 'Add another call.' Name it 'Create Meet Event.' Set the method to POST and the URL to: `https://www.googleapis.com/calendar/v3/calendars/primary/events?conferenceDataVersion=1` The `?conferenceDataVersion=1` query parameter is mandatory — without it, Google ignores the conferenceData in your request body and creates a plain Calendar event with no Meet link. Set the body type to 'JSON body.' Add the following JSON structure in the body section, replacing the static values with dynamic parameters: - `summary`: the meeting title (dynamic) - `description`: optional meeting description (dynamic) - `start.dateTime`: ISO 8601 datetime string for the start (dynamic) - `start.timeZone`: timezone string like 'America/New_York' (dynamic or hardcoded) - `end.dateTime`: ISO 8601 datetime string for the end (dynamic) - `end.timeZone`: same timezone (dynamic or hardcoded) - `conferenceData.createRequest.requestId`: a unique string per request (dynamic — use Bubble's 'Generate random string' to get a UUID-style value) - `conferenceData.createRequest.conferenceSolutionKey.type`: `"hangoutsMeet"` (static string) Click 'Initialize call.' You will need to be logged in with a Google account that has already completed the OAuth flow in your Bubble app to initialize. Enter a real test summary, start time, and a random requestId and run the call. Confirm the response contains a `hangoutLink` field.
1// POST https://www.googleapis.com/calendar/v3/calendars/primary/events?conferenceDataVersion=12// Authorization: Bearer [managed automatically by Bubble OAuth2 User-Agent]3// Content-Type: application/json45{6 "summary": "<dynamic_meeting_title>",7 "description": "<dynamic_description>",8 "start": {9 "dateTime": "<dynamic_start_datetime_ISO8601>",10 "timeZone": "<dynamic_timezone>"11 },12 "end": {13 "dateTime": "<dynamic_end_datetime_ISO8601>",14 "timeZone": "<dynamic_timezone>"15 },16 "conferenceData": {17 "createRequest": {18 "requestId": "<dynamic_unique_id>",19 "conferenceSolutionKey": {20 "type": "hangoutsMeet"21 }22 }23 }24}Pro tip: The requestId must be unique per request. If you reuse the same requestId string, Google reuses the same conference instead of creating a new one — silently causing double-booking issues. Use a different random string for every meeting creation.
Expected result: The 'Create Meet Event' call initializes successfully and the response shows a hangoutLink field containing a meet.google.com/xxx-xxxx-xxx URL, along with the calendar event's id, htmlLink, and conferenceData fields.
Add a 'Connect Google Calendar' button to your Bubble page
Users must authorize your app before Bubble can make Calendar API calls on their behalf. Go to your Bubble page editor. Add a button element and label it 'Connect Google Calendar.' In the button's workflow, add the action 'Account → Log the user into [Google Calendar API name].' This fires Bubble's OAuth2 authorization flow — it opens a popup where the user selects their Google account and grants the calendar.events scope. After the user authorizes, Bubble stores their OAuth tokens automatically. You can show or hide the 'Connect Google Calendar' button conditionally: show it when the Current User's API Connector status for Google Calendar is 'not connected,' and hide it once connected. In Bubble's UI, this condition is expressed as 'Current User is logged into [Google Calendar] is no.' For the best user experience, place the 'Connect Google Calendar' button in an onboarding flow or settings page so users connect once during setup rather than seeing an authorization prompt at the point of scheduling a meeting. Important: the OAuth2 redirect flow requires HTTPS. In Bubble's test preview environment (http://), the OAuth redirect will fail. Test this step after deploying your app to a custom domain with SSL, or use Bubble's built-in bubbleapps.io subdomain (which uses HTTPS) for testing.
1// Button workflow:2// Event: Button 'Connect Google Calendar' is clicked3// Action: Account → Log the user into Google Calendar4//5// Conditional visibility for the button:6// Show this button: Current User is logged into Google Calendar = no7//8// After connection, show a success state:9// Show group 'Google Calendar Connected' when Current User is logged into Google Calendar = yesPro tip: Test the OAuth flow on your deployed app, not the Bubble editor preview. The editor runs on http:// which breaks OAuth redirect URIs that require HTTPS. Use your live bubbleapps.io subdomain URL or custom domain for any OAuth testing.
Expected result: Clicking 'Connect Google Calendar' opens Google's OAuth authorization popup. After the user selects their account and approves the scope, the button's conditional visibility updates to show 'Connected' and the Current User's Google Calendar status shows as logged in.
Build the meeting creation workflow and display the Meet link
With OAuth configured and the API call ready, wire everything together in a meeting-scheduling workflow. On your Bubble page, add: - An Input element for meeting title - A DateTimePicker for start time - A DateTimePicker for end time (or a duration selector) - A Button: 'Create Meet Link' In the button's workflow: 1. Generate a unique requestId: use 'Set state → Page's random_id = Generate random string' or create a custom state for the unique ID 2. Add action: 'Plugins → API Connector - Google Calendar - Create Meet Event' - summary: Input_Title's value - start.dateTime: DateTimePicker_Start's value formatted as ISO 8601 (use Bubble's 'format date' operator with format `YYYY-MM-DDTHH:mm:ss` and append the timezone offset) - end.dateTime: DateTimePicker_End's value formatted the same way - conferenceData.createRequest.requestId: your generated random string (must be unique per meeting) 3. After the API call, save the result: create a new Meeting record with `join_url = Result of step 2 - hangoutLink` and `calendar_event_id = Result of step 2 - id` 4. Display the join_url to the user in a text element or popup Apply privacy rules to any data type that stores calendar event IDs or Meet links so users can only see their own meetings. Go to Data tab → Privacy → add a rule for the Meeting data type: 'Created by = Current User.' RapidDev's team can help architect multi-user scheduling systems — book a free scoping call at rapidevelopers.com/contact.
1// Button workflow: Create Meet Link2// Step 1: Set custom state unique_request_id = Generate random string (length 16)3//4// Step 2: API Connector → Google Calendar → Create Meet Event5// summary: Input_Title's value6// description: Input_Description's value7// start.dateTime: DateTimePicker_Start formatted as ISO 86018// start.timeZone: "America/New_York" (or dynamic from user profile)9// end.dateTime: DateTimePicker_End formatted as ISO 860110// end.timeZone: "America/New_York"11// conferenceData.createRequest.requestId: Page's unique_request_id state12// conferenceData.createRequest.conferenceSolutionKey.type: "hangoutsMeet"13//14// Step 3: Create Meeting record15// join_url: Step 2 result - hangoutLink16// calendar_event_id: Step 2 result - id17// host: Current User18// scheduled_start: DateTimePicker_Start's value19//20// Step 4: Show popup 'Meeting Created' displaying join_urlPro tip: The API response contains both `hangoutLink` (a direct meet.google.com shortlink) and `conferenceData.entryPoints[0].uri` (the full URL). Both point to the same meeting. Use `hangoutLink` as it is shorter and easier to display, but fall back to the entryPoints URI if hangoutLink is missing.
Expected result: Clicking 'Create Meet Link' on your Bubble page creates a real Google Calendar event and displays a meet.google.com join URL. The event appears in the authorizing user's Google Calendar with the Meet conference details.
Common use cases
Client-facing meeting scheduler for service businesses
Let clients book consultations directly in your Bubble app. After authorizing Google, a counselor or coach can create a Google Meet session from within Bubble, and the meeting link is stored alongside the booking record and sent to the client via email.
When a counselor submits the 'Schedule Session' form, create a Google Calendar event with conferenceData for the session's date/time, store the hangoutLink in the Session record, and display it to both the counselor and client.
Copy this prompt to try it in Bubble
Team onboarding and interview platform
HR teams can schedule candidate interviews directly from a Bubble applicant tracking system. Each interviewer authorizes their Google account once, and the system generates unique Meet links for each interview slot, automatically populated in the candidate and interviewer records.
When an interview slot is confirmed, trigger a workflow that creates a Calendar event on the interviewer's Google Calendar with a Meet link and stores the join URL in the Interview record alongside the candidate's name and time slot.
Copy this prompt to try it in Bubble
Course platform live session links
EdTech platforms can have instructors generate unique Meet links for each live class session. The instructor connects their Google account once, and Meet links are created per session and shared with enrolled students inside the app.
Display a 'Generate Meet Link' button on the instructor dashboard. When clicked, create a Calendar event for the upcoming session and store the hangoutLink in the Session record so enrolled students can see and click the join link.
Copy this prompt to try it in Bubble
Troubleshooting
OAuth redirect fails with 'redirect_uri_mismatch' error during Google authorization
Cause: The Bubble app's redirect URI is not listed in the Authorized redirect URIs in Google Cloud Console, or the URI format does not exactly match (trailing slash, http vs https, domain mismatch).
Solution: In Google Cloud Console, go to APIs & Services → Credentials → your OAuth Client ID → Authorized redirect URIs. Add the exact URI Bubble uses. Check Bubble's API Connector OAuth settings for the exact redirect URI format — it typically follows the pattern `https://bubble.io/oauth_callback` or `https://yourdomain.com/oauth_callback`. The URI must match character-for-character, including the protocol (https, not http).
API call returns a Calendar event but with no hangoutLink and no conferenceData
Cause: The `?conferenceDataVersion=1` query parameter is missing from the endpoint URL. Without it, Google creates a plain Calendar event and ignores the conferenceData in the request body.
Solution: In the API Connector call URL, verify the endpoint reads: `https://www.googleapis.com/calendar/v3/calendars/primary/events?conferenceDataVersion=1` — the `?conferenceDataVersion=1` query string is mandatory. Update the URL in the API Connector and re-initialize the call.
'There was an issue setting up your call' when initializing the Create Meet Event call
Cause: The Initialize call fires against the API with the currently logged-in user's OAuth token. If the user running the Initialize is not connected to Google Calendar via Bubble's OAuth, the call has no Bearer token and returns a 401.
Solution: Before clicking Initialize, complete the OAuth flow yourself: go to your Bubble app's live URL (not the editor), click 'Connect Google Calendar,' and authorize with your own Google account. Then return to the API Connector in the editor and click Initialize — Bubble will use your stored OAuth token to make the test call.
The same Meet link is generated for two different meetings
Cause: The requestId in conferenceData.createRequest is the same for both API calls. Google reuses the same conference when it receives a duplicate requestId within a short time window.
Solution: Ensure each meeting-creation call uses a fresh unique requestId. In Bubble, generate a random string at workflow runtime (not a hardcoded value in the API Connector template) and pass it as a dynamic parameter. Use Bubble's built-in 'Generate random string' operator or use the combination of 'Current date/time:formatted as Unix timestamp' + 'Random number' to ensure uniqueness.
Users are prompted to authorize Google Calendar every hour
Cause: The OAuth2 configuration is missing `access_type=offline` in the extra parameters, so Google does not issue a refresh token. Bubble cannot refresh the access token after it expires and prompts re-authorization.
Solution: In the API Connector's OAuth2 User-Agent settings, add `access_type=offline` and `prompt=consent` to the extra parameters for the access token endpoint. Have existing users disconnect and reconnect their Google account to receive a new refresh token with the offline scope.
Best practices
- Always add `?conferenceDataVersion=1` to the Calendar events endpoint URL — without it, Meet links are never generated and the response contains no conferenceData.
- Generate a new unique requestId for every meeting creation call. Duplicate requestIds silently reuse the same conference, causing scheduling confusion. Use Bubble's 'Generate random string' operator at workflow runtime.
- Include `access_type=offline` and `prompt=consent` in your OAuth2 extra parameters. These ensure Google issues a refresh token so users do not need to re-authorize every hour.
- Test the OAuth2 User-Agent flow on your deployed app (HTTPS), not in the Bubble editor preview (HTTP). OAuth redirect URIs require HTTPS and the preview environment will break the flow.
- Apply Bubble privacy rules to any data type storing Calendar event IDs or Meet links. Users should only be able to read their own meeting records — not other users' links.
- Extract and store the hangoutLink from the API response immediately after the call. Do not rely on re-fetching the Calendar event later — store the Meet URL in your Bubble database so you can display it without additional API calls (saves WU).
- Educate users that Meet links are created on their personal Google Calendar. If they revoke your app's access in their Google account security settings, the integration stops working until they re-authorize.
Alternatives
Zoom uses Server-to-Server OAuth with an account-level credential set — no per-user authorization required. This makes Zoom simpler to integrate when you want admin-level meeting creation without requiring each user to link their Google account. Choose Google Meet when your users are already in the Google Workspace ecosystem and meeting links in Google Calendar are the expected format.
Teams meeting links require either the Graph API with Azure AD OAuth or the simpler Workflows-app webhook for outbound notifications only. For full per-user meeting scheduling equivalent to Google Meet's Calendar API integration, Teams requires Azure AD app registration with admin consent — significantly more complex. Choose Teams if your organization mandates Microsoft 365.
Webex Events is a full virtual conference management platform — not a video call scheduler. If you need simple one-on-one or team meeting links, Google Meet via the Calendar API is the right choice. Use Webex Events only if you are building a multi-session conference portal with networking lounges and sponsor features.
Frequently asked questions
Is there a Google Meet API I can use directly without the Calendar API?
No. Google has never published a standalone Meet API for creating meetings. Every Meet link is generated as part of a Google Calendar event with the conferenceData.createRequest field. You must use the Google Calendar API (v3) with the calendar.events scope to create Meet links programmatically.
Can I create a Meet link without the user connecting their Google account?
Not via the standard Calendar API without domain-wide delegation. If your Bubble app serves users in a single Google Workspace organization and you have admin access, you can set up a service account with domain-wide delegation to create events on any user's calendar. This is an advanced Google Cloud setup. For most Bubble use cases, the per-user OAuth2 User-Agent flow described in this guide is the correct approach.
Will the Meet link expire?
Google Meet links for standard Calendar events do not have a hard expiry date. However, meeting owners can end meetings and the link may behave differently after the meeting's scheduled end time depending on the organizer's Google Workspace settings. Instant Meet links (created without Calendar events) do expire, but since this integration creates Calendar events, expiry is not a typical concern.
Can I add other participants to the Calendar event when creating the meeting?
Yes. Add an `attendees` array to the event body with each participant's email address: `{"attendees": [{"email": "user@example.com"}, {"email": "other@example.com"}]}`. Google Calendar sends invitation emails to each attendee automatically if the `sendUpdates` query parameter is set to `all` in the endpoint URL.
What plan does my Bubble app need for this integration?
The API Connector with OAuth2 User-Agent works on Bubble's Free plan for client-side API calls. However, if you want to store Calendar event data server-side and process events securely using Backend Workflows, a Bubble paid plan (Starter and above) is required. For most production setups, the paid plan is strongly recommended for privacy rule enforcement and backend event processing.
My users are seeing a 'This app is not verified by Google' warning. Is this normal?
Yes, this appears when your OAuth consent screen is in 'Testing' mode or has not been through Google's verification process. During development, you and your test users can click 'Advanced' → 'Go to [app name]' to proceed. Before launching to real users, submit your app for Google verification — the process takes a few days and requires a privacy policy URL.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation