Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Google Meet

Connect FlutterFlow to Google Meet by calling the Google Calendar API v3 — Meet has no standalone meeting API. Use a Custom Action to extend FlutterFlow's Google sign-in with the `calendar.events` scope, then build an API Group that creates Calendar events with `conferenceDataVersion=1` and reads back the Meet join URL from `conferenceData.entryPoints`.

What you'll learn

  • Why Google Meet meetings are created through the Calendar API, not a dedicated Meet API
  • How to extend FlutterFlow's Google sign-in to request the `calendar.events` OAuth scope
  • How to build a Calendar API Group in FlutterFlow that creates Meet-enabled events
  • How to parse the Meet join URL from `conferenceData.entryPoints` in the API response
  • How to list only Meet meetings by filtering on `conferenceData.conferenceSolution.key.type`
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced13 min read60 minutesCommunicationLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Google Meet by calling the Google Calendar API v3 — Meet has no standalone meeting API. Use a Custom Action to extend FlutterFlow's Google sign-in with the `calendar.events` scope, then build an API Group that creates Calendar events with `conferenceDataVersion=1` and reads back the Meet join URL from `conferenceData.entryPoints`.

Quick facts about this guide
FactValue
ToolGoogle Meet
CategoryCommunication
MethodFlutterFlow API Call
DifficultyAdvanced
Time required60 minutes
Last updatedJuly 2026

Create Google Meet Links from Your FlutterFlow App

The most important thing to understand before building this integration is that Google Meet does not have a standalone meeting-creation REST API. Every Google Meet session is a Google Calendar event. When you create a Calendar event with `conferenceDataVersion=1` and include a `createRequest` in the `conferenceData` field, Google automatically generates a Meet conference and attaches the join URL to the event. Your FlutterFlow app reads that URL from `conferenceData.entryPoints[0].uri` and can display it as a button, share it via SMS, or store it in Firestore.

The Calendar API is free to use with any Google or Google Workspace account, with a default quota of around one million queries per day. Per-user rate limits apply but are high enough for any individual user's scheduling needs. The tricky part in FlutterFlow is authentication: the Calendar API requires the `calendar.events` OAuth scope, and FlutterFlow's built-in Firebase Google Auth provider only grants basic profile scopes (`email`, `profile`, `openid`). You'll need a Custom Action that uses the `google_sign_in` pub.dev package with an explicit scope list — this is a one-time setup step that unlocks full Calendar access.

For personal-use apps (the signed-in user creates meetings in their own calendar), the client-side OAuth token approach works well. For team-level features — creating meetings on behalf of other users, pulling organization-wide meeting analytics, or accessing calendars you don't own — you'll need a service account with domain-wide delegation running in a Firebase Cloud Function, as those operations require admin-level credentials that must stay server-side.

Integration method

FlutterFlow API Call

Google Meet has no standalone meeting-creation API. A Meet meeting is a Google Calendar event carrying a `conferenceData` object with the join URL. To create or list Meet meetings in FlutterFlow, you call the Google Calendar API v3 authenticated with a Google OAuth user token. FlutterFlow's built-in Google sign-in only grants basic profile scopes, so you must extend it via a Custom Action using the `google_sign_in` package with the explicit `calendar.events` scope. Server-side operations (cross-user dashboards, service account access) need a Cloud Function.

Prerequisites

  • A Google account or Google Workspace account (Meet is free with any Google account)
  • A Google Cloud project with the Google Calendar API enabled (console.cloud.google.com → APIs & Services → Enable APIs → search 'Google Calendar API')
  • OAuth 2.0 credentials configured: OAuth consent screen with `calendar.events` scope, and a Web Application OAuth client (for the FlutterFlow web flow) or iOS/Android client
  • A FlutterFlow project with Firebase Auth configured and Google Sign-In enabled in Firebase Authentication
  • A paid FlutterFlow plan to use Custom Actions (Custom Code requires Standard or higher)

Step-by-step guide

1

Enable the Calendar API and configure OAuth scopes in Google Cloud Console

Go to console.cloud.google.com and select your Firebase project. Click APIs & Services in the left nav, then Library, and search for 'Google Calendar API'. Click it and press Enable. Next, click OAuth consent screen and make sure `https://www.googleapis.com/auth/calendar.events` is listed in your authorized scopes — if it's not, click Add or Remove Scopes, find `calendar.events` in the list (it shows as 'See, edit, share, and permanently delete all the calendars you can access using Google Calendar'), and add it. If your app is in testing mode, add the Google accounts you'll test with to the Test Users list — unapproved apps in testing mode can only be used by listed test users. For a production app (publishing to the App Store / Play Store), you'll need to complete Google's OAuth verification process for the calendar scope, which takes 1-4 weeks. Note the OAuth 2.0 Client ID you'll use — choose the Web Application type for testing in FlutterFlow's web preview; you'll need an iOS/Android client ID for published mobile apps.

Pro tip: The `calendar.events` scope is 'sensitive' in Google's classification. During development with test users, this is fine. Before launching publicly, complete Google's security review or the sign-in will show a warning to users.

Expected result: The Google Calendar API is enabled in your project and the `calendar.events` scope is listed in your OAuth consent screen. The API is accessible when you visit APIs & Services → Enabled APIs.

2

Create a Custom Action to sign in with Google and request the Calendar scope

FlutterFlow's built-in Google Sign-In via Firebase Auth does not allow you to specify custom OAuth scopes. To request `calendar.events`, you need a Custom Action that calls `google_sign_in` directly with the scope list. In FlutterFlow, click Custom Code in the left navigation panel, then click + Add and choose Action. Name it 'signInWithGoogleCalendar'. In the Dependencies field, add `google_sign_in: ^6.2.1` (check pub.dev for the latest version). Set the Return Value type to String — the action will return the OAuth access token. Paste the Dart code below. This action signs the user in with Google requesting both the profile scope and `calendar.events`, then returns the access token. Store the returned token in an App State variable named `googleAccessToken` (String, persisted to page state). The token is a short-lived credential (usually 1 hour); for production apps you'd handle refresh — but for a tutorial prototype, signing in again is sufficient. Custom Actions cannot run in FlutterFlow's web Run/Test mode — test this on a real device using FlutterFlow's 'Test on Device' option under the Run button.

sign_in_with_google_calendar.dart
1// Custom Action: signInWithGoogleCalendar
2// Add dependency: google_sign_in: ^6.2.1
3// Return type: String (the access token)
4
5import 'package:google_sign_in/google_sign_in.dart';
6
7Future<String> signInWithGoogleCalendar() async {
8 final GoogleSignIn googleSignIn = GoogleSignIn(
9 scopes: [
10 'email',
11 'profile',
12 'https://www.googleapis.com/auth/calendar.events',
13 ],
14 );
15
16 try {
17 // Sign out first to force account picker (useful during development)
18 await googleSignIn.signOut();
19 final GoogleSignInAccount? account = await googleSignIn.signIn();
20 if (account == null) return '';
21
22 final GoogleSignInAuthentication auth = await account.authentication;
23 return auth.accessToken ?? '';
24 } catch (e) {
25 return '';
26 }
27}

Pro tip: Add a check after calling this action: if the returned token is empty (''), show a Snackbar 'Sign-in failed — please try again' and do not proceed to the API Call.

Expected result: The Custom Action appears in FlutterFlow's Custom Code panel. When called on a real device, it opens the Google account picker, asks for Calendar permission, and returns an access token string.

3

Build the Calendar API Group in FlutterFlow

Click API Calls in the left navigation panel. Click + Add and choose Create API Group. Name it 'GoogleCalendar'. Set the Base URL to `https://www.googleapis.com/calendar/v3`. Click the Headers tab and add a shared header: key `Authorization`, value `Bearer [accessToken]`. In the Variables tab, add a variable named `accessToken` of type String — this is the token returned by the Custom Action in Step 2. Now add the first API Call inside this group: click + Add API Call, name it 'CreateMeetEvent'. Set the method to POST. In the API URL field, enter `/calendars/primary/events?conferenceDataVersion=1`. In the Body tab, set body type to JSON and paste the body template shown in the code block below. The `summary`, `start`, `end`, and `attendees` fields should be Variables so you can bind them dynamically from the UI. Add variables: `eventSummary` (String), `startDateTime` (String, ISO 8601 format like '2024-12-01T14:00:00Z'), `endDateTime` (String), `attendeeEmail` (String). In the JSON body, reference them with [variableName] syntax. The `createRequest` in `conferenceData` triggers Meet link generation — omitting it means no Meet link even if conferenceDataVersion=1 is set. Add a second API Call: 'ListMeetEvents', method GET, URL `/calendars/primary/events?singleEvents=true&orderBy=startTime&q=has:hangoutsMeet`.

create_event_body.json
1{
2 "summary": "[eventSummary]",
3 "start": {
4 "dateTime": "[startDateTime]",
5 "timeZone": "UTC"
6 },
7 "end": {
8 "dateTime": "[endDateTime]",
9 "timeZone": "UTC"
10 },
11 "attendees": [
12 { "email": "[attendeeEmail]" }
13 ],
14 "conferenceData": {
15 "createRequest": {
16 "requestId": "[eventSummary]-request",
17 "conferenceSolutionKey": {
18 "type": "hangoutsMeet"
19 }
20 }
21 }
22}

Pro tip: The `requestId` in createRequest must be unique per calendar event creation request. Using a combination of event summary and a timestamp or UUID ensures uniqueness — if you reuse the same requestId, Google may return a cached (failed) response.

Expected result: The GoogleCalendar API Group appears in the API Calls panel with a shared Authorization header and two API Calls: CreateMeetEvent (POST) and ListMeetEvents (GET).

4

Wire the Create Meeting action chain and extract the Meet URL

On the page where users create a meeting, wire the Create Meeting button's Actions. The full action chain is: (1) Call the signInWithGoogleCalendar Custom Action and store the result in the `googleAccessToken` App State variable; (2) If the token is empty, show an error Snackbar and stop; (3) Call the CreateMeetEvent API Call with the accessToken, eventSummary, startDateTime, endDateTime, and attendeeEmail bound to their respective form fields; (4) In the API Call's Response & Test tab, add a JSON Path to extract the Meet URL: `$.conferenceData.entryPoints[0].uri` — this is the video join link; also extract `$.htmlLink` to get the Calendar event link; (5) Store the Meet URL in a Page State String variable `meetJoinUrl`; (6) Show a Container or Card that becomes visible when `meetJoinUrl` is non-empty, displaying the URL and a Launch URL action on a 'Join Meeting' button. For the form fields, a DateTimePicker widget provides the start time — convert its output to ISO 8601 format using a Custom Function: `String toIso8601(DateTime dt) { return dt.toUtc().toIso8601String(); }`. To handle the end time, compute it as start + 60 minutes in the same Custom Function or with a second function.

date_helpers.dart
1// Custom Function: toIso8601
2// Argument: dt (DateTime)
3// Return type: String
4String toIso8601(DateTime dt) {
5 return dt.toUtc().toIso8601String();
6}
7
8// Custom Function: addMinutes
9// Arguments: dt (DateTime), minutes (int)
10// Return type: DateTime
11DateTime addMinutes(DateTime dt, int minutes) {
12 return dt.add(Duration(minutes: minutes));
13}

Pro tip: The JSON Path `$.conferenceData.entryPoints[0].uri` returns the video join URL. Index [0] is usually the video link, but to be safe, also extract `$.conferenceData.entryPoints` as an array and filter for `entryPointType == 'video'` if you want to be robust.

Expected result: After a user fills in the meeting title and time and taps Create, the Calendar API creates the event, the Meet join URL appears in the UI, and the 'Join Meeting' button opens Google Meet in the browser.

5

List and display upcoming Meet meetings

To show the user's upcoming Meet meetings in a ListView, add a Backend Query to the meetings page (or a ListView widget) that calls the ListMeetEvents API Call. In the Query settings, bind the `accessToken` variable to the `googleAccessToken` App State variable. The Calendar API returns a `items` array of Calendar events. Each item has `summary` (meeting title), `start.dateTime`, `end.dateTime`, and `conferenceData.entryPoints` (which contains the Meet URL). In the Response & Test tab of the ListMeetEvents call, add JSON Paths: `$.items` to get the array, then navigate into each item. In the ListView, bind each list tile to the response items array. Add JSON Paths for the child fields you need: `$.items[*].summary`, `$.items[*].start.dateTime`, and `$.items[*].conferenceData.entryPoints[0].uri`. Filtering to only Meet events: the `q=has:hangoutsMeet` query parameter helps but isn't perfect. Add a conditional in the ListView to only show items where the Meet URL JSON Path returns a non-empty value. The `singleEvents=true` parameter is mandatory when using `orderBy=startTime` — omitting it returns a 400 error from the API. Set the timeMin parameter to the current date-time to only fetch future events: add a Variable `timeMin` to the API Call and bind it to a Custom Function that returns the current UTC ISO 8601 timestamp.

Pro tip: The Calendar API returns a maximum of 250 events per request by default. For users with busy calendars, add a `maxResults=10` parameter to the ListMeetEvents call to keep the query fast and the UI responsive.

Expected result: The meetings page loads and shows a list of upcoming Google Meet events with their titles, times, and join buttons. Events without a Meet link are filtered out.

Common use cases

Coaching app that lets clients book 1:1 video sessions

The FlutterFlow app shows a calendar picker where clients choose a time slot. On booking, it creates a Google Calendar event with a Meet conference link in the coach's calendar and displays the join URL to the client. The client can tap the link directly to open Meet on their device.

FlutterFlow Prompt

Add a DateTimePicker and a 'Book Session' button. When tapped, call the Calendar API to create an event titled 'Coaching Session' at the selected time with conferenceDataVersion=1, then show the returned Meet join URL in a Text widget.

Copy this prompt to try it in FlutterFlow

Team app that lists upcoming Meet meetings for the signed-in user

A FlutterFlow ListView pulls the user's upcoming Google Calendar events filtered to those with `conferenceData.conferenceSolution.key.type = hangoutsMeet` and displays the meeting title, start time, and a tap-to-join button. The list refreshes when the user opens the page.

FlutterFlow Prompt

On the Meetings page, add a ListView bound to a Calendar API call that queries events with timeMin=now, singleEvents=true, orderBy=startTime, and filter to only show events where conferenceData is present.

Copy this prompt to try it in FlutterFlow

Onboarding flow that creates a welcome call Meet link automatically

When a new user completes signup in the FlutterFlow app, an action chain creates a Google Calendar event scheduled for 24 hours later using the user's OAuth token, generates a Meet link, and stores the join URL in the user's Firestore profile. An email or push notification delivers the link.

FlutterFlow Prompt

After user registration, call the Calendar API to create an event 'Welcome Call' with a Meet link at [current time + 24h], store the join URL in the users/{uid}/welcome_meeting_url Firestore field.

Copy this prompt to try it in FlutterFlow

Troubleshooting

Calendar API returns 403 with `insufficientPermissions` error

Cause: The OAuth token was obtained without the `calendar.events` scope — likely using FlutterFlow's built-in Google Sign-In which only grants profile scopes.

Solution: Ensure you are calling the signInWithGoogleCalendar Custom Action (Step 2) rather than FlutterFlow's native Google login button. If the user previously signed in without the Calendar scope, call `googleSignIn.signOut()` first to force re-consent — a cached sign-in won't add new scopes without re-prompting.

CreateMeetEvent succeeds (200 response) but `conferenceData` is null or missing from the response

Cause: The `conferenceDataVersion=1` query parameter was not included in the API Call URL, or the `createRequest` object was omitted from the event body.

Solution: Verify the POST URL is `/calendars/primary/events?conferenceDataVersion=1` (with the parameter). Also confirm the request body includes the `conferenceData.createRequest.conferenceSolutionKey.type = hangoutsMeet` structure — without the `createRequest`, Google does not generate a Meet link.

ListMeetEvents returns 400 with 'orderBy is only supported with singleEvents'

Cause: The `orderBy=startTime` parameter requires `singleEvents=true` — without it, the Calendar API returns recurring events as masters, not expanded instances, and cannot sort by start time.

Solution: Add `singleEvents=true` to the ListMeetEvents API URL: `/calendars/primary/events?singleEvents=true&orderBy=startTime`. Both parameters must be present together.

Custom Action runs in the FlutterFlow editor test but Google sign-in does not appear

Cause: Custom Actions that involve native platform plugins (like google_sign_in) do not run in FlutterFlow's web Run/Test mode in the browser.

Solution: Use FlutterFlow's 'Test on Device' option (Run button → Test on Device) to test this action on a real Android or iOS device. The web preview cannot invoke native OAuth flows. Alternatively, download the Flutter project from FlutterFlow and run it locally with `flutter run`.

Best practices

  • Store the Google OAuth access token in Page State rather than App State — tokens expire in approximately 1 hour and should not persist across app sessions without a refresh mechanism.
  • Always include `conferenceDataVersion=1` as a query parameter on event creation, and always include the `createRequest` in the event body — forgetting either silently produces an event without a Meet link.
  • Use `singleEvents=true` with `orderBy=startTime` on list queries — these two parameters are mandatory partners and omitting `singleEvents` causes a 400 error.
  • Add a unique `requestId` per create call — a string combining the user's UID and a timestamp works. Reusing the same requestId can cause Google to return a cached failed response.
  • For production apps that need Cross-user calendar access or organization-wide meeting data, use a service account with domain-wide delegation in a Cloud Function — never attempt admin-level operations from the FlutterFlow client.
  • The `calendar.events` scope is sensitive — complete Google's OAuth verification before releasing to the public or users will see a security warning screen during sign-in.
  • Inform users clearly that the integration accesses their Google Calendar and creates events in their primary calendar — this transparency is required by Google's OAuth policy and builds user trust.

Alternatives

Frequently asked questions

Is there a dedicated Google Meet API I can call directly?

For most developers, no. Google Meet meetings are created by calling the Google Calendar API v3 with conferenceDataVersion=1. Google does have a separate Meet REST API (meet.googleapis.com/v2/spaces) in beta for creating persistent Meet spaces, but it requires Google Workspace Enterprise and specific API enablement — it is not available for standard Google accounts or the typical FlutterFlow app.

Why can't I use FlutterFlow's built-in Google Sign-In button for this integration?

FlutterFlow's Google Sign-In widget goes through Firebase Auth, which only requests basic profile scopes (email, profile, openid). The Calendar API requires the additional `calendar.events` scope, which must be requested at sign-in time. The Custom Action in Step 2 handles this by calling `google_sign_in` directly with the explicit scope list.

Will the Meet join URL work on mobile devices or only in a browser?

The Meet URL (https://meet.google.com/xxx-xxxx-xxx) opens in a browser by default. On Android and iOS, if the Google Meet app is installed, tapping the URL may deep-link into the app. You can use FlutterFlow's Launch URL action to open it — on devices with the Meet app installed, the OS will offer to open Meet directly.

Can I create meetings in someone else's calendar, not just the signed-in user's?

Not from the client side. Adding events to another user's calendar requires either (a) the other user has shared their calendar with write access, or (b) a service account with domain-wide delegation running in a Cloud Function. The client-side token only authorizes actions on the signed-in user's own calendars.

How does this integration work with recurring meetings?

To create a recurring event, add a `recurrence` array to the event body with RRULE syntax (e.g., `RRULE:FREQ=WEEKLY;COUNT=10` for 10 weekly occurrences). The Meet link is shared across all instances of the recurring event. When listing events, use `singleEvents=true` to expand recurrences into individual instances so each has its own start/end time.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.