How to Fix (not set) in GA4: 5 Causes & Solutions
Why GA4 shows (not set) values: unregistered dimensions, high cardinality, scope mismatch, server-side gaps. Step-by-step fixes.
Why (not set) Appears in Your GA4 Reports
The (not set) label in Google Analytics 4 means that GA4 did not receive a value for the requested dimension in the context of the report. It is not a bug: it is a symptom. The problem is that the causes are multiple and often subtle.
Contrary to what many believe, (not set) does not always mean tracking is broken. Sometimes it is a custom dimension configuration issue. Sometimes it is a scope misalignment. And sometimes Google aggregates your values into a generic bucket because you have too many distinct variations.
Understanding the precise cause is essential to applying the right fix. Here are the five most common situations and their solutions.
Cause 1: Custom Parameters Not Registered
This is the most common and simplest cause to fix. You are sending a custom parameter via GTM or gtag.js, but you have not registered the corresponding dimension in Admin, then Custom Definitions. GA4 does receive the data (visible in DebugView), but it does not appear in standard reports.
The fix: go to Administration, then Custom Definitions, and register every parameter you want to use in your reports. Note that GA4 imposes a limit of 50 event-scoped dimensions and 25 user-scoped dimensions. Plan your measurement plan accordingly.
Cause 2: High Cardinality and the (other) Bucket
When a dimension exceeds approximately 500 distinct values in a report, GA4 groups the least frequent values under the (other) label. This is not exactly (not set), but the effect on your analyses is similar: you lose granularity.
The solution is to reduce cardinality. Group similar values before sending (for example, normalize URLs by stripping query strings), or use BigQuery to access raw data without this limitation.
Cause 3: Scope Misalignment
This is the most technical trap. GA4 operates with four scope levels: user, session, event, and item. If you cross an event-scoped dimension with a session-scoped metric, GA4 cannot always establish the correspondence and displays (not set).
Concrete example: you cross a custom event name (event scope) with session count (session scope). Sessions that do not contain that event will show (not set). The solution is to systematically verify that your dimension scope matches your metric scope in each report.
Cause 4: Parallel Attribution for Server-Side
When you use the Measurement Protocol or server-side tracking, hits arrive without the usual browser context. No UTM, no referrer, no native client_id. Result: the entire attribution portion falls to (not set).
The recommended technique from server-side experts is to implement a parallel attribution layer. Specifically, you store UTM parameters in client-side first-party cookies, then send them back via event-scoped dimensions with each server-side hit. This allows you to reconstruct attribution even when the hit does not go through the browser. This is exactly the type of configuration I set up during a tracking audit.
Cause 5: Misconfigured Enhanced Measurement and Debugging
GA4’s Enhanced Measurement automatically generates events like scroll, file_download, or outbound_click. But if you also have custom events with the same names but different parameters, you create conflicts that produce (not set) on certain dimensions.
The first diagnostic step is always DebugView. Activate debug mode via the Chrome GA Debugger extension or via the debug_mode parameter in your GTM configuration. Verify that each event sends all expected parameters with the correct values.
If you see persistent (not set) despite these checks, the cause is likely in the initial configuration of your GA4 and GTM setup. A well-structured measurement plan, with strict naming conventions and scope-by-scope mapping, eliminates the vast majority of (not set) cases. Also check our GA4 configuration guide for the fundamentals.