Blog · Troubleshooting

GA4 quota exceeded in Looker Studio (and Power BI): why it happens and four fixes

Published · 13 min read

A "quota exceeded" error on a GA4 chart in Looker Studio means the Google Analytics Data API turned the chart's request away because one of the property's quota buckets is empty. A standard GA4 property gets 200,000 core tokens a day, 40,000 an hour, 14,000 an hour from any one Google Cloud project and 10 concurrent requests, according to Google's quota table. Looker Studio, which Google renamed Data Studio in April 2026, spends tokens on every chart query it can't serve from its cache, and every other tool reading the same property draws on the same daily and hourly buckets. Hourly quotas refill within an hour and daily quotas at midnight Pacific time, so the error clears on its own and comes back on the next busy day unless the report asks GA4 for less. Four fixes work: make the report lighter, move its charts onto an Extract Data snapshot, report from the GA4 BigQuery export, or report from a synced copy that reads GA4 on a schedule instead of on every view, which is how TableBI works. Power BI hits the same limit differently: a refresh fails when a bucket is empty, and four consecutive failures switch the refresh schedule off.

What each quota error means

Looker Studio shows one of seven messages when a GA4 quota runs out, according to Google's Data Studio troubleshooting guide. Five of them match, by their wording, a row in Google's Data API quota table, and a sixth matches the note beneath it on potentially thresholded requests. The limits below are the Core ones, which apply to standard reporting requests such as runReport.

Error messageQuota it matchesStandard propertyAnalytics 360Refills
This property has issued too many requests in the last day.Core tokens per property per day200,0002,000,000Midnight Pacific Standard Time
This property has issued too many requests in the last hour.Core tokens per property per hour40,000400,000Within an hour
This project/property has issued too many requests in the last hour.Core tokens per project per property per hour14,000140,000Within an hour
Exhausted concurrent requests quota. Please send fewer requests concurrently.Core concurrent requests per property1050As running requests finish
Too many requests using this Google Analytics property have encountered errors in the last hour.Core server errors per project per property per hour1050Within an hour
This property has issued too many potentially thresholded requests in the last hour.Potentially thresholded requests per property per hour120120Within an hour

The seventh message, "This property is denied access to Google Analytics.", is on the same list in Google's guide but matches no row in the quota table. Three details from Google's pages change how the table reads. Every request is charged against the property's hourly bucket and the calling project's per-property bucket at the same time. Server errors are 500 and 503 responses, and once that bucket is empty, all requests from the project to the property are blocked. The thresholded-requests limit applies to requests that include age, gender, interests or audience dimensions. The figures above are from Google's quota page as last updated on September 24, 2026; articles written in 2023 quote much lower limits.

Why Looker Studio runs out

Tokens are charged per request, and a Looker Studio report sends a lot of requests. Google says most Data API requests cost 10 tokens or fewer, and that the cost rises with the number of rows, dimensions and metrics, filter complexity, date-range length, high-cardinality dimensions such as page path, and the property's event volume. Each chart in a report runs its own query, so charts, filter changes, date-range changes and page views all spend tokens whenever the answer isn't already cached. Google's quota-management guide gives one example: stretching a request from 28 days to 365 days can cost three times the tokens.

Three report settings multiply that spend:

  • Viewer's credentials. With Viewer's credentials every viewer gets their own data freshness, so one viewer's cached results serve nobody else; with Owner's credentials all viewers share one cache, according to Google's page on data freshness.
  • Duplicate data sources. Google's guide recommends consolidating duplicate GA4 data sources into one reusable data source, because sharing one data source increases caching across charts.
  • Manual refreshes. Refresh data resets the cache for the report's data sources, and since June 2026 editors can let viewers refresh too, through the report's Viewer data refresh option (Data Studio release notes).

The quota also belongs to the property, not to the report. Every tool that reads a property through the Data API draws on the same daily and hourly property buckets, so a heavy dashboard, a Power BI refresh and a script can starve each other on the same day, and a report can fail at a quiet moment because something else spent the quota earlier.

Find the expensive charts before changing anything. In edit mode, right-click the report canvas and choose Google Analytics token usage: the dialog lists the tokens each chart consumed, highest first, and the tokens left before the limit. Right-click a single chart for the cost of each of its queries. A green checkmark means the chart loaded from cache without spending tokens; a red X means it queried GA4 (Data Studio troubleshooting guide).

Fix 1: make the report ask GA4 for less

These steps come from Google's troubleshooting guide and its quota-management advice, and they cost nothing:

  1. Switch the GA4 data source to Owner's credentials, so viewers share cached results instead of each spending new tokens.
  2. Consolidate duplicate GA4 data sources into a single reusable data source, so charts share one cache.
  3. Cut the number of charts on each page. Fewer charts also means fewer requests competing for the 10 concurrent requests a standard property allows.
  4. Shorten default date ranges and drop high-cardinality dimensions such as page path from overview charts; both raise the token cost of every query.
  5. Share the report with fewer people, and take it out of embeds on high-traffic web pages.
  6. Don't shorten data freshness. Looker Studio's default for Google Analytics is 12 hours, and a shorter setting, where one is offered, means more queries.

What it doesn't fix: the report still queries GA4 live. A busy day, a new viewer group or a heavier tool on the same property can still empty a bucket.

Fix 2: move the charts onto an Extract Data snapshot

Looker Studio's Extract Data connector copies selected fields from an existing data source into a stored snapshot, and charts built on the extract read the snapshot instead of GA4. To set it up, create a data source with the Extract Data connector, pick the GA4 data source, choose the dimensions and metrics the report needs, set a date range (required for Analytics), turn on Auto update with a schedule, and click Save and Extract. Then switch the report's charts to the extracted data source.

  • Limits: an extract holds up to 100 MB of data and up to 750,000 rows; above 750,000 rows Looker Studio truncates it.
  • Timing: if the quota is already exhausted, Google's troubleshooting guide says to wait up to 24 hours for it to reset before running the extraction.
  • Freshness: the data changes only when the extract updates, on its Auto update schedule.
  • Unique counts: an extract of Analytics data is disaggregated, so Looker Studio lets any aggregation be applied to it. A sum of daily Users over a month counts a returning visitor once for every day they came back, so extract at the grain the report shows.

Best for: dashboards that many people open and that can live with data as fresh as the last update.

Fix 3: report from the GA4 BigQuery export

GA4 can export raw events to BigQuery, and Looker Studio reads BigQuery through its own BigQuery connector, so the report stops calling the GA4 Data API at all. Google's troubleshooting guide lists this as a fix for quota errors. The facts to plan around come from Google's BigQuery Export and export setup pages:

  • Billing: BigQuery charges for storage and query processing, and the export needs a Cloud project with a valid payment method, or it can go to the free BigQuery sandbox, which allows 1 TiB of query processing a month but only 10 GiB of storage for the life of the project (deleting data does not give it back), and deletes tables after 60 days.
  • Standard properties have a daily export limit of 1 million events. The streaming export has no volume limit and costs $0.05 per gigabyte, which Google puts at roughly 600,000 events.
  • History starts at the link. Data should start flowing within 24 hours of linking, and Google describes no export of the days before it.
  • BigQuery's usual query costs apply to every query that misses the cache, including manual and automatic refreshes, as Google's data freshness page warns.
  • The numbers won't match the GA4 interface exactly. The export holds events, sessions have to be counted in SQL, and Google's guide to export-versus-interface differences calls discrepancies expected because modeling, Google signals and attribution are not fully present in the export.

Best for: teams that need event-level detail or long history and have someone to own a Cloud project, SQL and a billing alert.

Fix 4: report from a synced copy

Fixes 2 and 3 already take the charts off live GA4 queries, onto a Looker Studio snapshot or a BigQuery table. A synced copy does the same with a small, report-ready table: one scheduled job reads the Data API and stores the rows, and every chart and viewer reads the stored rows, so the number of charts and viewers stops mattering to the quota. A partner connector can work either way, and Google's guide lists partner connectors among its fixes, but one that passes each chart's query through to GA4 spends the same property quota, so ask the vendor which kind it is.

TableBI is built this way, with one difference: it replaces the Looker Studio report rather than feeding it, and it is not a Looker Studio or Power BI connector. TableBI syncs GA4 through the Data API into its own store, an AI agent such as Claude Code queries that copy in read-only SQL, and any answer can be pinned to a live dashboard URL. Nothing is installed on your website.

terminal
# install the CLI, then plant the skill your agent reads
npm i -g @tablebi/cli
tablebi login
tablebi install

# a browser opens for Google sign-in; pick the GA4 property
tablebi connect ga4

# which sources are connected, and the date each one runs through
tablebi sources

How the sync treats the quota:

  • Reading never calls GA4. Dashboards and tablebi ask queries read the stored copy in ga4_raw, not the Data API.
  • Refreshes are capped per property, not per view. An automatic refresh runs at most about once every six hours for each connected property, however many people open the dashboard.
  • Each refresh is small. The first sync pulls the last 90 days. After that, a refresh asks only for the days after the newest synced day plus a three-day overlap, because GA4 can take 24 to 48 hours to finish processing a day (Google Analytics data freshness). It asks for three dimensions (date, default channel group and country) and five metrics, and a window of a few days comes back in a single request.
  • It still spends tokens. The sync reads the same Data API and the same property buckets as Looker Studio, just on a schedule instead of on every view.
claude code → tablebi
# sessions by channel: last 28 days of data vs the 28 days before
tablebi ask "SELECT channel,
             SUM(sessions) FILTER (WHERE date > (SELECT MAX(date) FROM ga4_raw) - 28) AS sessions_28d,
             SUM(sessions) FILTER (WHERE date <= (SELECT MAX(date) FROM ga4_raw) - 28
                                     AND date > (SELECT MAX(date) FROM ga4_raw) - 56) AS sessions_prev_28d
             FROM ga4_raw
             GROUP BY channel ORDER BY sessions_28d DESC"

The window anchors on MAX(date), the newest day actually synced, rather than on today's date, and every answer arrives with a trust block that says how fresh each source is. To keep a view, tablebi pin stores the query and publishes a read-only URL that refreshes as GA4 syncs:

claude code → tablebi
tablebi pin --title "GA4 channels, 28 days" \
  --widget "Daily sessions::line=SELECT date, SUM(sessions) AS sessions FROM ga4_raw WHERE date > (SELECT MAX(date) FROM ga4_raw) - 28 GROUP BY date ORDER BY date" \
  --widget "Sessions by channel::hbar=SELECT channel, SUM(sessions) AS sessions FROM ga4_raw WHERE date > (SELECT MAX(date) FROM ga4_raw) - 28 GROUP BY channel ORDER BY sessions DESC"
# prints the dashboard's public URL, e.g. https://acme.tablebi.com/d/dsh_…

The limits: ga4_raw holds date, property, channel, country, page views, sessions, users, conversions and revenue. Device, landing page and page path are not synced, so page-level GA4 reporting belongs in fix 2 or fix 3. Besides GA4, TableBI connects Google Search Console and Google Ads (live), Meta Ads (beta: only people added to our Meta app as test users can authorize) and CSV upload, and nothing else. Access is read-only, and there are no white-label reports, no scheduled PDF or email delivery and no alerts.

Power BI: the same quota, a different failure

Power BI's built-in Google Analytics connector reads GA4 through the Google Analytics Data API when the now-default Implementation 2.0 setting is used, and it supports Import only, so each scheduled refresh runs its GA4 queries again (Microsoft's connector documentation). When a refresh meets an empty bucket, the Data API rejects the request with a 429 error, per Google's quota-management guide, and the refresh fails with it.

Power BI deactivates a refresh schedule after four consecutive failures, and the threshold can't be changed, according to Microsoft's scheduled refresh documentation. To turn it back on, fix the cause, open the semantic model settings, go to Refresh and then Schedule refresh, set Configure a refresh schedule back to On and select Apply; Refresh history shows the error for each attempt. Microsoft's connector page also quotes an enhanced allowance of 1,500,000 queries a day, but it measures that against Google's Admin API quota page; the Data API has its own token quotas, and Google's general API limits page excludes Data API calls. GA4 refreshes are metered in property tokens, like every row in the table above.

Three of the four fixes carry over: import only the columns and date range the model needs and refresh less often (shared capacity allows eight scheduled refreshes a day anyway), move the model onto Power BI's BigQuery connector, or answer the recurring questions from a synced copy. Every route and what it costs is in GA4 to Power BI.

Which fix to pick

  • Fix 1, a lighter report, comes first in every case: it's free, it's Google's own first advice, and the token usage dialog shows where to start.
  • Fix 2, Extract Data, when a report is opened by many people and data as fresh as the last update is good enough.
  • Fix 3, the BigQuery export, when you need event-level detail, more rows than an extract holds, or history on your own terms, and someone can own SQL and billing.
  • Fix 4, a synced copy, when the recurring question is how the channels did, and a store that's queried on a schedule beats a report that's queried on every view. TableBI covers GA4 at channel and country level, not page level.
  • Analytics 360 raises the Core token limits tenfold, to 2,000,000 tokens a day. Google says quota increases above the default limits aren't available otherwise, so 360 is the route to higher limits.

If quota errors are one of several reasons you're rethinking Looker Studio, the wider comparison is in Looker Studio alternatives. Search Console data in Looker Studio has its own set of problems, mostly missing days and totals that don't match; that checklist is in Connect Google Search Console to Looker Studio.

FAQ

What does "quota exceeded" mean for GA4 in Looker Studio?

It means the Google Analytics Data API refused a chart's request because one of the GA4 property's quota buckets was empty: tokens per day, tokens per hour, tokens per project per hour, concurrent requests, server errors or potentially thresholded requests. The error text tells you which one, for example "This property has issued too many requests in the last hour."

How long does it take for the GA4 API quota to reset?

Hourly quotas refill within an hour, though not necessarily on the hour, and daily quotas reset at midnight Pacific Standard Time. Concurrent-request slots free up as running requests finish. Google's Data Studio guide says to wait up to 24 hours for an exceeded quota to reset before running a data extraction.

Can I increase the GA4 Data API quota?

Not on a standard property. Google says quota increases above the default limits are not available for the GA4 Data API, and that Analytics 360 is the way to higher limits: 2,000,000 core tokens a day and 400,000 an hour, instead of 200,000 and 40,000.

How do I see which Looker Studio chart uses the most GA4 tokens?

Edit the report, right-click the canvas and choose Google Analytics token usage. The dialog lists the tokens each chart consumed, highest first, and the tokens remaining. Right-clicking a single chart shows the cost of each query and whether it came from cache.

Does the Extract Data connector avoid GA4 quota limits?

Mostly. Charts built on an extracted data source read the stored snapshot, so only the extraction and each scheduled update query GA4. An extract holds up to 100 MB and 750,000 rows, and its data is only as fresh as the last update.

Does TableBI use GA4 API quota?

Yes, when it syncs, and only then. TableBI reads GA4 through the same Data API as Looker Studio, but dashboards and questions read its stored copy. Automatic refreshes run at most about once every six hours per property and ask only for the days after the newest synced day, plus a three-day overlap.

Try it

GA4 in your agent, read from a synced copy: one Google sign-in, no BigQuery project.

terminal
npm i -g @tablebi/cli && tablebi install