When you send a custom parameter with a GA4 event — say, article_author or user_plan_type — GA4 stores the raw value in the event data. But the parameter won't appear as a dimension you can use in reports or Explore until you register it as a custom dimension in GA4 Admin. This two-step requirement is the most common source of "why can't I see this data?" questions.
Event-Scoped vs User-Scoped Dimensions
Every custom dimension has a scope — either event or user — and the choice has significant consequences for how the data appears in reports.
| Scope | What it represents | When to use | Example |
|---|---|---|---|
| Event-scoped | A property of a specific event occurrence | When the value varies per event — page category, product name, form type, search term | article_category sent with each page_view event |
| User-scoped | A property of the user that persists across sessions | When the value describes the user and doesn't change per event — plan type, customer tier, logged-in status | user_plan_type set once when the user logs in |
The error most implementations make: registering a user property as an event-scoped dimension, or registering an event parameter as user-scoped. The data arrives in GA4 but appears blank or inconsistent in reports because the scope doesn't match how the parameter was sent.
The Limits You Need to Know
GA4 enforces hard limits on custom dimensions and metrics per property:
- 50 event-scoped custom dimensions
- 25 user-scoped custom dimensions
- 50 custom metrics
These limits sound generous until you inherit a property from a previous team who registered dimensions for every parameter they ever sent — including test parameters, temporary campaign flags, and parameters that were renamed three times and registered each time. Properties that are 2–3 years old often have 30–40 of their 50 event-scoped slots consumed by dimensions nobody actively uses.
GA4 360 (the paid version) has higher limits, but for most organisations on the free tier, slot conservation matters. Before registering a new custom dimension, audit what's already registered and archive anything unused.
What's Worth Registering
Not every event parameter needs to be a custom dimension. Parameters used only for deduplication (like transaction_id), debugging (debug_mode), or internal routing don't need to be reportable. Register custom dimensions for parameters you'll actually use as report dimensions or Explore breakdowns.
High-value event-scoped dimensions to consider
content_categoryorpage_type— segment traffic and engagement by section of your siteproduct_brand/product_category— beyond GA4's standard ecommerce item fieldsform_typeorform_name— distinguish which form fired a form_submit eventtest_variant— track A/B test exposure and correlate with conversionssearch_query_type— distinguish internal site search from navigation intentvideo_title— when tracking non-YouTube video beyond enhanced measurement
High-value user-scoped dimensions to consider
user_plan_type— free, trial, paid, enterpriseuser_login_status— authenticated vs anonymous sessionsuser_industryoruser_segment— from CRM or signup formuser_account_age— new, established, long-term
Custom metrics worth registering
- Reading time (sent as a numeric value at article exit)
- Scroll depth percentage (if tracking custom milestones beyond enhanced measurement's 90%)
- Cart abandonment value (cart value at the point of session exit)
- Lead score (if your CRM scores can be passed at conversion time)
How to Audit Your Custom Dimensions
Go to Admin → Custom Definitions. You'll see all registered custom dimensions and metrics. For each one, work through these questions:
- Is the corresponding parameter still being sent in events? Check the Events report and look for the parameter name in recent event data. If it's not appearing in recent events, the dimension may be tracking a parameter from an implementation that was changed or removed.
- Does the scope match how the parameter is sent? If it's event-scoped but is being sent as a user property (via
gtag('set', 'user_properties', {...})), the values will be blank in reports. - Is it being used in any active reports, Explore explorations, or audience definitions? If nobody is querying a dimension, it's occupying a slot for no purpose.
- Is the name still accurate? Dimensions often outlive the naming convention of the team that created them. A dimension called
cd1orcustom_dim_test_aug2024is occupying a slot with no clear ownership.
Archive dimensions that fail any of these checks. You won't recover the slot immediately, but you'll stop the slot from being a permanent fixture and can free up capacity over time.
article_author today, you can report on it going forward — but last year's articles won't have author data in GA4 even if the parameter was being sent. Plan registrations before you need the historical data, not after.GA4 Health Check checks your custom dimension registration against event parameter data to flag dimensions that are registered but not receiving values, and parameters being sent but not registered. Run a 60-second audit to see your custom definition status.
