You build a complex GA4 Exploration report that works perfectly. Then a week later, it starts returning errors: “Quota exceeded” or “Your exploration has reached the maximum number of segments.” Or your report times out. GA4 Explorations have hard limits on complexity, volume, and concurrency — and most analysts hit them without understanding why. This guide explains the specific limits, what triggers them, and how to restructure reports to stay within them.
GA4 Exploration Quota Categories
Complexity Limits Per Report
- Maximum segments: 10 per report
- Maximum dimensions: 20 per report
- Maximum metrics: 20 per report
- Maximum cells: 100,000 per report (rows × columns)
- Maximum date range: 2 years
Sampling Thresholds
- Standard properties: Sampling may apply at high data volumes (yellow shield icon)
- GA4 360 (paid): Higher thresholds + unsampled reports
- High-traffic sites should use BigQuery for unsampled analysis
Why Reports Stop Working Over Time
- Data volume grew: report that ran on 3 months fails on 12 months
- You added more segments: each segment multiplies query complexity
- Stale report cache expired: after 72 hours, GA4 must recompute — and your site may have grown beyond the limit
Strategies to Stay Within Limits
- Reduce date range: Use rolling 30-day instead of 12-month. Use BigQuery for historical analysis.
- Simplify segments: Combine multiple conditions into one complex segment instead of multiple simple segments.
- Use filters instead of segments: If you always want mobile-only data, use a filter — it’s less expensive than a segment.
Moving Heavy Analysis to BigQuery

-- BigQuery equivalent for complex analysis
-- User session analysis for 90 days (too heavy for GA4 Explore)
SELECT
device.category as device,
geo.country as country,
CONCAT(traffic_source.source, ' / ', traffic_source.medium) as channel,
COUNT(DISTINCT user_pseudo_id) as users,
COUNT(DISTINCT CONCAT(user_pseudo_id, '_', CAST(
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING
))) as sessions,
COUNTIF(event_name = 'purchase') as conversions,
SUM(CASE WHEN event_name = 'purchase'
THEN (SELECT value.float_value FROM UNNEST(event_params) WHERE key = 'value')
ELSE 0 END) as revenue
FROM `project.dataset.events_*`
WHERE _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAYS))
GROUP BY device, country, channel
HAVING users > 10
ORDER BY revenue DESC;
Best Practices Checklist
- ☐ Audit saved Explorations monthly — delete unused ones to free up property quota
- ☐ Default to 90-day date ranges; extend to 12 months only when needed
- ☐ Limit segments to 4-5 per report for reliable performance
- ☐ For unsampled high-volume analysis: use BigQuery export
- ☐ Schedule heavy reports to run overnight when property usage is low
- ☐ Share saved Exploration links with team instead of everyone rebuilding the same report
Know when to stay in the GA4 UI and when to move to BigQuery — the transition point is roughly when your analysis needs more than 90 days, more than 5 segments, or unsampled data.
Related guides: GA4 Segments vs Filters, BigQuery Funnel Analysis, Looker Studio Data Freshness.
