GA4 Custom Dimensions for Shopify: 10 High-Value Ones to Track

|Dan Giura
GA4 Custom Dimensions for Shopify: 10 High-Value Ones to Track

TL;DR

GA4 custom dimensions let you attach Shopify-specific data points, like customer lifetime stage, discount codes, and login state, to every event you send [1]. Without them, GA4's default reports treat all sessions as equal, which makes it hard to answer basic business questions like "do loyalty members convert better?" or "which discount codes actually drive margin?". The ten dimensions below are the ones with the highest reporting leverage for Shopify stores. Most require a small data layer or pixel extension to wire up, but the analytical payoff is meaningful. Once your underlying GA4 data is solid (start with the Shopify GA4 setup guide if you haven't), custom dimensions are how reports stop being descriptive and start answering business questions.


Free 60-second tracking audit

Check your store for the tracking gaps mentioned in this article. Run a free audit in under a minute (no install required).

Run my free audit

What Are GA4 Custom Dimensions and Why Do Shopify Stores Need Them?

GA4 custom dimensions are event-scoped, user-scoped or item-scoped attributes you define yourself and attach to your analytics data [1]. Shopify's default GA4 integration sends purchase events, page views, and a handful of ecommerce parameters, but it does not send the merchant-specific context that makes analysis actionable.

A Shopify store has data that GA4 knows nothing about by default:

  • Whether the customer is logged in or browsing as a guest
  • Their lifetime purchase history
  • Which discount code is active in their session
  • How many items are in their cart right now
  • Whether they're paying with Shop Pay or a regular card

Without custom dimensions, all of that gets lost. You end up with conversion rates and revenue numbers, but no way to explain why they look the way they do or who is driving them.

One thing a custom dimension is not: a data collection feature. It is a reporting alias that makes an event parameter or user property visible in reports, explorations and linked ad platforms [1]. The parameter has to exist in the data first, which is why the quota (set out in full further down) is rarely the constraint that bites.


You Can Only Register What Your Store Already Sends

The order of operations trips up more Shopify merchants than the interface does. Google's own four-step description of the feature puts collection first: you add an event parameter or user property to your code, a visitor triggers it, you create the custom dimension, and after 24 to 48 hours the data becomes reportable [1]. Creating the dimension first produces a clean-looking row in Custom definitions that reports nothing forever.

So the first move is an audit, not a configuration. Open DebugView or the Realtime report's event card, trigger a real purchase on your store, and read the parameters that arrive on the purchase event. Whatever is in that payload is your candidate list. Whatever is not in it cannot be registered into existence.

For most Shopify stores the payload comes from three places: GA4's own automatic collection, your theme or tag setup if you push anything custom, and your conversion tracking app. The third one is where merchants assume the most and verify the least, so there is a section below on exactly which parameters an app already puts in the payload.


Event, User or Item: Which Scope Does the Data Belong To?

GA4 splits custom dimensions three ways, and the split is about what the value describes rather than where it appears.

Event-scoped dimensions read a parameter on a single event, which is the right home for anything that describes one action: a payment method on add_payment_info, a shipping tier on add_shipping_info, a new-versus-returning flag on purchase [2]. User-scoped dimensions read a user property and describe the person across their events, which means the value has to be set as a user property in your code rather than passed on an event [1]. Item-scoped dimensions reach into the items array on ecommerce events like purchase and add_to_cart, and they are the only way to analyse a per-product attribute such as fabric or fit [3].

The mechanics matter here because the interface is unforgiving. When you save a custom dimension, the Scope field and the parameter field both become read-only [1]. A parameter registered at the wrong scope is a slot you have to archive and re-create, and archiving is what starts the 48-hour clock before you can add a new one [1].

Two quirks of the item scope are worth knowing before you plan around it. Google lets you send up to 27 item-scoped custom parameters even though a standard property can only configure 10 of them, so you can tag broadly now and choose which 10 to surface later without retagging the site [7]. And item-scoped dimensions cannot be added to standard reports at all [3]. They live in Explorations only, which is the constraint that lands hardest on ecommerce, the one audience item scope exists for.


Do the Quota Limits Ever Bite a Shopify Store?

Rarely, and when they do it is usually self-inflicted. Here is the full allowance, standard property against Analytics 360 [1]:

Type Standard property Analytics 360
User-scoped custom dimensions 25 100
Event-scoped custom dimensions 50 125
Item-scoped custom dimensions 10 25
Custom metrics 50 125
Calculated metrics 5 50

Fifty event-scoped slots is a lot of room for a store that sends maybe three custom parameters. The properties that run out are the ones registering things GA4 already reports. Google names this pattern directly and says registering a custom dimension for a parameter that is already a predefined dimension, such as page and screen dimensions or transaction ID, is not a best practice, because it consumes quota without changing cardinality [1]. You can watch your own consumption under Admin, in Custom definitions, via the Quota information link at the top right [1].

Two clocks are attached to that quota. Deleting a dimension does not free the slot immediately: Google says to wait 48 hours after deleting before you add new ones [1]. Archiving frees the space and lets you reuse the name, but it cannot be undone, and it invalidates whatever was built on that dimension. Audiences stop accumulating users, explorations built on it will not load, and reports show a data-quality warning until the dimension is removed from them [5].


What You Should Not Register

The other quota nobody reads until it hurts is cardinality. Google treats any dimension with more than 500 distinct values in a day as high cardinality, and high-cardinality dimensions push reports into their row limit, with the overflow condensed under the (other) row [4]. GA4 also applies cardinality control above 50,000 values [4].

That rules out the obvious-looking candidates on an ecommerce property. A Google click ID is unique per click. An event ID is unique per event. A session ID is on Google's explicit list of things not to register, alongside timestamps and per-user unique IDs, with the User-ID feature offered as the sanctioned alternative [1]. Register any of those and you have not gained a report, you have degraded the tables that dimension touches.

One more trap that catches Shopify stores specifically: GA4 coerces values that look numeric. Google's wording is that any value in a custom dimension that resembles a number will be treated as a number even if it was originally formatted as text, so "9343.324234" comes back as 9343.32 and "94E40" is read as scientific notation and becomes 9.4e+41 [1]. SKU-shaped and code-shaped values are exactly the kind of thing that gets mangled this way.

Finally, a legacy note that guards against stale advice you will still find online. Custom-parameter reporting is deprecated: parameters are registered property-wide now rather than per event. Where a parameter was historically registered against several events, GA4 disambiguates it with a name of the form custom_dimension_name [event_name], and Google's advice is to remove those duplicates and reclaim the quota [1].


Which 10 Custom Dimensions Actually Move the Needle for Shopify?

Here are the ten I'd prioritize, in roughly the order I'd wire them up.

1. Customer Lifetime Stage
Segments customers into groups like "new," "1-2 orders," "3-5 orders," and "6+ orders." This is the single most useful segmentation dimension for retention analysis. You can see whether repeat buyers have materially higher conversion rates and average order values.

2. Logged-In State
A simple boolean: logged_in or guest. A logged-in customer has already signaled intent, but how big that gap is on your store is exactly what this dimension exists to measure. Capturing it lets you quantify the difference and decide how aggressively to invest in account creation prompts.

3. Discount Code Used
Captures the specific code applied at checkout, not just whether a discount existed. This lets you compare performance by promotion: which codes drive high-value orders, which ones only attract one-time buyers, and which are being shared outside their intended channel.

4. Cart Item Count
The number of line items in the cart at checkout initiation. Useful for segmenting checkout abandonment. A cart with eight items abandoning is a very different problem than a cart with one item abandoning.

5. First-Time vs. Returning Customer
Similar to lifetime stage but binary. GA4 has its own new/returning user dimension, but it's cookie-based and resets. A Shopify-side dimension tied to actual order history is more reliable, especially post-iOS changes. This is the one dimension on this list you may not have to build at all: WeltPixel Conversion Tracking already sends a customer_type parameter (values new or returning, based on the buyer's Shopify order history) on server-side purchase events, so registering customer_type as an event-scoped dimension is the whole setup. The full breakdown of what that flag does across ad platforms is in new vs. returning customer tracking on Shopify.

6. Shop Pay Usage
Whether the customer completed checkout using Shop Pay. This helps you understand what share of revenue flows through Shop Pay and whether those sessions have different drop-off patterns or AOV.

7. Customer Tag(s)
Shopify lets you tag customers with labels like "wholesale," "VIP," or "loyalty-member." Passing these tags through to GA4 lets you build segments that match your actual business logic rather than proxy metrics.

8. Product Availability Status
Was any item in the cart on backorder or low stock? Attaching this to checkout events helps correlate inventory signals with abandonment rates.

9. Geographic Region (Store-Level)
If you run multiple store fronts or currencies, this dimension identifies which store or region the session originated from, beyond what GA4's built-in geo can tell you. This is one you publish yourself from theme code; no Shopify Markets setup produces it for you, for the reason set out in the next section.

10. Subscription vs. One-Time Purchase
For stores using Recharge or similar apps, whether the cart contains a subscription product. Subscription orders behave differently across the funnel and should be analyzed separately.


Which of Those Does a Conversion Tracking App Already Send?

Here is the part that saves you an afternoon, assuming your GA4 data comes from WeltPixel Conversion Tracking. Of everything the app puts on a GA4 event, the honest count worth a custom dimension is one.

Session attribution needs no registration. The server-side purchase carries the captured session's source, medium, campaign, term, content and campaign ID under GA4's reserved parameter names, which populate GA4's own session dimensions directly. There is nothing to create. If you have seen a guide telling you to register campaign_source or campaign_medium as custom dimensions, that advice belongs to an older tagging convention; those legacy duplicate parameters are sent for backward compatibility, so custom reports built on the old convention keep working, and registering them now gives you a second, worse copy of a report GA4 already builds.

Item data is already predefined. Products arrive with item_id, item_name, quantity, price, currency, brand and variant, and every one of those is a standard GA4 item dimension. Your 10 item-scoped slots stay free until you add a genuinely custom product attribute of your own, which is exactly what that scope is for.

There is no market dimension. If you run multiple Shopify Markets and route a separate pixel per market, that is delivery routing rather than a parameter on the event, so no market value reaches GA4 to register. Market-level reporting comes from the destination property or from the geographic dimensions GA4 collects on its own. We explain the routing side in our guide to running a different pixel for each Shopify Market.

Do not register the click and event identifiers either. The purchase payload also carries a Google click ID and an event ID for deduplication. Both are unique per click and per event respectively, which puts them straight into the high-cardinality territory described above. They do their job inside the payload; they are not dimensions.

One parameter is worth the slot. customer_type, the new-versus-returning label derived from the buyer's Shopify order history, is a real custom parameter with exactly two values, and it arrives on purchase events. Two values means zero cardinality risk and a dimension you can put on any revenue report to split first orders from repeat orders. It is Plus-plan functionality at $39 a month, it is not sent on refunds, and it is not attached to browse events, so build reports on purchase-scoped rows. Coverage is not total either: guest checkouts, where there is no customer record to read an order history from, arrive without the label.


How Do You Actually Wire Up Custom Dimensions in GA4 for Shopify?

There are two steps: sending the data, and registering the dimension in GA4.

Step 1: Send the parameter with your events

You need to include the custom parameter in the event payload, and on Shopify there are two distinct routes, which are easy to mix up. Publishing happens from your theme or app code; a pixel can only subscribe to what was published and forward it.

Route A: publish a custom event from theme code (Liquid or a theme app block), where your storefront actually knows things like login state and cart contents [8]:

Shopify.analytics.publish('cart_context_ready', {
  customer_lifetime_stage: 'returning_3_to_5',
  logged_in: true,
  cart_item_count: 4
});

Route B: subscribe in a custom pixel and forward to GA4 (Settings > Customer events > Add custom pixel), attaching the parameter to the gtag event you send [8]:

analytics.subscribe('checkout_completed', (event) => {
  gtag('event', 'purchase', {
    // ...standard ecommerce params...
    discount_code: event.data.checkout.discountApplications?.[0]?.title
  });
});

The subscribe side runs in Shopify's pixel sandbox, so it only sees the event payloads Shopify (or your published custom events) provide; it cannot reach into the page and read your customer object directly.

Step 2: Register the dimension in GA4

The path is short. Open Admin, and under Data display click Custom definitions. Select the Custom dimensions tab and click Create custom dimensions [2].

Four fields follow. Dimension name is what appears in reports and in linked ad platforms; Google's rule is that you cannot use hyphens in the name, but underscores and spaces are fine [1]. Scope is Event for a parameter, User for a user property, Item for a value inside the items array. Description is optional and you will want it in six months. Event parameter has to match the parameter name in the data exactly, including case [2]. For customer_type the whole configuration reads: name "Customer type", scope Event, parameter customer_type. That is the entire job.

Two access notes, because they are a common trip-up. You need Editor or above at property level to create a custom dimension, and Marketer or above to build an audience from one [1]. They are different roles.

And the field you get wrong is the field you live with: scope and the parameter or user property field cannot be changed after you save [1]. Only the display name and description stay editable. Get the parameter name right the first time or you burn a slot and start the archive clock.


How Long Does It Take for Custom Dimension Data to Appear in GA4?

GA4 shows custom dimension data 24 to 48 hours after the parameter has been sent and the dimension has been created [1]. Real-time reports surface some data sooner, but standard reports operate on a processing delay, and very high-volume properties tend to sit at the slow end of the window.

The bigger question is what happens to the events that arrived before you registered anything. Google's own wording, in the "Register custom parameters" callout of its developer guide, is precise and worth reading literally: sending custom parameters in your code is only the first step, and without registering them as custom dimensions or metrics, the parameter data is collected but is not available for reporting [6]. So the honest statement is this: GA4 reports on a custom parameter only from the point you register it. Hits that arrived earlier still carried the parameter, but standard reports and explorations will not surface it, and Google documents no backfill.

Chain those clocks together and the operator rule is concrete. Registration is not retroactive for reporting, the dimension needs 24 to 48 hours before it reports, and a deleted dimension frees its slot only after another 48 hours. Register at least three days before the promotion you intend to analyse, and if you are reshuffling a full property, give it five.

There is one honest recovery path if you missed the window. The parameter is still sitting in the raw hits, so a BigQuery export carries every event parameter regardless of whether a dimension exists for it, which is one of the better arguments for turning it on before you need it. We compared that trade-off in when raw data beats dashboards.


Build Your First GA4 Exploration With a Custom Dimension

Once you have data flowing, the value shows up in Explorations. Here is the simplest one to validate the setup is working, using Customer Lifetime Stage as the example dimension:

  1. Open GA4. Go to Explore → Free form.
  2. Set the date range to last 30 days.
  3. Under Dimensions, click the + button and add customer_lifetime_stage. Click Import.
  4. Under Metrics, add Sessions, Conversions, and Total revenue.
  5. Drag customer_lifetime_stage into the Rows field and the three metrics into Values.

The table now shows session count, conversion count, and revenue broken out by lifetime stage. Sort by Total revenue descending and you are reading, per cohort, how session-to-purchase conversion and revenue differ between first-time visitors and customers who have already bought from you. That gap is the number retention work moves.

If you have not registered or populated customer_lifetime_stage yet, the only value you'll see in the Rows is (not set). That confirms either the parameter isn't being sent or the dimension name is mismatched.


Where Custom Dimensions Stop Being the Answer

A custom dimension cannot rescue an event that never matched a session. Orders that arrive without a captured browser session land in GA4's default unattributed classification, and adding a dimension to those rows tells you more about the order without telling you anything more about where it came from. That problem is upstream, in the (not set) and unattributed orders territory, and it is solved by identity bridging rather than by configuration.


Key Takeaways

  • A custom dimension does not collect anything. GA4 collects event parameters whether or not you register them; the dimension only makes them reportable in the UI and in linked ad platforms [1]. Audit what your store already sends before you configure anything.
  • Custom dimensions are registered in GA4 Admin under Custom definitions. The parameter name in your event payload must match exactly, including case, and hyphens are not allowed in the dimension name [1].
  • Scope and the parameter field are permanent once saved [1]. Only the display name and description can be edited afterwards.
  • A standard property allows 25 user-scoped, 50 event-scoped and 10 item-scoped custom dimensions, plus 50 custom metrics and 5 calculated metrics; Analytics 360 raises those to 100, 125, 25, 125 and 50 [1]. Item-scoped dimensions cannot be used in standard reports at all [3].
  • Register dimensions before events start flowing. GA4 reports on a parameter only from the point you register it, and Google documents no backfill for earlier hits [6].
  • Do not register anything with hundreds of distinct values per day. Click IDs, event IDs, session IDs and timestamps degrade reports into the (other) row instead of explaining them [1][4].
  • Do not register a parameter GA4 already reports as a predefined dimension. It costs quota and buys nothing [1].
  • If you're using Shopify's customer pixel API, you can pass custom parameters directly in the event payload without modifying storefront theme code.

FAQ

How many custom dimensions can I create in GA4?

A standard property allows 25 user-scoped, 50 event-scoped and 10 item-scoped custom dimensions, plus 50 custom metrics and 5 calculated metrics. Analytics 360 properties allow 100, 125, 25, 125 and 50 respectively. If you delete a dimension, Google says to wait 48 hours before creating a new one in its place [1].

Do custom dimensions apply to data GA4 already collected?

Not for reporting. Google's documentation says you can start reporting on a custom dimension 24 to 48 hours after the parameter is being sent and the dimension is created, and it documents no backfill for earlier events [1][6]. The parameter was still collected on those earlier hits, it just is not available in standard reports or explorations. Register the dimension as soon as the parameter starts flowing. The BigQuery export stores every parameter whether or not a dimension exists for it, which is the reliable route to historical values.

Should I register the campaign parameters my tracking app sends?

No. Session source, medium, campaign, term, content and campaign ID arrive under GA4's reserved parameter names and populate GA4's own session dimensions without any registration. Registering a duplicate consumes quota and produces a parallel report that is harder to trust than the built-in one.

What's the difference between event scope and item scope for an ecommerce store?

Event scope describes the whole event, so a value like new versus returning applies to the entire purchase. Item scope reaches inside the items array and describes one product line, so a value like fabric or fit can differ between two products in the same order [2][3]. If the value would be identical for every line in the order, it belongs at event scope. Remember that item-scoped dimensions are available in Explorations only [3].

Can I change a custom dimension after saving it?

You can change the display name and the description. Scope and the parameter or user property field are locked once the dimension is created, so a mistake there means archiving that definition and creating a new one, with the 48-hour wait before the slot can be reused [1][5].

Do GA4 custom dimensions work with Shopify's native Google channel integration?

Shopify's native Google channel sends a limited set of ecommerce events and does not support custom dimension parameters out of the box. You need either a custom pixel implementation or a third-party app to pass additional parameters through to GA4. Custom dimensions also flow through server-side events when properly configured (see our server-side GA4 article). Because a server-side purchase is built from the order webhook rather than from a browser tag, its parameters arrive even when a browser-side pixel is blocked.

Can I use custom dimensions in GA4 audiences for remarketing?

Yes. Once a custom dimension is registered and has data, you can use it as a condition in GA4 audience definitions. For example, you could build an audience of users where customer_lifetime_stage equals "6_plus_orders" and use that for Google Ads remarketing. This typically requires linking your GA4 property to Google Ads, and building the audience requires Marketer access or above [1].

Why is my custom dimension showing "(not set)" in GA4 reports?

This usually means the parameter is not being sent with the events GA4 is reporting on, or the parameter name in your event payload doesn't match the name registered in Custom definitions. Check both the event payload (using GA4 DebugView) and the dimension registration for an exact name match.


The One Dimension You Don't Have to Build

Wiring up ten custom dimensions manually means writing and maintaining a custom Shopify pixel, making sure parameter names stay consistent across your event taxonomy, and re-testing every time Shopify updates its checkout flow.

WeltPixel Conversion Tracking will not do that work for you; the app sends a fixed parameter set and has no screen where you map your own parameters. What it does do is put one dimension-ready parameter on every server-side purchase, and keep your existing campaign reports intact. Every server-side purchase carries customer_type (new or returning, from the buyer's Shopify order history), and campaign attribution parameters are sent under both GA4's reserved names and the legacy campaign_source-style names, so existing custom reports and dimensions built on either naming convention keep working. Because these ride the order webhook rather than a browser tag, the parameters arrive even when an ad blocker eats the pixel.

GA4 server-side tracking runs on the free Discovery plan (100 storefront orders per month); the customer_type flag is part of the Plus plan ($39/month, unlimited orders) alongside Meta, TikTok, Google Ads, Reddit, OpenAI Ads, Pinterest Ads, and Klaviyo.

Install WeltPixel Conversion Tracking on Shopify


Sources

  1. Google Analytics Help, "[GA4] About custom dimensions and metrics": https://support.google.com/analytics/answer/10075209
  2. Google Analytics Help, "[GA4] Create event-scoped custom dimensions": https://support.google.com/analytics/answer/14239696
  3. Google Analytics Help, "[GA4] Create item-scoped custom dimensions": https://support.google.com/analytics/answer/14239695
  4. Google Analytics Help, "[GA4] Cardinality": https://support.google.com/analytics/answer/12226705
  5. Google Analytics Help, "[GA4] Archive custom dimensions and metrics": https://support.google.com/analytics/answer/12436143
  6. Google Analytics developer guide, "Set up event parameters": https://developers.google.com/analytics/devguides/collection/ga4/event-parameters
  7. Google Analytics developer guide, "Item-scoped custom parameters": https://developers.google.com/analytics/devguides/collection/ga4/item-scoped-ecommerce
  8. Shopify Developer Documentation, Web Pixels API (publish and subscribe): https://shopify.dev/docs/api/web-pixels-api

Ready to upgrade your tracking?

Server-side tracking for Magento and Shopify — accurate data, better attribution, full privacy compliance.