GA4 limits reference card
last verified · against GA4 as of 2026-07
Every enforced GA4 limit on one card: event and parameter caps, custom definition quotas, cardinality, BigQuery export ceilings, and API quotas, standard vs 360.
What this is
Every limit and quota Google Analytics 4 enforces that changes how you implement, register, or query data — collection caps, custom-definition quotas, cardinality, export ceilings, and API tokens — on one printable card. Values are for standard properties with 360 differences called out; each number was read from the official page listed under Sources on the date in the header.
Collection limits
Enforced at collection time, not by the interface. Over-limit names and values do not arrive intact.
| Limit | Standard | 360 difference | Notes |
|---|---|---|---|
| Event name length | 40 characters | — | Enforced at collection |
| Distinct event names | Web: no limit | — | App streams: 500 per app instance |
| Parameters per event | 25 | — | Per event |
| Parameter name length | 40 characters | — | |
| Parameter value length | 100 characters | 500 characters | Exceptions: page_title 300, page_referrer 420, page_location 1,000 |
| Items per event | 200 elements in items |
— | Ecommerce events |
| Item-level custom parameters | 27 per ecommerce event | — | Documented event-wide, in addition to prescribed item params |
| User properties | 25 per property | — | |
| User property name / value | 24 / 36 characters | — | |
| User-ID length | 256 characters | — |
Custom definitions and reporting quotas
| Quota | Standard | 360 |
|---|---|---|
| Event-scoped custom dimensions | 50 | 125 |
| Event-scoped custom metrics | 50 | 125 |
| User-scoped custom dimensions | 25 | 100 |
| Item-scoped custom dimensions | 10 | 25 |
| Calculated metrics | 5 | 50 |
| Key events | 30 | 50 |
| Audiences | 100 | 400 |
- Deleting (archiving) a custom definition at the quota does not free the slot immediately — allow about 48 hours before registering a replacement.
- Terminology: “conversions” were renamed key events; “conversions” now refers to Google Ads conversions.
Data retention
| Property type | Event-level options | User-level options |
|---|---|---|
| Standard | 2 or 14 months | 2 or 14 months |
| 360 | 2, 14, 26, 38, or 50 months | 2 or 14 months |
Retention governs event-level and user-level data — what explorations and funnel reports query. Standard aggregated reports are not affected. The retention page adds that “Large and XL properties are limited to 2 months”; how that classification applies to a given property is worth checking on the retention settings page itself.
Cardinality and the (other) row
- A high-cardinality dimension is one that exceeds 500 unique values in one day.
- GA4 applies a cardinality limit of 50,000 values, beyond which cardinality control kicks in and detail collapses into the (other) row.
- Exact per-report row limits are not published for standard properties — the docs give only one illustrative figure (100k rows for the table behind Pages and screens). Treat per-report limits as undocumented.
- 360 expanded data sets raise a report’s underlying table to up to 2 million rows: max 100 expanded data sets per property, about 48 hours to apply, and the report must have at most 6 dimensions and 12 metrics.
BigQuery export
| Export type | Standard | 360 |
|---|---|---|
| Daily | Up to 1 million events/day | “Billions of events” (the BigQuery Export page has cited 20 billion/day; wording varies between pages) |
| Streaming | No stated volume cap | No stated volume cap |
- Streaming export is best-effort: no completeness SLO, gaps possible, and it excludes some traffic-source data for new users and sessions — use the daily export for attribution-sensitive work.
- Streaming cost: about $0.05 per GB, roughly 600,000 events per GB.
- What happens when a standard property exceeds the 1M/day cap is not precisely documented; the docs point to filtering the export to stay under it.
Structure and API quotas
| Limit | Value |
|---|---|
| Properties per account | 2,000 |
| Data streams per property | 50 total, of which at most 30 app streams |
Data API v1 core-method tokens (Realtime quotas mirror these; daily quotas reset at midnight PST):
| Quota | Standard | 360 |
|---|---|---|
| Tokens per property per day | 200,000 | 2,000,000 |
| Tokens per property per hour | 40,000 | 400,000 |
| Tokens per project per property per hour | 14,000 | 140,000 |
| Concurrent requests per property | 10 | 50 |
| Server errors per project per property per hour | 10 | 50 |
Measurement Protocol limits
- 25 events per request; POST body under 130 kB.
- Per event: 25 parameters; event and parameter names at most 40 characters; values at most 100 characters (500 on 360).
- 25 user properties per request; names at most 24, values at most 36 characters.
timestamp_microsmay backdate events up to 72 hours.
Gotchas
- Long event names look wrong or collide. Cause: the 40-character cap is enforced at collection, so anything longer does not arrive as sent. Fix: keep names short and lint them in CI; in BigQuery,
LENGTH(event_name) = 40is a strong truncation signal. - A report dimension collapses into (other). Cause: the dimension went high-cardinality (over 500 unique values in a day) and the 50,000-value cardinality limit applied. Fix: move detail to BigQuery, stop registering high-cardinality parameters as custom dimensions, or use 360 expanded data sets.
- Deleted a custom dimension but cannot add its replacement. Cause: archived definitions free their quota slot only after about 48 hours. Fix: plan registrations ahead; audit the 50-slot budget before adding.
- Explorations show less history than standard reports. Cause: retention (default 2 months) applies to the event-level data explorations query, not to aggregated reports. Fix: set retention to 14 months (standard maximum) on day one.
- Streaming-export rows are missing traffic-source data. Cause: documented exclusion for new-user and new-session attribution fields in streaming export. Fix: run attribution queries on the daily export tables.
- Measurement Protocol batches silently underdeliver. Cause: more than 25 events per request, body over 130 kB, or timestamps older than 72 hours. Fix: chunk requests and validate against the limits above before sending.
Quick recipes
Find what is eating the 1M/day export cap:
SELECT event_name, COUNT(*) AS eventsFROM `project.analytics_123456.events_*`WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))GROUP BY event_nameORDER BY events DESC;Flag event names at the 40-character cap (likely truncated upstream):
SELECT DISTINCT event_name, LENGTH(event_name) AS lenFROM `project.analytics_123456.events_*`WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) AND LENGTH(event_name) >= 36ORDER BY len DESC;Guard parameter names and values client-side before they hit the caps:
const LIMITS = { name: 40, value: 100 }; // 360 properties: value 500function safeParams(params) { return Object.fromEntries( Object.entries(params).map(([k, v]) => [ k.slice(0, LIMITS.name), typeof v === 'string' ? v.slice(0, LIMITS.value) : v, ]) );}gtag('event', 'search', safeParams({ search_term: query }));Measurement Protocol batch skeleton (25 events max, body under 130 kB, backdating within 72 h):
curl -s "https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXX&api_secret=SECRET" \ -H "Content-Type: application/json" \ -d '{ "client_id": "123456.7654321", "events": [ { "name": "tutorial_begin", "params": { "source": "crm" } } ] }'Related
Sources
Official pages these values were read from (2026-07-19):
- Event collection limits
- Custom dimensions and metrics
- GA4 360 comparison
- Configuration limits
- Data retention
- High-cardinality dimensions
- BigQuery Export
- Account and property limits
- Data API v1 quotas
- Measurement Protocol reference
The January–June 2026 GA4 release notes contain no changes to the limits above. Items the docs leave unstated (per-report row limits, over-cap export behavior) are flagged inline rather than guessed.
Changelog
- — Initial version, verified against official Google documentation.