GA4 custom dimensions make an event parameter or user property visible in reports, explorations, audiences, and BigQuery. A parameter already exists in your collected data; registering it as a custom dimension is what exposes it for analysis. Without registration, raw parameters stay buried in the event payload and cannot be used for segmentation or comparison.

Key Takeaways

  • Custom dimensions and metrics turn raw event parameters and user properties into reportable fields; the data is collected whether or not you register it.
  • GA4 uses four scopes: event, user, item, and session, and each scope maps to a specific registration limit in a standard property.
  • A standard GA4 property allows 50 event-scoped dimensions, 25 user-scoped, 10 item-scoped, and 50 custom metrics; 360 properties have higher limits.
  • Dimensions populate only going forward, never with historical backfill, so plan and register before a campaign launches.
  • High-cardinality values and parameter name mismatches are the two most common causes of (not set) and (other) in reports.

What Are Custom Dimensions and Custom Metrics in GA4?

When you send an event to GA4, the event carries a set of parameters: built-in fields like page_title and page_location, plus any custom parameters you attach in your tracking code. The same applies to user properties, which describe the person rather than the action. Custom dimensions and custom metrics are the registration layer that makes those parameters usable in the analysis UI.

A custom dimension maps a parameter name to a reportable dimension. A custom metric maps a numeric parameter to a reportable metric you can sum, average, or count. The key mental model: the parameter is the plumbing, and the custom definition is the valve that lets analysts route it into reports. You can collect a parameter for months without registering it, and it will sit invisible in the raw event stream until you create the definition. That is why teams often discover useful data they "already had" only after registering a dimension.

This post is about registering and using those definitions, not about the underlying event model. For how events themselves are collected and how to mark conversions, see our GA4 events guide.

What Are the Four Scopes and When Do You Use Each?

Scope determines what a custom dimension describes and where it can be applied. Picking the wrong scope is the most common registration mistake, because you cannot change a dimension's scope after creation. You must delete and recreate it.

ScopeWhat it describesTypical exampleWhere it can be usedRegistration limit
Event-scopedA value attached to a single event instanceform_name on a generate_lead eventAny report or exploration filtered or broken down by that event50 per standard property
User-scopedA stable attribute of the user across sessionsplan_tier or logged_in stateUser reporting, audiences, lifetime value analysis25 per standard property
Item-scopedAn attribute of a product or item in an ecommerce eventitem_category or brand on a purchaseMonetization and ecommerce item reports10 per standard property
Session-scopedA value attached to the whole sessiontraffic_type or session_engaged flagSession-level reporting and session comparisonsCounts against event-scoped limit in standard properties

Event-scoped dimensions are the workhorse for marketers because most campaign and content signals are tied to a specific action. User-scoped dimensions are best reserved for attributes that are genuinely stable, like a subscription tier, because GA4 applies the most recently received value to the user. Item-scoped dimensions only make sense inside ecommerce events that carry an items array. Session-scoped dimensions let you label an entire visit, but they share the event registration pool in a standard property, so treat them as a limited resource.

How Many Custom Dimensions and Metrics Can a GA4 Property Have?

These are GA4 property limits, not suggestions, and they differ between standard and 360 properties. In a standard GA4 property you can register up to 50 event-scoped custom dimensions, 25 user-scoped custom dimensions, 10 item-scoped custom dimensions, and 50 custom metrics. A Google Analytics 360 property raises those ceilings substantially, which is one of the reasons high-volume enterprises adopt it.

When you hit a limit, you have two options. First, archive a dimension you no longer use; archiving frees the slot so you can register a replacement, though archived definitions keep their historical data read-only. Second, consolidate. Many teams register near-duplicate dimensions because nobody audited what already existed. A quarterly review of active definitions usually recovers several slots without forcing an architecture change.

Do not assume you can raise these numbers by any other means. The limits are enforced per property, and the UI will reject a new registration once the relevant scope is full. Plan your most valuable dimensions first, because the limit is a hard ceiling you will eventually meet.

How Do You Create a Custom Dimension in GA4 Step by Step?

The registration flow is the same for dimensions and metrics, and it must happen in the GA4 interface rather than in your tag code. Your code sends the parameter; the UI makes it reportable.

  1. Open Admin from the bottom-left gear icon of your GA4 property.
  2. In the Property column, navigate to Data display and select Custom definitions.
  3. Click Create custom dimension in the top-right corner of the panel.
  4. Give the dimension a clear name and, in the Scope field, choose event, user, item, or session based on what the parameter describes.
  5. In the Event parameter field, type the exact parameter name your tag sends, such as form_name; this must match the code exactly or the dimension stays (not set).
  6. Click Save, then wait. Data populates only for events collected after registration, typically within 24 to 48 hours, so do not expect immediate values.

After saving, validate by triggering the event yourself and checking the Realtime report or the DebugView. If the parameter appears in DebugView but the dimension shows (not set) in standard reports, it is almost always the 24 to 48 hour lag, not a configuration error.

Why Do Custom Dimensions Show (Not Set) or (Other)?

Four causes explain nearly every broken dimension, and knowing them saves hours of repeated re-registration, which only makes the problem worse.

First, there is no backfill. A dimension only reports values collected after you created the definition. Historical events that carried the parameter are not reprocessed, so the dimension looks empty for old date ranges by design. Second, the parameter name in your code does not match the spelling in the registration field. GA4 matches on exact case and string, so form_name and formName are different and will never connect.

Third, high-cardinality values get rolled into (other). If you send thousands of distinct values, such as raw timestamps or request IDs, GA4 caps the visible rows and pushes the long tail into (other). Fourth, there is a reporting lag of roughly 24 to 48 hours for standard processing. Checking immediately after registration is the single most common false alarm. Rule out lag and name mismatch before you delete and recreate anything.

How Should You Name Parameters and Avoid Cardinality Problems?

Naming discipline is what keeps a property usable at scale. Use snake_case consistently, because it reads cleanly in the GA4 UI and matches the convention most tag templates expect. Names like lead_source and content_group are self-documenting and survive handoffs between analysts.

The cardinality rule is stricter: never send unique identifiers, full timestamps, email addresses, or order IDs as dimension values. Those create millions of distinct rows, trigger (other) aggregation, and can degrade report performance. Instead, bucket values before they leave your tag. Send plan_tier as free, pro, or enterprise rather than a price or internal SKU. Send experiment_variant as control or treatment rather than a hashed session key.

Also avoid nested or concatenated values that pack multiple facts into one field. A single dimension should answer one question. If you need three attributes, register three dimensions; do not build a string like "pro_us_mobile" that forces every analyst to parse it downstream. Clean inputs at the tag layer are far cheaper than cleanup in every exploration.

Where Can You Actually Use Custom Dimensions Once Registered?

Registration unlocks the dimension across the GA4 ecosystem, not just one report. In standard reports you can add a custom dimension as a secondary dimension or as a comparison, which is the fastest way to slice an existing acquisition or engagement report by your own signals.

In Explorations the payoff is larger: free-form, funnel, path, and segment-overlap techniques all accept custom dimensions as rows, columns, and filters, letting you build the cross-tabs the standard reports do not offer. Audiences can target users or events by a custom dimension, so a plan_tier dimension becomes a remarketing segment with one configuration step.

Two export paths matter for operators. The BigQuery export includes your custom parameters in the raw event and user tables regardless of UI registration, but registering keeps naming consistent and documents intent. Looker Studio and other connectors read the registered fields, so a dimension that exists only in raw parameters still needs registration to appear cleanly in a marketing dashboard. Register once, use everywhere.

What Should You Register First for a Marketing Team?

If you are building a property from scratch, register the dimensions that answer the questions stakeholders actually ask before you run out of slots. A practical starter set covers both demand generation and product context.

Start with form_name on lead events so you can tell which worksheet or demo request drove a conversion. Add lead_source to capture the campaign or channel value at the event level, distinct from the session source GA4 already attributes. plan_tier as a user-scoped dimension lets every report separate free from paid usage. content_group on page views lets you report on sections rather than individual URLs, which is far more stable as your site changes.

Next, register logged_in state as a user-scoped dimension to split behavior by authentication, and experiment_variant as an event-scoped dimension on your experiment exposure events so you can measure treatment lift directly in Explorations. That six-dimension set answers most early marketing questions and leaves headroom in both the event and user pools for the edges you discover later.

Frequently Asked Questions

What Is the Difference Between Event-Scoped and User-Scoped Custom Dimensions?

Event-scoped dimensions describe a single event, such as which form was submitted, and change with every action a user takes. User-scoped dimensions describe a stable attribute of the person, such as subscription tier, and apply across all their sessions. GA4 keeps the most recent user-scoped value, so only use that scope for attributes that are genuinely constant. Picking the wrong scope cannot be fixed in place; you must delete and recreate the dimension with the correct scope.

How Many Custom Dimensions Can I Register in a Standard GA4 Property?

A standard GA4 property allows 50 event-scoped custom dimensions, 25 user-scoped, and 10 item-scoped, plus 50 custom metrics. Session-scoped dimensions draw from the event-scoped pool in standard properties. A 360 property has higher limits. These are hard per-property ceilings enforced in the UI, so archive unused definitions to free slots rather than expecting the limit to bend.

Why Does My New Custom Dimension Show (Not Set) in Reports?

The most common reasons are reporting lag of 24 to 48 hours, a parameter name that does not exactly match your tag, or data collected before registration, which is never backfilled. Check DebugView to confirm the parameter is being sent, verify the spelling and case in Custom definitions, then wait a full processing cycle before recreating anything. High-cardinality values can also roll into (other) rather than appearing individually.

Can I Change the Scope of a Custom Dimension After Creating It?

No. Scope is fixed at creation and cannot be edited. If you register a dimension with the wrong scope, you must delete it and create a new definition with the correct scope, which also means any reports or audiences referencing the old one need to be updated. This is why deciding event versus user versus item scope before you click save is the most important step in the registration flow.