Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow Native Integration

Google Maps API

Connect FlutterFlow to Google Maps API using the native Google Map widget — no Custom Widget or Dart code required. Paste platform-restricted API keys into FlutterFlow Project Settings and the widget renders immediately. Places autocomplete, Geocoding, and Directions are separate REST API Calls to maps.googleapis.com. Always restrict each key by platform (Android SHA-1, iOS bundle ID, HTTP referrer) and enable each SKU in Google Cloud Console. The $200 credit was replaced in March 2025 — free usage is now per-SKU.

What you'll learn

  • How to create a Google Cloud project, enable the correct Maps SDK SKUs, and generate platform-restricted API keys
  • Where to paste API keys in FlutterFlow Project Settings and how to configure the native Google Map widget
  • How to add a Places autocomplete API Call for address search within your app
  • How to protect your API keys from abuse using platform restrictions and billing alerts
  • What changed in March 2025 with Google Maps pricing and how to check current per-SKU free tiers
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner16 min read30 minutesMaps & LocationLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Google Maps API using the native Google Map widget — no Custom Widget or Dart code required. Paste platform-restricted API keys into FlutterFlow Project Settings and the widget renders immediately. Places autocomplete, Geocoding, and Directions are separate REST API Calls to maps.googleapis.com. Always restrict each key by platform (Android SHA-1, iOS bundle ID, HTTP referrer) and enable each SKU in Google Cloud Console. The $200 credit was replaced in March 2025 — free usage is now per-SKU.

Quick facts about this guide
FactValue
ToolGoogle Maps API
CategoryMaps & Location
MethodFlutterFlow Native Integration
DifficultyBeginner
Time required30 minutes
Last updatedJuly 2026

Google Maps in FlutterFlow: Native Widget, No Custom Code Required

Google Maps is the one truly native map integration in FlutterFlow — the platform ships with a built-in Google Map widget that connects directly to the Google Maps SDK for Android and iOS. Drop the widget on a page, paste your API key in Project Settings, and a fully interactive, pannable, zoomable map appears with no custom Dart code. This is what distinguishes Google Maps from OpenStreetMap and Mapbox in FlutterFlow: the other two require you to build Custom Widgets, while Google Maps works immediately from the FlutterFlow widget palette.

Before you start, understand that 'Google Maps API' is actually a platform of separate products, each called a SKU: Maps SDK for Android, Maps SDK for iOS, Maps JavaScript API (for web), Places API, Geocoding API, and Directions API. Each SKU must be individually enabled in your Google Cloud Console project. An API key is valid for all enabled SKUs, but a call to a disabled SKU returns REQUEST_DENIED even if the key is perfectly valid. This is the single most common source of confusion for FlutterFlow developers integrating Google Maps.

On pricing: as of March 2025, Google replaced the $200 monthly credit with per-SKU free tiers. Each SKU now has its own monthly free allowance — for example, the Essentials tier for Dynamic Maps and Geocoding includes approximately 10,000 free requests per month per SKU (verify current free tiers at developers.google.com/maps/billing before making promises to clients). After the free tier, pricing is per 1,000 requests and varies by SKU and usage tier. Always set up a billing budget alert in Google Cloud to avoid surprise charges.

Integration method

FlutterFlow Native Integration

FlutterFlow ships a native Google Map widget connected to the Google Maps SDK for Android and iOS. You paste API keys directly into FlutterFlow Project Settings and the widget renders a fully interactive map on any page without writing any Dart code. Beyond the base map widget, additional Google Maps platform services — Places autocomplete, Geocoding, and Directions — are REST API Calls to the maps.googleapis.com endpoints, using the same API key. Each service (SKU) must be separately enabled in Google Cloud Console.

Prerequisites

  • A Google Cloud project with a billing account attached — Maps API calls require billing even when within free tiers
  • A FlutterFlow project — any plan supports the native Google Map widget
  • Your app's Android package name (e.g., com.yourcompany.yourapp) and iOS bundle ID — needed to restrict API keys by platform
  • For Android key restriction: the SHA-1 signing certificate fingerprint of your debug and release keystores
  • A Google Cloud budget alert configured — Maps API billing can accumulate quickly if an unrestricted key is scraped from your app

Step-by-step guide

1

Create a Google Cloud project and enable Maps SDK SKUs

Go to console.cloud.google.com and create a new project (or select an existing one). Attach a billing account — this is required even for usage within the free tiers. Without a billing account, all Maps API calls return REQUEST_DENIED regardless of key validity. In the left menu, go to APIs & Services → Library. Search for and enable the following APIs one by one — each click takes you to the API's page where you click 'Enable': - Maps SDK for Android (required for the Android build of your app) - Maps SDK for iOS (required for the iOS build) - Maps JavaScript API (required if you build a FlutterFlow web app) - Places API (required for address autocomplete and nearby search) - Geocoding API (required for address-to-coordinate conversion) - Directions API (required for routing) Only enable the SKUs you actually plan to use — each enabled SKU is independently billed if usage exceeds its free tier. If you enable Directions but never call it, there is no cost. Enabling is reversible at any time. After enabling each API, go to APIs & Services → Dashboard to confirm they appear in your 'Enabled APIs' list. This list is your reference for troubleshooting REQUEST_DENIED errors.

Pro tip: Bookmark your Google Cloud project's APIs & Services → Dashboard page — you will return here frequently to check which SKUs are enabled when debugging REQUEST_DENIED errors.

Expected result: Your enabled APIs list shows Maps SDK for Android, Maps SDK for iOS, and whichever additional SKUs you plan to use. A billing account is attached to the project.

2

Create platform-restricted API keys in Google Cloud Console

In Google Cloud Console, go to APIs & Services → Credentials and click '+ Create Credentials → API Key'. An unrestricted key will be created. Click 'Edit API Key' to add restrictions. For Android: under 'Application restrictions', select 'Android apps'. Add your app's package name (e.g., com.yourcompany.myapp) and the SHA-1 fingerprint of your keystore. You can find your debug SHA-1 by running `keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore` in a terminal (outside FlutterFlow). Create a separate key for your release keystore when you are ready to publish. For iOS: create a separate API key. Under 'Application restrictions', select 'iOS apps'. Add your app's bundle ID (e.g., com.yourcompany.myapp). For web: create a third API key. Under 'Application restrictions', select 'HTTP referrers (web sites)'. Add your deployed app's domain (e.g., https://yourdomain.com/*). Platform restrictions are the single most important security step. An unrestricted key embedded in a compiled Flutter app can be extracted from the APK and used to run up charges on your billing account — this is the #1 Google Maps abuse vector. Many developers skip key restriction during development and forget to add it before launch. After creating the keys, you can optionally add 'API restrictions' (limit each key to only the specific SKUs it needs) as an additional layer of defense. Name your keys clearly: 'MyApp Android Key', 'MyApp iOS Key', 'MyApp Web Key'.

Pro tip: Create three separate keys — one per platform — rather than one unrestricted key. If a key is compromised, you can revoke just that platform's key without impacting others.

Expected result: You have platform-restricted API keys for Android, iOS, and web stored in Google Cloud Console, each named clearly so you can manage them independently.

3

Paste API keys into FlutterFlow Project Settings

In FlutterFlow, click the Settings gear icon in the left nav, then select Project Setup → API Keys (or navigate to Settings & Integrations → Google Maps). You will see three key fields: Android API Key, iOS API Key, and Web API Key. Paste the corresponding platform-restricted API key into each field. FlutterFlow uses these keys when it compiles your app: the Android key is embedded in the AndroidManifest.xml, the iOS key is embedded in AppDelegate.swift, and the web key is included in the web build configuration. FlutterFlow handles all of this automatically — you do not need to edit any config files manually. After pasting the keys, return to any page in your FlutterFlow project. Open the Widget Palette from the left nav, scroll to Maps, and drag the Google Map widget onto your page. Set a width (use 100% or a fixed pixel value) and height (300-400 px is a good starting point). In the canvas, the map may show a grey placeholder — switch to Run mode to see it render with tiles. In the Google Map widget's settings panel on the right, you can configure: Initial Location (hardcoded lat/lng or bound to Page State), Initial Zoom Level (13-15 is good for a city neighborhood), Map Type (Normal, Satellite, Terrain, Hybrid), and whether to show the user's current location dot (enable 'Show My Location' and grant location permissions in Settings → Permissions).

Pro tip: After pasting keys, switch to Run mode immediately to confirm the map widget renders — if you see a 'Google Maps API key not valid' error in the preview, double-check that the correct platform key is in the correct field.

Expected result: The Google Map widget renders a live interactive map in FlutterFlow's Run mode, centered at the configured initial location.

4

Add a Places autocomplete API Call for address search

The native Google Map widget handles rendering but does not include a search bar. For address autocomplete, you need an API Call to the Places API Autocomplete endpoint. Click API Calls in the left nav, then + Add → Create API Call. Name it 'PlacesAutocomplete'. Set Method to GET and URL to https://maps.googleapis.com/maps/api/place/autocomplete/json. In the Query Parameters tab, add: input (bound to variable searchText), key (hardcoded to your API key — this is a public key, so embedding it as a query param is acceptable if the key is HTTP-referrer or iOS/Android restricted), and optionally types with value geocode to limit results to address entries. In Response & Test, paste a test call with a partial address (e.g., 'Eiffel') and generate JSON Paths. The key paths are $.predictions[*].description (the full display string for autocomplete suggestions) and $.predictions[*].place_id (needed to get full coordinates). Create a second API Call named 'PlaceDetails' to get the coordinates of a selected prediction. URL: https://maps.googleapis.com/maps/api/place/details/json. Query params: place_id (bound to a variable) and key. Response JSON Paths: $.result.geometry.location.lat and $.result.geometry.location.lng. On your map page, add a TextField and a ListView of autocomplete suggestions. When the user types, trigger PlacesAutocomplete and populate the suggestion list. When they select a suggestion, trigger PlaceDetails with the place_id to get lat/lng, then update the Page State variables bound to the Google Map widget's Initial Location to pan the map.

typescript
1// Places Autocomplete API Call config
2// Method: GET
3// URL: https://maps.googleapis.com/maps/api/place/autocomplete/json
4// Query params:
5// input = {{searchText}}
6// key = YOUR_API_KEY
7// types = geocode (optional: restrict to addresses)
8// Response JSON Paths:
9// $.predictions[*].description → suggestion display text
10// $.predictions[*].place_id → ID to fetch coordinates
11
12// Place Details API Call config
13// Method: GET
14// URL: https://maps.googleapis.com/maps/api/place/details/json
15// Query params:
16// place_id = {{placeId}}
17// fields = geometry
18// key = YOUR_API_KEY
19// Response JSON Paths:
20// $.result.geometry.location.lat
21// $.result.geometry.location.lng

Pro tip: The Places API uses two calls: Autocomplete (returns text predictions) followed by Place Details (returns coordinates for the selected prediction). You cannot get coordinates from the Autocomplete response alone.

Expected result: Typing in the search TextField triggers the PlacesAutocomplete API Call and populates a suggestions list. Selecting a suggestion fetches its coordinates via PlaceDetails and pans the map to that location.

5

Set up billing alerts and restrict keys before launch

Before going to production with any Google Maps integration, two tasks are non-negotiable: billing alerts and key restrictions. For billing alerts: go to Google Cloud Console → Billing → Budgets & Alerts. Create a budget for your project with a monthly cap (start with $10-20 for a small app). Set alerts at 50%, 90%, and 100% of the budget — Google will email you as usage climbs. Without an alert, a misconfigured or scraped API key can run up hundreds of dollars in charges before you notice. For key restrictions (if not already done): go back to APIs & Services → Credentials and verify that every key used in production is platform-restricted. Test each key by attempting to use it from a different platform — the Android key should fail if called from a browser, and the iOS key should fail if called from an Android device. This verification step catches keys that were accidentally left unrestricted. For the Places and Geocoding API Calls in FlutterFlow, the API key is embedded in the query string. If you are concerned about key visibility in web builds, consider routing these calls through a Firebase Cloud Function or Supabase Edge Function proxy that holds the key server-side and returns results to the app. For mobile-only builds with a properly restricted Android/iOS key, embedding the key as a query param is the standard and accepted approach — the platform restriction itself is the security control. Finally, monitor your API usage in Google Cloud Console → APIs & Services → Dashboard. Click any enabled API to see call counts, error rates, and latency over time. This dashboard is where you will spot unexpected usage spikes or REQUEST_DENIED rates that indicate a configuration problem.

Pro tip: Set up a Google Cloud billing alert for $10 before testing with real devices — it takes 5 minutes and can save you from an unexpected bill if a key is misconfigured.

Expected result: Billing alerts are configured, all API keys are platform-restricted, and your Google Cloud dashboard shows Maps API calls appearing as you test the app in Run mode.

Common use cases

Service booking app with location selection

A home services app (cleaning, plumbing, landscaping) lets customers pick their service address by typing into a Places autocomplete field, which drops a pin on the native FlutterFlow Google Map widget and passes the selected address to the booking form. The map gives instant visual confirmation of the selected location before checkout.

FlutterFlow Prompt

Build a FlutterFlow booking screen with a Google Map widget and a Places autocomplete search bar that pans the map to the selected address and drops a pin.

Copy this prompt to try it in FlutterFlow

Restaurant finder app with proximity search

A food discovery app uses the Google Map widget to show nearby restaurants as pins. When a user taps a pin, a bottom sheet shows restaurant details. The Directions API provides a 'Get Directions' button that launches turn-by-turn navigation in Google Maps via a deep link.

FlutterFlow Prompt

Create a FlutterFlow map screen that shows restaurant locations from a Supabase table as Google Maps markers, with a detail sheet when a pin is tapped.

Copy this prompt to try it in FlutterFlow

Real estate app with neighborhood map

A property listing app embeds a Google Map widget on each property detail page, centered on the listing's lat/lng coordinates. An address Geocoding API Call converts the property address to coordinates on page load, and the map renders a single pin with a custom info window showing the property price.

FlutterFlow Prompt

Add a Google Map widget to a FlutterFlow property detail page that geocodes the listing address and shows a single pin at that location.

Copy this prompt to try it in FlutterFlow

Troubleshooting

REQUEST_DENIED error in the Google Map widget or API Call responses

Cause: The most common causes are: the relevant Maps SKU is not enabled in Google Cloud Console, the API key is restricted to a different platform than the one making the request, or billing is not enabled on the Google Cloud project.

Solution: In Google Cloud Console, go to APIs & Services → Dashboard and verify the specific SKU that is failing (Maps SDK for Android, Places API, etc.) appears in your enabled list. If it is not there, click the Library link and enable it. Also verify that a billing account is attached to the project in Billing → Overview. If the SKU is enabled and billing is active, check the key restrictions — ensure the Android SHA-1 fingerprint is your actual keystore fingerprint, not a placeholder.

Google Map widget shows a white blank area or 'For development purposes only' watermark

Cause: The API key is not set in FlutterFlow Project Settings for the current build platform, or the key is set but does not have the Maps SDK for the correct platform enabled.

Solution: Go to FlutterFlow Settings → Project Setup → API Keys and confirm the correct key is in the correct field (Android Key for Android preview, iOS Key for iOS preview). Switch to Run mode and check if the watermark appears — it usually means the key is present but unrecognized for the platform. Verify the key in Google Cloud Console has Maps SDK for Android (or iOS) enabled under API restrictions.

Places Autocomplete API Call returns ZERO_RESULTS for partial address input

Cause: The input parameter is too short (less than 3 characters) or the types restriction is filtering out the results for the specific input.

Solution: Ensure the API Call is only triggered when the search TextField has at least 3 characters — add a condition in your action flow that checks string length before calling PlacesAutocomplete. If ZERO_RESULTS persist with longer inputs, remove the types=geocode restriction temporarily to see if results return without it, then decide if you need that filter.

Unexpected Google Maps billing charges appear on the Google Cloud account

Cause: An API key was left unrestricted and was scraped from the compiled app binary, or the app is making many more API calls than expected due to autocomplete triggering on every keystroke.

Solution: Immediately revoke the compromised key in Google Cloud Console → Credentials and create a new platform-restricted replacement. Add debouncing to your autocomplete action (fire only after 400ms of no typing). Set a budget alert so you are notified before charges accumulate. Review the Cloud Console usage dashboard to identify which SKU and calling pattern is generating the charges.

Best practices

  • Always platform-restrict API keys: use Android SHA-1 restriction for Android keys, iOS bundle ID restriction for iOS keys, and HTTP referrer restriction for web keys — an unrestricted key in a compiled app is the #1 Google Maps abuse vector
  • Create three separate API keys (Android, iOS, web) rather than one unrestricted key — if one is compromised, revoke it without affecting other platforms
  • Set a Google Cloud billing budget alert for $10-20 before testing with real devices — Maps API billing can accumulate quickly and Google does not alert you by default
  • Enable only the SKUs you actually use in Google Cloud Console — this reduces billing surface and makes it easier to diagnose REQUEST_DENIED errors
  • The March 2025 pricing change removed the $200 monthly credit and replaced it with per-SKU free tiers — check current limits at developers.google.com/maps/billing before estimating costs for clients
  • Add a minimum character threshold (3+) before triggering Places Autocomplete — this reduces API calls and improves the user experience by avoiding meaningless one-letter results
  • For web builds where the API key is visible in network requests, consider proxying Places and Geocoding calls through a Firebase or Supabase function with the key stored server-side
  • Test your app's map functionality in both online and offline states — the native Google Map widget caches recent tile areas, but API calls fail gracefully only if you add error handling in your action flows

Alternatives

Frequently asked questions

Do I need to write any Dart code to add Google Maps to my FlutterFlow app?

No — the native Google Map widget requires zero custom code. Paste your API key in Project Settings, drag the widget onto a page, and it renders. Custom code is only needed if you want deeply custom map overlays or features not available through the widget's settings panel. Places autocomplete and Directions are handled via FlutterFlow's API Call feature, also without Dart.

Does the $200 monthly Google Maps credit still apply?

No. As of March 2025, Google replaced the flat $200/month credit with per-SKU free tiers. Each Maps API service now has its own monthly free request allowance rather than a shared credit pool. Check the current free tier limits at developers.google.com/maps/billing — the exact numbers change periodically and vary by SKU. Always verify before estimating costs for a production app.

Can I show the user's current location on the Google Map widget in FlutterFlow?

Yes. In the Google Map widget settings, enable 'Show My Location'. You also need to grant location permissions in FlutterFlow Settings & Integrations → Permissions → Location (enable 'When In Use' for iOS and location permission for Android). When the user grants permission, a blue dot appears on the map at their current location. To programmatically center the map on the user's location, use the Current Location action in your action flow and bind the result to the widget's center coordinates.

Why does my Google Maps key work on Android but fail on iOS (or vice versa)?

Each platform requires a separate API key with platform-specific restrictions. The Android key is restricted by package name and SHA-1 fingerprint, while the iOS key is restricted by bundle ID. If you paste the Android key into the iOS key field in FlutterFlow (or use one unrestricted key for both platforms), calls from the wrong platform type will fail with a REQUEST_DENIED response. Create separate keys for each platform and paste them into the correct fields in FlutterFlow Project Settings.

How do I add custom map markers (icons, colors) to the FlutterFlow Google Map widget?

The native FlutterFlow Google Map widget allows setting a custom marker image via the widget's Markers property — you can provide an image asset from your FlutterFlow project's asset library. For data-driven markers (e.g., different colors based on a status field), use the Marker Builder in the widget settings to conditionally set the marker asset based on the data item's properties. For very advanced marker customization (HTML overlays, SVG), you would need a Custom Widget approach.

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.