Custom Dimensions in GA4: Setup & Common Mistakes
A custom dimension is only as useful as the event parameter behind it - and most "why is this (not set)" tickets trace back to registration timing, not a tracking bug.
In short
GA4 needs two things before a custom dimension reports correctly: a parameter actually being sent on the event, and the dimension registered under Admin > Custom definitions with the exact matching parameter name. Registration only applies going forward - it never backfills historical events - and a casing mismatch between what your tag sends and what you registered silently creates what looks like two different dimensions instead of one.
Event-Scoped vs User-Scoped
| Scope | Persists across | Good for |
|---|---|---|
| Event-scoped | Just the one event it was sent with | Values that change per action - a search term, a filter selection, a specific product ID |
| User-scoped | All future events for that user until overwritten | Values that describe the user persistently - subscription tier, account type, signup cohort |
Registering One
- Confirm the parameter is actually present on the event as sent (check DebugView or the browser's network payload) before registering anything.
- Admin > Custom definitions > Create custom dimension.
- Enter the dimension name (report label), scope (event/user), and the exact event parameter or user-property name - case and spelling must match what's actually sent.
- Save, then wait: registered dimensions can take up to a day before they start populating in standard reports, though DebugView and Realtime can confirm the parameter is arriving sooner.
GA4 caps the number of custom dimensions and metrics a property can register, with separate caps for event- and user-scoped definitions. Google has raised these limits before, so check the current cap under Admin > Custom definitions rather than assuming a specific number.
Why It Shows (not set)
- Registered after data collection started. No backfill exists - events sent before registration will always show (not set) for that dimension.
- Parameter not sent on every event. If only some triggers of an event include the parameter, the rest legitimately have no value to report.
- Casing or spelling mismatch. A parameter sent as
ProductTierbut registered asproduct_tierwill not match - GA4 dimension names are exact-string matches to the parameter key. - Reporting-only vs raw data. The parameter can be visible in BigQuery export or DebugView while still missing from a standard report if it was never registered as a dimension at all - registration is what makes it reportable in the UI.
Frequently Asked Questions
Why does my custom dimension show (not set) for older data?
Custom dimensions in GA4 do not backfill. Registering a dimension only starts collecting it for events sent from that point forward - any event data GA4 already ingested before you registered the dimension will show (not set), permanently, for that parameter.
What's the difference between event-scoped and user-scoped custom dimensions?
An event-scoped dimension is tied to the specific event it was sent with - a different value can appear on every event. A user-scoped dimension is attached to the user property and persists across events and sessions until it's explicitly overwritten, useful for things like a subscription tier that doesn't change every action.
Is there a limit to how many custom dimensions a GA4 property can register?
Yes - GA4 caps the number of custom dimensions and metrics per property, with separate caps for event-scoped and user-scoped definitions. The exact numbers have been raised by Google before, so confirm the current limit under Admin > Custom definitions for your property rather than relying on a remembered figure.
Dimensions Showing (not set) or Not Reporting at All?
We check the parameter, the registration, and the casing before you spend more time guessing.
Get GA4 Setup HelpGet GA4 Custom Dimension Help
Tell us the parameter name and what's showing (not set).