GA4 collects a lot of data automatically — but the things that make your business unique usually aren’t in there by default. Membership tier, content category, logged-in status, blog author, plan type: GA4 has no idea these exist until you tell it. That’s what custom dimensions are for. This guide explains what they are, how event-scoped and user-scoped dimensions differ, how to register them correctly, and the limits you need to plan around before you start.

I’ve registered custom dimensions on more than 150 GA4 properties, and the same mistakes come up again and again — people send a parameter but never register it, blow through the dimension cap, or pick the wrong scope and break their reports. Get the fundamentals right once and you’ll never have to untangle them later.

What Is a Custom Dimension in GA4?

A custom dimension is a way to report on data that GA4 doesn’t collect out of the box. Technically, it takes a parameter you send with your events (or a user property you set) and makes it available as a dimension in reports and explorations.

The distinction that trips people up: sending a parameter and registering a custom dimension are two separate steps. You can fire an event with a content_category parameter all day long, but until you register that parameter as a custom dimension in the GA4 admin, it won’t appear in any standard report. The data is being collected — it’s just not queryable in the interface.

If you’re still setting up the events that feed these parameters, start with our guide on setting up event tracking in GA4 first, then come back here to expose the data in reports.

Dimensions vs Metrics — A Quick Refresher

Before scopes, make sure you’re clear on the difference between a dimension and a metric, because GA4 lets you create custom versions of both.

TypeWhat It DescribesExamplesData Form
DimensionAn attribute — the “what” or “who”Country, page path, membership tier, content categoryText / categorical
MetricA measurement — the “how much”Sessions, revenue, video seconds watched, points earnedNumber

A simple test: if you’d want to group or filter by it, it’s a dimension. If you’d want to sum or average it, it’s a metric. “Plan type” is a dimension. “Lifetime points balance” is a metric.

The Three Scopes — Event, User, and Item

Scope is the single most important decision when creating a custom dimension. It determines what the value attaches to and how GA4 reports on it. Pick the wrong scope and your numbers will look strange in ways that are hard to debug.

ScopeAttaches ToUse It ForSource
EventA single eventValues that change per interaction: content category, button label, search term, error typeEvent parameter
UserA user, persisting across sessionsValues that describe the person: membership tier, plan, account age band, logged-in statusUser property
ItemA product in an e-commerce eventProduct-level attributes: brand line, supplier, custom item colorItem parameter

Event-Scoped Dimensions

An event-scoped dimension records the value as it was at the moment a specific event fired. If a user reads three articles in different categories, each page_view event carries its own content_category value. This is the right choice for anything that legitimately varies from one interaction to the next.

User-Scoped Dimensions

A user-scoped dimension records the most recent value set for a user and applies it across their activity. Set membership_tier to “gold” as a user property, and all of that user’s sessions get attributed to “gold” — until you set a new value. This is what you want for stable attributes that describe the person rather than the moment.

One consequence to understand: because GA4 keeps the latest value, user-scoped dimensions don’t preserve history. If a user upgrades from “free” to “paid,” their past sessions retroactively show “paid.” If you need to know what tier they were at the time of an event, use an event-scoped parameter instead.

Item-Scoped Dimensions

An item-scoped dimension applies only to products inside e-commerce events like view_item, add_to_cart, and purchase. The value lives on the item within the items array, not on the event as a whole — so you can report revenue by supplier or by a custom product attribute that doesn’t fit the standard fields.

How to Register a Custom Dimension — Step by Step

  1. Send the parameter first. Make sure your event already includes the parameter (e.g. content_category) or that you’re setting a user property. GA4 can only register dimensions for data it’s receiving. Verify it in DebugView before going further.
  2. Open Admin → Custom definitions. Under the property column, go to Data display → Custom definitions.
  3. Click “Create custom dimension.” Give it a clear display name — this is the label that appears in reports.
  4. Choose the scope. Event, User, or Item. This cannot be changed later, so decide carefully.
  5. Map the parameter. Select the event parameter or user property name exactly as it’s sent. Names are case-sensitive.
  6. Save and wait. Data starts populating going forward — usually within 24–48 hours. Custom dimensions are not retroactive; they only capture data collected after registration.

That last point is worth repeating because it surprises people constantly. Register a dimension today, and you’ll see data from today onward — never from before. If a parameter matters, register the dimension before you need the reports, not after.

The Limits You Have to Plan Around

Standard GA4 properties have hard caps on how many custom dimensions you can register. These are real constraints, not soft suggestions, and you hit them faster than you’d expect on a busy property.

Definition TypeStandard Property Limit
Event-scoped custom dimensions50
User-scoped custom dimensions25
Item-scoped custom dimensions10
Custom metrics50

The exact figures are maintained in Google’s own documentation and can change, so confirm the current caps before you architect anything that depends on them. The practical takeaway holds regardless: custom dimensions are a finite resource — spend them deliberately.

A few habits that keep you under the cap:

  • Don’t register what you can already report on. Page path, source/medium, device — these are built in. Registering duplicates wastes slots.
  • Archive dimensions you no longer use. Archiving frees the slot for a new one (though the old data becomes unqueryable).
  • Reuse generic parameters. One content_category dimension can serve articles, videos, and product pages — you don’t need a separate dimension per content type.
  • Consider BigQuery for high-cardinality data. If you need every value of something with thousands of distinct entries, the raw export is a better home than a custom dimension.

A Word on Cardinality

Cardinality is the number of unique values a dimension has. High-cardinality dimensions — think a unique transaction ID or a full URL with query strings — cause GA4 to group rarely-seen values into an (other) bucket once your report exceeds its row limit. The result is a report where a chunk of your data is collapsed into one uninformative line.

To avoid the (other) row swallowing your insights:

  • Keep custom dimensions categorical where possible (a dozen content categories, not ten thousand article IDs).
  • Strip volatile pieces — session IDs, timestamps, query parameters — before sending values.
  • For genuinely high-cardinality needs, query the BigQuery export instead, where no cardinality limit applies.

Where to Use Custom Dimensions in Reports

Once registered and populated, a custom dimension behaves like any built-in dimension. You can:

  • Add it as a secondary dimension in standard reports to break a metric down by your custom attribute.
  • Use it in Explorations as a row, column, or segment — this is where custom dimensions earn their keep.
  • Build comparisons to put two segments (say, “free” vs “paid” users) side by side.
  • Filter audiences by the dimension to build targeted groups for analysis or remarketing.

If your end goal is a clean, decision-ready view of this data, pair custom dimensions with a deliberate reporting structure — our guide on turning analytics data into decisions covers how to present these breakdowns so stakeholders actually act on them.

Common Mistakes to Avoid

MistakeWhat HappensFix
Registering before the parameter is sentDimension stays emptyConfirm the value in DebugView first
Choosing the wrong scopeReports show last value instead of per-event value (or vice versa)Per-interaction → event scope; per-person → user scope
Expecting historical dataOnly data after registration appearsRegister early, before you need reports
High-cardinality valuesData collapses into the (other) rowKeep values categorical; use BigQuery for the rest
Inconsistent parameter namingValues split across multiple dimensionsLock naming in a tracking plan

That last fix points to the real prevention: a documented tracking plan that defines every parameter name and scope before anyone touches the GA4 admin. Custom dimensions are only as clean as the parameters feeding them.

Frequently Asked Questions

Are GA4 custom dimensions retroactive?

No. A custom dimension only captures data collected after you register it. Existing events that already carried the parameter won’t be backfilled, so register dimensions as early as possible.

What’s the difference between event scope and user scope?

Event scope stores the value as it was when a single event fired, so it can vary across a user’s interactions. User scope stores the most recent value and applies it across all of that user’s activity. Use event scope for per-interaction attributes and user scope for stable attributes describing the person.

Why is my custom dimension empty?

The usual cause is that the parameter or user property isn’t actually being sent under the name you mapped. Check DebugView to confirm the value is arriving, verify the name matches exactly (it’s case-sensitive), and remember new dimensions take 24–48 hours to populate.

Do custom dimensions count toward a quota?

Yes. Standard GA4 properties cap the number of custom dimensions and metrics you can register per scope. Archive unused ones to free up slots, and check Google’s documentation for the current limits before planning a large implementation.

Tom Bradley

About the Author

Tom Bradley

Marketing analyst with 8+ years in web analytics. I’ve completed 150+ GA4 implementations and helped 50+ brands turn data into growth strategies. Every guide on Viewing comes from real projects and real problems I’ve solved.