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`.
| Fact | Value |
|---|---|
| Tool | Google Meet |
| Category | Communication |
| Method | FlutterFlow API Call |
| Difficulty | Advanced |
| Time required | 60 minutes |
| Last updated | July 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
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
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.
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.
1// Custom Action: signInWithGoogleCalendar2// Add dependency: google_sign_in: ^6.2.13// Return type: String (the access token)45import 'package:google_sign_in/google_sign_in.dart';67Future<String> signInWithGoogleCalendar() async {8 final GoogleSignIn googleSignIn = GoogleSignIn(9 scopes: [10 'email',11 'profile',12 'https://www.googleapis.com/auth/calendar.events',13 ],14 );1516 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 '';2122 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.
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`.
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).
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.
1// Custom Function: toIso86012// Argument: dt (DateTime)3// Return type: String4String toIso8601(DateTime dt) {5 return dt.toUtc().toIso8601String();6}78// Custom Function: addMinutes9// Arguments: dt (DateTime), minutes (int)10// Return type: DateTime11DateTime 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.
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.
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.
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.
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
Choose Zoom if you want a dedicated meeting REST API (create/list/report meetings directly) rather than going through Calendar events — Zoom has a first-class meeting API with Server-to-Server OAuth.
Choose Microsoft Teams if your users are on Microsoft 365 and you want to create Teams meetings via the Microsoft Graph API or send notifications via a Teams channel webhook.
Choose Calendly if you want a scheduling-first approach where users pick from available slots — Calendly handles the Meet link creation automatically and you just embed or link to the booking page.
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.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation