Connect FlutterFlow to Looker Studio (formerly Google Data Studio) by embedding a shared report inside a Custom Widget using the flutter_inappwebview package. There is no management API — the only integration path is iframe embedding. Set your report to link-accessible, copy the embed URL from File → Embed report, and display it in your app. No proxy or API key needed for public reports.
| Fact | Value |
|---|---|
| Tool | Looker Studio (Google Data Studio) |
| Category | Analytics |
| Method | Custom Widget |
| Difficulty | Beginner |
| Time required | 30 minutes |
| Last updated | July 2026 |
The only way to show Looker Studio in FlutterFlow
Looker Studio — Google renamed it from Data Studio in 2022, but most founders still search both names — is a completely free BI tool that sits on top of Google's data ecosystem. It connects natively to Google Sheets, BigQuery, Google Analytics, Search Console, and dozens of community connectors, and it produces interactive charts and dashboards that update automatically as the underlying data changes. The catch is that Google has never published a report-management API: you cannot create, update, or query a report programmatically. What you can do is embed any report that is shared with link access into an iframe, and that iframe path is exactly how FlutterFlow apps display Looker Studio.
Because FlutterFlow compiles to a Flutter app running on the user's device, the cleanest way to show a web-based embed is a Custom Widget backed by the flutter_inappwebview package. This widget opens a WebView pane inside your app's UI and loads the Looker Studio embed URL — the same URL a browser would load in an iframe. The widget can be sized and positioned like any other FlutterFlow component. You do not need an API key, a backend proxy, or any secret credentials: if the report is shared with anyone who has the link, the WebView loads it without prompting the user to sign in to a Google account.
The most powerful version of this integration pairs the embed with a Firebase → BigQuery pipeline. Your FlutterFlow app writes data to Firestore as users interact with it; a Firebase extension (Stream Collections to BigQuery) mirrors that data to BigQuery in near real-time; and your Looker Studio report uses BigQuery as its data source. The result is a live analytics dashboard that updates as real users take actions in the app — all without any API calls from FlutterFlow itself. Looker Studio Pro, which adds SLA guarantees and workspace management features, is a paid tier; the free plan is more than enough for embedding and standard connectors.
Integration method
Because Looker Studio has no public report-management API, the only integration path is embedding: you build your report in Looker Studio, enable public link sharing, and render the embed URL inside a FlutterFlow Custom Widget backed by the flutter_inappwebview package. For the report to show live app data, you point its data source at the same backend your app uses — for example, connecting Looker Studio to a BigQuery dataset that is continuously updated via the Firebase → BigQuery export extension.
Prerequisites
- A Looker Studio account (free — sign in at lookerstudio.google.com with a Google account)
- A published Looker Studio report with at least one data source connected
- A FlutterFlow project on any paid plan (Custom Code requires a paid plan to publish; you can build on free but need a paid plan to test on a real device)
- Basic familiarity with FlutterFlow's Custom Code panel (Custom Widgets section)
- Optional: A Firebase project with the Stream Collections to BigQuery extension if you want live Firestore data in your report
Step-by-step guide
Build your Looker Studio report and enable embedding
Open lookerstudio.google.com and create a new report, or open an existing one. Add your data source — Google Sheets, BigQuery, Google Analytics, or any connector — and build the charts and tables you want to display inside the app. Once the report looks the way you want, you need to configure two things: sharing permissions and embed permissions. For sharing, click the Share button in the top-right corner of the Looker Studio editor. Under 'Get link', change the access level from 'Restricted' to 'Anyone with the link can view'. This is the step most people skip, and skipping it means the WebView inside your app shows a Google sign-in page instead of the report — because Looker Studio challenges anonymous viewers when the report is restricted. For embedding, go to File → Embed report (or Report Settings → Embed). Check the 'Enable embedding' checkbox. Looker Studio will show you a full iframe snippet like `<iframe width="600" height="450" src="https://lookerstudio.google.com/embed/reporting/abc123/page/XXXXX" ...>`. The part you want is the src URL — specifically the path that starts with `/embed/reporting/`. Copy just that URL (not the full iframe tag); you will paste it into your FlutterFlow widget in the next steps. Looker Studio Free is entirely free for this; Looker Studio Pro adds SLA and workspace management but is not needed for embedding.
Pro tip: Use a 'Page link' to embed a specific report page if your report has multiple pages — find it under File → Embed report, select the page you want, and copy that page's embed URL.
Expected result: You have a Looker Studio embed URL in the format https://lookerstudio.google.com/embed/reporting/{report-id}/page/{page-id} and the report is set to 'Anyone with the link can view'.
Create a Custom Widget in FlutterFlow and add the InAppWebView dependency
In FlutterFlow, click Custom Code in the left navigation panel. You will see three sub-sections: Actions, Functions, and Widgets. Click the Widgets tab, then click the + Add button and choose Create New Widget. Give it a name like LookerStudioEmbed or DataStudioWidget. FlutterFlow will open a Dart code editor pre-filled with a starter widget skeleton. Before writing any code, you need to add the flutter_inappwebview package as a dependency. In the Custom Code panel, look for a Dependencies section (sometimes visible in the right sidebar when a widget is open). Type flutter_inappwebview in the package search field and select the latest stable version. FlutterFlow will add it to your pubspec.yaml automatically — you do not need a terminal or flutter pub get. Alternatively, some FlutterFlow versions show the dependency field directly inside the widget editor. Either way, once flutter_inappwebview is added, the import will be available in your Dart code. This is the most widely used WebView package in the Flutter ecosystem; it supports iOS WKWebView, Android WebView, and web builds (with limitations). Before writing the widget code, also add two parameters in the widget's Parameters tab: a String parameter called embedUrl (the Looker Studio embed URL) and optional double parameters for width and height so the widget is resizable from the FlutterFlow canvas.
Pro tip: Add the embedUrl as a widget parameter rather than hardcoding it — this lets you reuse the same Custom Widget for multiple different Looker Studio reports across different screens by passing different URLs.
Expected result: A new Custom Widget appears in the Widgets list with flutter_inappwebview listed as a dependency and an embedUrl string parameter defined.
Write the InAppWebView widget Dart code
In the Custom Widget's Dart editor, replace the default skeleton with the WebView widget code below. The widget accepts the embedUrl parameter you defined, creates an InAppWebView that loads it, and exposes width and height so FlutterFlow can size it on the canvas. A few things to understand about what this code does: InAppWebViewController is stored in a variable so you could call controller.reload() from an action if needed. InAppWebViewSettings controls browser behaviour — disableHorizontalScroll and disableVerticalScroll are false so the report is scrollable, which is important for multi-chart reports on smaller phone screens. The initialSettings also disable zoom by default to keep the report from feeling like a raw website inside the app; remove that setting if you want pinch-to-zoom. On iOS, Apple Transport Security (ATS) requires that all URLs loaded in a WebView use HTTPS. Looker Studio embed URLs always start with https://lookerstudio.google.com, so this is satisfied automatically. On Android, no extra manifest changes are needed for HTTPS URLs. Important: this Custom Widget does NOT render in FlutterFlow's web-based Run mode (the preview inside the browser). You will see an empty white box in the canvas and in Run mode. This is expected behaviour for WebView-based Custom Widgets across all FlutterFlow projects — you must use Test Mode (which installs on a connected device or emulator) or build an APK/IPA to see the widget render correctly.
1// Custom Widget: LookerStudioEmbed2// Dependency: flutter_inappwebview (add in FlutterFlow Dependencies)34import 'package:flutter/material.dart';5import 'package:flutter_inappwebview/flutter_inappwebview.dart';67class LookerStudioEmbed extends StatefulWidget {8 const LookerStudioEmbed({9 Key? key,10 this.width,11 this.height,12 required this.embedUrl,13 }) : super(key: key);1415 final double? width;16 final double? height;17 final String embedUrl;1819 @override20 State<LookerStudioEmbed> createState() => _LookerStudioEmbedState();21}2223class _LookerStudioEmbedState extends State<LookerStudioEmbed> {24 InAppWebViewController? _controller;2526 @override27 Widget build(BuildContext context) {28 return SizedBox(29 width: widget.width ?? double.infinity,30 height: widget.height ?? 500,31 child: InAppWebView(32 initialUrlRequest: URLRequest(33 url: WebUri(widget.embedUrl),34 ),35 initialSettings: InAppWebViewSettings(36 javaScriptEnabled: true,37 supportZoom: false,38 useWideViewPort: true,39 loadWithOverviewMode: true,40 ),41 onWebViewCreated: (controller) {42 _controller = controller;43 },44 onLoadError: (controller, url, code, message) {45 debugPrint('LookerStudio load error $code: $message');46 },47 ),48 );49 }50}Pro tip: Set height to 600-800px for a typical Looker Studio report with multiple charts — the default 500px often cuts off the bottom section.
Expected result: The widget compiles without errors in the FlutterFlow Dart editor and appears in the Custom Widgets list ready to be dragged onto a screen.
Add the widget to a screen and bind the embed URL
Navigate to the screen where you want the Looker Studio report to appear. In the FlutterFlow widget panel, scroll down to the Custom Widgets section (it appears at the bottom of the widget picker after you've added your first Custom Widget). Drag LookerStudioEmbed onto the screen and drop it into a Column, Container, or wherever you want it positioned. With the widget selected on the canvas, open the Properties panel on the right. You will see the embedUrl parameter field. Paste the full Looker Studio embed URL you copied in Step 1 — for example, https://lookerstudio.google.com/embed/reporting/abc123def456/page/XXXXX. Set the width to Match Parent if you want the report to fill the horizontal space, and set a specific height in pixels (600–800 works well for most dashboards). If you want the embed URL to be dynamic — for example, loaded from your Supabase or Firebase database so different admin users see different reports — you can bind the embedUrl parameter to a page state variable or a query result instead of hardcoding it. Create an app state variable of type String, set it from a backend query, and bind it to the widget's embedUrl parameter using the variable picker in the Properties panel. For web builds: InAppWebView on web uses an iframe under the hood. The Looker Studio embed URL does allow cross-origin iframing — Google sets the appropriate headers — so this generally works in FlutterFlow web builds too. However, some browsers block third-party cookies in iframes by default (Safari ITP, Chrome Privacy Sandbox), which may affect authenticated Google sessions. For fully public reports, this is a non-issue.
Pro tip: Wrap the widget in a Loading widget and show a CircularProgressIndicator while the WebView is loading — hook the onLoadStop callback to toggle a page state variable to false when the page has finished loading.
Expected result: The LookerStudioEmbed widget appears on the screen with the embed URL set. In Run mode you will see a placeholder; on a real device via Test Mode the report renders inside the app.
Test on a device and optionally wire live Firestore data via BigQuery
Because Custom Widgets using WebView do not render in FlutterFlow's browser-based Run mode, you must test on a real device or emulator. In FlutterFlow, click the Test button (the phone icon) in the top toolbar to build a debug APK or open on a connected iOS/Android device. Once the app launches on your device, navigate to the screen with the Looker Studio widget. The report should load within a few seconds — the same way it loads in a mobile browser. If the widget shows a blank white screen on device: check that the embed URL is correct and starts with /embed/reporting/ (not the regular report URL); check that the report is set to 'Anyone with the link can view'; and check that embedding is enabled (File → Embed report → Enable embedding checkbox). For the optional BigQuery data pipeline: in the Firebase console, go to Extensions → Explore → Stream Collections to BigQuery → Install. Configure it to mirror the Firestore collection that holds your app's data — for example the 'orders' or 'events' collection. Once installed, writes to Firestore flow into a BigQuery dataset within minutes. In Looker Studio, add BigQuery as a new data source, select the dataset and table, and build your charts on top of it. Now when users take actions in your FlutterFlow app, their data shows up in the Looker Studio report that is embedded in the app — a live feedback loop with zero custom API work from FlutterFlow's side. If you need this integration set up quickly or want a custom Firestore → BigQuery → Looker Studio pipeline, RapidDev's team builds FlutterFlow integrations like this every week — free scoping call at rapidevelopers.com/contact.
Pro tip: BigQuery has a 10GB free tier of storage and 1TB of free query processing per month — more than enough for most early-stage apps. Enable the export and the cost stays at zero until you scale.
Expected result: The Looker Studio report renders correctly inside the app on a real device, showing live chart data. If the BigQuery export is configured, the report refreshes automatically as new Firestore data arrives.
Common use cases
Founder dashboard embedded in an admin-only screen
Build a FlutterFlow app with a locked admin section visible only to users with the admin role. Inside that section, embed a Looker Studio report that pulls from Google Sheets or BigQuery to show signups, revenue, and churn. The report updates automatically as new data flows in, and the admin sees a polished dashboard without leaving the app.
A dashboard screen in my FlutterFlow admin app that shows a Looker Studio report of our weekly signups, MRR, and churn rate, embedded full-screen with no navigation chrome visible.
Copy this prompt to try it in FlutterFlow
Customer-facing analytics panel in a SaaS app
Give each customer a per-account analytics view by embedding a Looker Studio report whose BigQuery data source is filtered by a company ID. Since Looker Studio supports URL parameters to filter reports, you can append a filter to the embed URL dynamically from FlutterFlow before loading it in the WebView, showing each customer their own numbers.
A screen in my B2B FlutterFlow app that loads a Looker Studio embed URL with a company_id filter in the query string, so each customer sees only their own usage metrics.
Copy this prompt to try it in FlutterFlow
Firestore data visualised via Firebase BigQuery export
Use the Firebase extension to stream a Firestore collection to BigQuery, then build a Looker Studio report on top of it. Inside your FlutterFlow app, show that report on a stats screen so non-technical stakeholders can explore the data without needing access to the Firebase console.
A FlutterFlow screen that embeds a Looker Studio report connected to BigQuery, showing charts of my Firestore 'orders' collection grouped by day, product, and region.
Copy this prompt to try it in FlutterFlow
Troubleshooting
The WebView shows a Google sign-in page instead of the report
Cause: The report's sharing is set to 'Restricted', so Looker Studio prompts anonymous viewers to log in with a Google account.
Solution: In Looker Studio, click Share → Get link → change access to 'Anyone with the link can view'. Also verify that File → Embed report → Enable embedding is checked. Both settings are required for the embed to work without authentication.
The Custom Widget shows a blank white box in FlutterFlow Run mode
Cause: WebView-based Custom Widgets do not render in FlutterFlow's browser-based Run mode — this is a known FlutterFlow limitation, not a code bug.
Solution: Use Test Mode (click the phone icon in the top toolbar) to install the app on a connected device or emulator. The widget renders correctly on real Android and iOS devices. You will always see a placeholder in the browser-based Run preview.
The embed URL returns a 404 or shows 'Report not found'
Cause: The URL copied is the regular viewing URL (https://lookerstudio.google.com/reporting/...) rather than the embed URL (https://lookerstudio.google.com/embed/reporting/...).
Solution: Go to File → Embed report in Looker Studio and copy the URL from the iframe src attribute in the generated snippet — it must start with /embed/reporting/. Do not use the URL from your browser's address bar, which is the viewer URL, not the embed URL.
On iOS the WebView shows 'This page could not be loaded' or a blank screen
Cause: Apple Transport Security (ATS) blocks HTTP URLs in iOS WebViews. If a custom proxy or shortening service was used for the embed URL and it redirects over HTTP at some point, ATS will block it.
Solution: Always use the full HTTPS Looker Studio embed URL directly (https://lookerstudio.google.com/embed/...) without any HTTP redirect in the chain. Looker Studio's own domain is always HTTPS, so using the URL directly from File → Embed report will always satisfy ATS.
Best practices
- Always use the /embed/reporting/ URL path — not the standard report viewer URL — and verify that 'Enable embedding' is checked in File → Embed report before adding the URL to your widget.
- Set report sharing to 'Anyone with the link can view' for embedded reports. 'Restricted' access forces a Google sign-in wall inside the WebView, breaking the experience for most users.
- Store the embed URL as a FlutterFlow app constant or in your database rather than hardcoding it in the widget — this lets you update the report URL without releasing a new app version.
- Add a loading indicator on the screen (CircularProgressIndicator) while the WebView loads, and hide it once onLoadStop fires — Looker Studio reports can take 2-4 seconds to fully render, especially on slower connections.
- Point your Looker Studio data source at BigQuery (via the Firebase Stream Collections to BigQuery extension) to show live Firestore data in the report — this is the most powerful combination with a FlutterFlow + Firebase backend.
- Test the embedded report on both Android and iOS devices before shipping — WebView behaviour differs between platforms, and the report should be verified on each.
- Use URL filter parameters (e.g., appending ?params=XYZ to the embed URL) to scope the report to the logged-in user's data when building multi-tenant apps, so each user only sees their own analytics.
- For Looker Studio Pro customers, workspace-level access controls replace link sharing — verify the embedding permissions in the Pro workspace settings rather than the standard sharing dialog.
Alternatives
Choose Grafana if your data lives in time-series databases, Prometheus, or Loki and you need real-time operational dashboards — Grafana supports embed panels natively and has a rich API for dynamic dashboard control.
Choose Tableau if your organisation already uses Tableau Cloud or Server and needs enterprise SSO inside the embedded view via Connected Apps JWT — Tableau has a full REST API that Looker Studio entirely lacks.
Choose Looker if you need a programmatic dashboard API (Looker's API is extensive) and governed data models shared across teams — Looker is the enterprise alternative that actually provides what Looker Studio omits.
Frequently asked questions
Does Looker Studio have an API I can call from FlutterFlow?
No. Google has not published a report-management API for Looker Studio (formerly Data Studio). You cannot create, modify, query, or retrieve report data programmatically through any API endpoint. The only integration path is embedding a shared report URL in a WebView. If you need a programmatic API for BI dashboards, look at Looker (the separate Google product) or Grafana, both of which have REST APIs.
Will the embedded report work on FlutterFlow web builds?
Mostly yes. InAppWebView uses an iframe on web builds and Looker Studio sets the right cross-origin headers to allow embedding. The main caveat is that browsers with strict third-party cookie blocking (Safari on iOS, and Chrome with Privacy Sandbox enabled) can interfere with authenticated Google sessions inside iframes. For fully public reports shared with 'Anyone with the link', this is not an issue because no authentication is required.
Can I show different reports to different users in the same app?
Yes. Store the embed URLs in your Firestore or Supabase database and query the URL for the logged-in user. Bind the query result to the widget's embedUrl parameter. For per-user data filtering on the same report, use Looker Studio's URL filter parameters appended to the embed URL — this lets you scope the report to the current user's data without creating a separate report per user.
How do I get my FlutterFlow app data to appear in a Looker Studio report?
The standard path is Firebase → BigQuery → Looker Studio. Install the 'Stream Collections to BigQuery' Firebase extension in the Firebase console; it mirrors your chosen Firestore collections to a BigQuery dataset in near real-time. Then add BigQuery as a data source in Looker Studio. Alternatively, if you write data to Google Sheets from your FlutterFlow app (via a Cloud Function or an API Call), you can connect Looker Studio directly to that Google Sheet.
Is Looker Studio free?
Yes. Looker Studio is free for individual and team use with no report or data-connector limits for standard connectors. Looker Studio Pro adds SLA guarantees, workspace-level access management, and dedicated support for enterprise customers — check the current Pro pricing in Google's documentation, as it can change. For the embedding use case described here, the free tier is fully sufficient.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation