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_micros may backdate events up to 72 hours.

Gotchas

  1. 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) = 40 is a strong truncation signal.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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:

daily-export-volume.sql
SELECT event_name, COUNT(*) AS events
FROM `project.analytics_123456.events_*`
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
GROUP BY event_name
ORDER BY events DESC;

Flag event names at the 40-character cap (likely truncated upstream):

event-name-cap.sql
SELECT DISTINCT event_name, LENGTH(event_name) AS len
FROM `project.analytics_123456.events_*`
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND LENGTH(event_name) >= 36
ORDER BY len DESC;

Guard parameter names and values client-side before they hit the caps:

param-guardrails.js
const LIMITS = { name: 40, value: 100 }; // 360 properties: value 500
function 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):

mp-batch.sh
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" } }
]
}'

Sources

Official pages these values were read from (2026-07-19):

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.

dataLayer

0 events · 0 sent

    • home /
      writing /writing
      guides /guides
      work /#work
      about /about
      colophon /colophon
      toggle analyst mode ctrl+.
      print session receipt /#receipt