Pricing

GA4 "Export to Google Sheets" Creates a Dead File, Here's How to Make It Live

Sessions48,291+14.2%Bounce Rate38.4%−3.1ppAvg Duration2m 41s+0:08Conversions1,284+22.7%Sessions over 30 days
JW
James Whitfield

GA4's Export button only creates a one-time snapshot. Learn 5 methods to automatically export GA4 data to Google Sheets with live, refreshing data. Updated 2026.

GA4's built-in "Export to Google Sheets" button exports your data exactly once, as a static snapshot. It never updates again. To get automatically refreshing GA4 data in Google Sheets, you need to use the Google Analytics Add-on, a custom Apps Script, or a third-party connector. This guide covers every method, from free to fully automated.

The Problem: GA4's Export Is a Dead End

Every analyst eventually discovers the same frustration. You spend time building a report in GA4's Explore interface, hit the export button, and a clean spreadsheet lands in your Google Drive. You share it with your team. Three days later, someone asks why the numbers haven't changed.

They haven't changed because they can't. The export is a photograph, not a window.

As one analyst described it on the SyncWith blog: "In GA4 you can't export directly to Google Sheets, and it seems like they haven't made it easy to find the export feature." That's putting it gently. GA4's export workflow was clearly designed for one-off data pulls, not for teams who need a living dashboard.

Here is a complete picture of what you are actually dealing with:

The 100K row ceiling. GA4's manual export caps at 100,000 rows. If your exploration returns more data than that, you get a truncated file with no warning that data is missing.

No auto-refresh, ever. The spreadsheet exported from GA4's Explore interface is completely disconnected from GA4 once it lands in Drive. There is no "refresh" button, no scheduled sync, no way to reconnect it to the source.

The official add-on only runs daily. Google's own Google Analytics Add-on for Sheets can be scheduled to refresh, but the minimum interval is once per day. If you need intraday data (say, to monitor a campaign launch or a product release) the add-on cannot help you.

Numbers that don't match the UI. When you finally do get data into Sheets, it often doesn't match what you saw in GA4's interface. The culprit is usually reporting identity: GA4 defaults to Blended reporting (combining User-ID, Google signals, and device-based data), while the Data API used by exports and add-ons returns device-based numbers. The same metric, two different answers.

The (other) bucket. GA4 applies cardinality limits to dimensions. When a dimension (like page path or event name) has too many unique values, GA4 groups the overflow rows into a single line labeled "(other)." In a UI report this is a minor annoyance. In an exported dataset used for analysis, it silently destroys the accuracy of page-level and event-level data.

Disappearing historical data. GA4's standard properties retain data for 14 months by default. GA4 360 extends this to 50 months. If your organization is not actively exporting and archiving data, you will quietly lose access to historical records past that window, and you will not receive a notification when it happens.

Connected Sheets is hidden behind a paywall. Google does offer a native GA4 connector inside Connected Sheets, but it is only available on paid Google Workspace tiers (Business Standard and above). Free Google accounts and Workspace Essentials users cannot access it, and Google does not prominently advertise this limitation.

The Solutions: 5 Methods Ranked by Effort

Method 1: Manual Export (Static Snapshot)

Best for: One-time data pulls, ad hoc analysis, reporting on a completed campaign.

This is the built-in option and it requires no setup. Here is exactly how it works.

Step 1. Open GA4 and navigate to Explore in the left sidebar.

Step 2. Build or open the exploration you want to export.

Step 3. Click the Share icon (an arrow pointing out of a box) in the top right corner of the exploration.

Step 4. Select Export data from the dropdown. Choose Google Sheets.

Step 5. GA4 creates a new spreadsheet in your Google Drive containing the data as it exists at this exact moment.

That is it. The file is yours to use, but it will never update. Treat it as a historical record, not a dashboard.

Hard limits to know: Maximum 100,000 rows per export. Complex explorations with segment comparisons may export fewer rows than you expect. The export does not include sampling information: if your exploration was sampled, the exported data is too, silently.

Method 2: Google Analytics Add-on for Sheets (Free, Daily)

Best for: Daily reporting, teams who need automation without writing code, small to medium data volumes.

Google's official add-on is the most practical free option for most teams. It connects directly to the GA4 Data API and can be scheduled to refresh automatically.

Step 1. Open a new Google Sheet. Click Extensions in the menu bar, then Add-ons, then Get add-ons.

Step 2. Search for Google Analytics in the Google Workspace Marketplace. Install the add-on by Google LLC.

Step 3. After installation, click Extensions > Google Analytics > Create new report.

Step 4. A sidebar panel opens. Fill in your report name, select your GA4 property, and choose the metrics and dimensions you want. Common metrics include Sessions, Users, Conversions, and Revenue. Common dimensions include Date, Channel, Source/Medium, and Page Path.

Step 5. Click Create Report. The add-on creates a configuration sheet named "Report Configuration" with your report parameters, and a data sheet where the results will land.

Step 6. To run the report manually, click Extensions > Google Analytics > Run reports.

Step 7. To schedule automatic daily refresh: Click Extensions > Google Analytics > Schedule reports. Toggle on scheduling and select your preferred time. The add-on will run every 24 hours at approximately that time.

Practical limits: The add-on uses the GA4 Data API, which applies its own row limits (typically 100,000 rows per request). Scheduling is daily only. You cannot set it to refresh every hour or every 15 minutes. Very high-traffic properties may hit API quota limits if multiple reports are configured.

Method 3: Connected Sheets Built-in Connector (Workspace Only)

Best for: Organizations on paid Google Workspace tiers that want a native experience.

Google quietly added a GA4 connector to Connected Sheets, but it is only accessible if your Google account is on a qualifying Workspace plan.

Step 1. Open a Google Sheet. Click Data in the menu bar, then Data connectors.

Step 2. If you see Google Analytics in the list of connectors, your account qualifies. If you only see BigQuery and other connectors without GA4, your account tier does not include it.

Step 3. Click Google Analytics, authorize access, and select your GA4 property.

Step 4. Use the field picker to select dimensions and metrics. Click Apply.

Step 5. Connected Sheets will populate with your GA4 data. You can set a refresh schedule from the Data menu.

The catch: Google Business Starter ($6/user/month) does not include this connector. You need Business Standard ($12/user/month) or above. There is no workaround for this restriction, and Google's documentation does not make the tier requirement obvious until you try to use it.

Method 4: Apps Script + GA4 Data API (Free, Requires Code)

Best for: Developers, analysts comfortable with JavaScript, teams needing sub-daily refresh without paying for a tool.

Google Apps Script can call the GA4 Data API directly and write results into any sheet. This approach is free and flexible, but it requires you to write and maintain code.

Step 1. Enable the GA4 Data API for your Google Cloud project. Go to console.cloud.google.com, select your project, navigate to APIs & Services > Library, and enable Google Analytics Data API.

Step 2. Open your Google Sheet. Click Extensions > Apps Script.

Step 3. In the Apps Script editor, add the Analytics Data API service. Click Services (the + icon in the left sidebar), find Google Analytics Data API, and click Add.

Step 4. Write a function that calls the API and writes to your sheet. A minimal example looks like this:

javascript
function fetchGA4Data() {
  const propertyId = 'YOUR_GA4_PROPERTY_ID'; // e.g., '123456789'
  const request = {
    dateRanges: [{ startDate: '28daysAgo', endDate: 'yesterday' }],
    metrics: [{ name: 'sessions' }, { name: 'activeUsers' }],
    dimensions: [{ name: 'date' }, { name: 'sessionDefaultChannelGroup' }]
  };

  const response = AnalyticsData.Properties.runReport(request, `properties/${propertyId}`);
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('GA4 Data') 
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet('GA4 Data');

  sheet.clearContents();

  // Write headers
  const headers = [
    ...response.dimensionHeaders.map(h => h.name),
    ...response.metricHeaders.map(h => h.name)
  ];
  sheet.appendRow(headers);

  // Write rows
  response.rows.forEach(row => {
    const values = [
      ...row.dimensionValues.map(v => v.value),
      ...row.metricValues.map(v => v.value)
    ];
    sheet.appendRow(values);
  });
}

Step 5. Set up a time-based trigger. In Apps Script, click Triggers (clock icon), then Add Trigger. Set the function to fetchGA4Data, choose Time-driven, and select your interval: hourly, every 6 hours, or daily.

The trade-offs: This approach is free and can run as frequently as every hour. However, you are responsible for handling API errors, quota limits, schema changes, and script failures. If the script breaks over a weekend, your dashboard goes stale until someone notices and fixes it.

Method 5: Third-Party Connectors (No Code, Hourly)

Best for: Teams who need reliable, frequent data refresh without maintaining code, analysts who want to focus on analysis rather than infrastructure.

Several products exist specifically to solve the GA4-to-Sheets problem. The major options include Supermetrics, Coupler.io, and brooked.io. They all work on a similar principle: they connect to the GA4 Data API on your behalf, pull the data on a schedule, and write it to your specified sheet.

General setup pattern (varies slightly by tool):

Step 1. Create an account with your chosen connector.

Step 2. Connect your GA4 property by authenticating with your Google account.

Step 3. Connect your Google Sheets destination by authorizing Sheets access.

Step 4. Define your report: choose your date range, select metrics and dimensions, apply any filters.

Step 5. Set your refresh schedule: most tools offer options ranging from every 15 minutes to daily.

Step 6. Run an initial sync and confirm the data appears in your sheet.

The key differentiators across tools are pricing, refresh frequency, row limits, and whether the tool handles things like the reporting identity discrepancy automatically.

Comparison Table

MethodCostRefresh FrequencyRow LimitCode RequiredNotes
Manual ExportFreeNever (one-time)100,000NoNo connection to source after export
GA Analytics Add-onFreeDaily minimum100,000NoScheduling is daily only
Connected SheetsWorkspace paid tierConfigurableHighNoHidden; requires Business Standard+
Apps Script + APIFreeHourly minimumAPI quotaYesRequires maintenance
Third-party connectorsPaid ($20–$100+/mo)15 min–hourlyVaries by planNoMost reliable; least maintenance

Troubleshooting

My numbers don't match what I see in the GA4 UI. The most likely cause is reporting identity. The GA4 Data API returns device-based data by default. GA4's interface uses Blended reporting when available. Check your GA4 property settings under Admin > Reporting Identity and make sure your export method supports the same identity model. Some third-party connectors let you specify this explicitly.

The (other) row is enormous and swallowing my page data. You have hit a cardinality limit. GA4 aggregates values for high-cardinality dimensions into "(other)" when there are too many unique values. Workarounds include narrowing your date range to reduce cardinality, applying filters to focus on a specific subdirectory or event type, or using GA4 360 (which has higher cardinality limits) combined with a BigQuery export for full granularity.

My Apps Script trigger stopped running. Apps Script triggers can fail silently. Check the Executions log in the Apps Script editor to see if recent runs succeeded or errored. Common failure causes include expired OAuth tokens (re-authorize the script), exceeded daily API quotas (space out your triggers), and changes to the sheet structure that break the write logic.

The Google Analytics Add-on says "No data found." Check that your date range is correct. GA4 properties only have data from the date the property was created or when tracking was implemented. Also verify that the metrics and dimensions you selected are compatible. Not all dimension-metric combinations are valid in the GA4 Data API. Refer to Google's GA4 dimensions and metrics reference to check compatibility.

Historical data is missing from my exports. Standard GA4 properties retain data for 14 months by default. If you are querying a date range older than 14 months (or 50 months for GA4 360), that data no longer exists in GA4 and cannot be exported. The solution going forward is to export data into a persistent store (BigQuery, a database, or archived sheets) on a regular schedule so you control the retention window.

The Bottom Line

If you need a one-time pull for a finished campaign or historical analysis, GA4's manual export is fine, just know it will never update.

If you need daily automated refresh and you are comfortable with a free tool that has limitations, start with the Google Analytics Add-on for Sheets. It handles most standard reporting use cases at no cost.

If you need hourly or near-real-time data in Sheets without writing code, you need a third-party connector or a custom Apps Script. The Apps Script route is free but puts maintenance responsibility on you. Third-party tools are more reliable and faster to set up, but carry a monthly cost.

For most analyst teams, especially those who need to share dashboards with non-technical stakeholders. The math usually favors a dedicated connector. The time saved on troubleshooting broken scripts and debugging number discrepancies more than offsets the subscription cost.

Get Live GA4 Data Without the Headaches

brooked.io connects GA4 directly to Google Sheets and Looker Studio with scheduled syncs, automatic schema mapping, and consistent number matching against the GA4 UI. Setup takes a few minutes and no code is required. If you have been patching together manual exports or maintaining fragile Apps Scripts, it is worth trying the automated approach.

Troubleshooting quick reference

Frequently asked questions

Can GA4 automatically export to Google Sheets? {#faq-1}

Not natively with true automation. GA4's built-in export creates a one-time static file. Google's official Google Analytics Add-on for Sheets can refresh data automatically, but only on a daily schedule, not hourly or in real time. For sub-daily automatic refreshes, you need either a custom Apps Script connected to the GA4 Data API or a third-party connector.

Why does my GA4 export to Sheets show different numbers than the GA4 interface? {#faq-2}

The discrepancy is almost always caused by reporting identity. GA4's interface uses Blended reporting by default (combining User-ID, Google signals, and device-based data), while API-based exports typically return device-based data only. The two methods count users differently, so the numbers diverge. You can change your property's reporting identity under GA4 Admin settings, or choose a connector that supports Blended reporting through the API.

What is the row limit for GA4 exports to Google Sheets? {#faq-3}

GA4's manual export from Explore caps at 100,000 rows. The Google Analytics Add-on for Sheets also typically returns up to 100,000 rows per report. The GA4 Data API has no hard row limit, but most properties and tools paginate requests and may have practical limits depending on their implementation. For very large datasets, a BigQuery export combined with Connected Sheets is the standard enterprise approach.

Is there a free way to get GA4 data into Google Sheets automatically? {#faq-4}

Yes. The Google Analytics Add-on for Sheets is free and supports daily scheduled refresh. For more frequent refresh without cost, you can use Google Apps Script with the GA4 Data API. This approach is also free, but requires writing and maintaining JavaScript code. Both options have limitations that paid tools address: the add-on only refreshes daily, and Apps Script requires ongoing maintenance.

Does GA4 have a real-time export to Google Sheets? {#faq-5}

No. GA4's real-time data (the Realtime reports in the GA4 interface) is not accessible through the standard GA4 Data API used by most connectors. Real-time data is typically available only through GA4's Realtime API, which returns data with a short delay of a few minutes. True real-time event-level streaming requires a GA4 BigQuery export with streaming inserts, which is a more complex and costly setup outside the scope of standard Sheets integrations.

Ready to connect your data to Google Sheets?

Brooked's free tier covers 100 imports per month with AI Analyst included, no credit card required.

Install Brooked free →

Also in Analytics & BI

More Analytics & BI guides

Analytics & BI

How to Connect GA4 to Google Sheets

The free official Google add-on (GA4 Reports Builder) with the scheduling step nobody documents, the native Connected Sheets GA4 connector, BigQuery export for unsampled event-level data, plus the sampling and '(other)' aggregation traps that make GA4 numbers in your sheet diverge from the UI.

JW
James Whitfield
Read
Analytics & BI

How to Connect Looker to Google Sheets

All 4 ways to get Looker data into Google Sheets: Connected Sheets, scheduled delivery, API, or a no-code add-on.

JW
James Whitfield
Read

Get your spreadsheet hours back

Brooked sets up in seconds. Your team is querying live data before lunch.

Get started free