One GA4 Property or Several? Analytics Architecture for Multi-Store Shopify Businesses

|Dan Giura
One GA4 Property or Several? Analytics Architecture for Multi-Store Shopify Businesses

TL;DR

Several separate Shopify stores is its own architecture, distinct from Markets inside one store and from one store on several domains. Standard GA4 gives you three layouts, and roll-up properties, which would combine separate properties, need GA4 360. How your purchases arrive decides the layout: a server-side purchase has no page URL, so only the stream can tell GA4 which store it came from. Every extra store is also a full extra tracking stack, priced per store.

Key Takeaways

  • Google populates Hostname from the page URL [5]. A server-side purchase with no page_location gives it nothing to read.
  • Stream name and Stream ID are populated automatically [5], which makes one web data stream per store the layout that separates purchases by store without custom work.
  • Cross-domain measurement only works inside one web data stream [4]. With a stream per store, a shopper who visits two of your stores counts as two users [2].
  • Roll-up properties need GA4 360 on the roll-up and on every source property [2]. On the standard tier nothing inside GA4 combines separate properties.
  • The standard-tier substitute is dual sending: each store reports to its own property and to a shared group property. That needs several GA4 destinations per store, which WeltPixel Conversion Tracking allows on its Plus plan (up to 50 per channel; one on the free plans).
  • Shopify runs each expansion store "completely independently" and bills apps per store [7]. Four stores means four installs, four sets of GA4 credentials and four subscriptions at $39 a month each [8].

The split that looks right and isn't

Most multi-store GA4 setups start the same way. Someone puts every storefront on one measurement ID, opens a report, adds Hostname as a dimension and expects revenue to fall neatly into one row per domain. For page views it does. For purchases, the answer turns on how the purchase reached GA4.

Google's definition is specific. Hostname is "the subdomain and domain names of a URL that people visited on your website", it's "populated automatically", and populating page_location manually overrides the collected value [5]. So Hostname lives on the page URL. A purchase sent from the browser on the thank-you page has one. A purchase sent server-side, built from the Shopify order and delivered through the Measurement Protocol, only has one if the sender adds it.

WeltPixel Conversion Tracking's server-side GA4 purchase doesn't carry a page URL. It carries the transaction ID, value, currency, items, the session and campaign keys and a click ID when one exists, and nothing that names the store. The item-level item_brand is the product vendor, which for most catalogs is a brand name and not a storefront. So on a shared stream, GA4 has no page URL on the purchase event to derive a hostname from, and the store the order came from isn't in the event.

Stream name is different: "The name of the stream from which users activity originated", populated automatically [5]. The Measurement Protocol secret the purchase is sent with belongs to one stream, created under Admin > Data Streams > Choose your stream > Measurement Protocol > Create [6], so a purchase sent with a store's own secret lands in that store's stream.

Check this in your own property before you trust any layout:

  1. In GA4, open Explore and start a Free form exploration.
  2. Add Hostname and Stream name as dimensions and Event name as a filter set to purchase.
  3. Add Purchase revenue and Transactions as metrics, pick the last 30 days, and compare the two breakdowns against each store's order count in Shopify.

If your Hostname rows don't add up to your purchases, that gap is the answer to this whole article.

Which layouts can a standard GA4 account build?

Three, and the account limits won't be what stops you: an account holds up to 2,000 properties and a property up to 50 data streams [1]. The Magento version of this decision, with its store-view mapping, is covered in how to map Magento 2 store views to GA4 properties; what follows is the Shopify side.

Layout What you get What breaks
One property, one shared web stream Cross-domain user stitching across stores; Google's own suggestion for regional sites of one business [3] Server-side purchases carry no page URL, so Hostname can't assign them to a store
One property, one web stream per store Stream name on every event, purchases included; one combined total at property level A shopper who visits two stores counts as a separate user in each stream [2]
One property per store Clean separation and per-store Google Ads links; Google's pattern for independent subsidiaries [3] No combined view inside GA4 on the standard tier

Google's own worked examples draw the line by business. For a "geographically distributed ecommerce retailer" whose regional businesses serve one logical user base, the standard-tier answer is one property with "one web data stream for multiple domains". For independent subsidiaries that need their data kept apart, it's "a single property and data stream for each subsidiary site" [3]. Google also says small and midsize businesses may not need to think about account structure at all [3]. That's fair for one store. It stops being fair at the second one.

The shared-stream layout exists for cross-domain measurement, which needs "the same tag ID" from "the same web data stream" on every page [4]. On separate Shopify stores, though, every store has its own cart and its own checkout, so a single purchase journey ends inside one store. Cross-domain stitching buys you a cleaner user count for shoppers who browse two stores. It doesn't buy you a store label on revenue. The one-store-many-domains case, where the linker does real work, is covered in cross-domain tracking on Shopify.

If the stores sell in different currencies, decide how that currency lands before they share a property. Why ad platforms show the wrong conversion value on multi-currency stores covers what gets converted where.

What about roll-up properties?

They're the feature everybody reaches for, and they're GA4 360 only: Google requires an account linked to a Google Marketing Platform organization "with an active 360 order", every source must itself be a 360 property, and a roll-up takes at most 200 sources, doesn't inherit custom dimensions and only collects each source's data from the day it's added [2]. Subproperties, the other way to carve one property up, sit in the same 360-only list [1].

On the standard tier, the working substitute is dual sending. Each store reports to its own property, and at the same time to a shared group property that sees everything. The per-store property stays clean for the store's team and its Google Ads account. The group property answers the "how is the business doing" question, and if it uses one stream per store, it splits revenue by Stream name.

This needs more than one GA4 destination per store, and it's something the app supports directly. The storefront loads one Google tag and configures it once per measurement ID, so page views reach each property. The server-side purchase goes to every GA4 destination separately, each with its own measurement ID, API secret and matched session. On WeltPixel Conversion Tracking's Plus plan you can add up to 50 destinations per channel. The free plans allow one, and if a store on a free plan has several GA4 destinations configured, only the first is used, in the browser and for the server-side purchase.

Price the costs before you commit:

  • Two API secrets per store, one from each property's stream.
  • Every setting maintained twice, and a change made in one property never reaches the other.
  • The group property starts from the day you add it, with no history from before.

If you'd rather combine properties outside GA4, the GA4 BigQuery export for Shopify is the route that doesn't need 360 roll-ups, at the cost of writing the joins yourself.

Separate stores multiply the stack, not the property count

The GA4 decision gets the attention. The tracking stack underneath it is where the ongoing work sits.

Expansion stores are extra .myshopify.com stores under one organization on a Shopify Plus contract, up to ten at no extra platform cost (one main store and nine expansion stores), and "each individual store operates completely independently with its own separate data, settings, and configurations" [7]. Changes made to one store "aren't reflected across other stores", and "apps are billed on a per-store basis rather than for the entire organization" [7].

The app follows the same rule. Each store is its own install with its own GA4, Meta, Google Ads and other credentials, set up in that store's admin. Nothing copies a configuration from one store to another, and there's no cross-store settings screen. Per-Market routing, the feature that sends each Shopify Market to its own pixel, is a switch inside one store and reads that store's own orders; it never reaches a second store. If you're weighing Markets in one store against separate stores, running a different pixel for each Shopify Market covers the one-store option.

Run the arithmetic on an illustrative business with four stores. On the Plus plan, listed on the App Store at $39 a month or $390 a year per store [8], that's $156 a month or $1,560 a year for the tracking layer. (Shopify Plus, the platform plan expansion stores sit under, is a separate thing from the app's Plus plan.) Add the hours: four setup passes, four sets of Advanced Settings to keep in line, and four places to check after every change.

You've probably already found that the second store took longer to set up than the first, because the first one got done once and nobody wrote down how. Write it down. If you run stores for clients rather than your own business, the per-store record and naming conventions are in how agencies standardize conversion tracking across client Shopify stores.

How do you choose? Three questions

Answer these in order. The first one that gets a "yes" usually decides it.

Question If yes If no
Does each store need its data kept apart, with no combined view needed inside GA4? One property per store, Google's subsidiary pattern [3]; add a group property by dual sending if that changes Go to the next question
Do shoppers move between your stores' domains, and do you need each of them counted as one user? One property with a shared web stream and cross-domain set up; find another way to assign server-side purchases to a store One property with one web stream per store, so every purchase carries its Stream name
Do the stores sell in different currencies? Settle the currency question before they share any property Nothing to add

A property can hold up to 400 Google Ads links [9], so shared ad accounts rarely force a layout on their own.

FAQ

Can I combine several GA4 properties into one report without GA4 360?

Not inside GA4. Roll-up properties and subproperties are both 360 features [1][2]. On the standard tier, send each store to its own property and to a shared group property at the same time, or combine the properties outside GA4 through the BigQuery export.

Why doesn't Hostname split my purchase revenue by store?

Hostname comes from the page URL [5], and a server-side purchase built from the Shopify order doesn't carry one. Stream name is populated automatically on every event, so one web data stream per store gives purchases a store label.

Does per-Market routing work across separate Shopify stores?

No. It's a setting inside one store that reads that store's own orders. Each separate store needs its own install and its own GA4 destinations.

Is there a multi-store discount for the app?

No. Shopify bills apps per store [7], and the app's Plus plan is listed at $39 a month or $390 a year for each store [8].

Put the store label on every purchase

WeltPixel Conversion Tracking sends each store's purchases server-side to as many GA4 destinations as you configure on the Plus plan, each with its own measurement ID and API secret. Decide the stream layout first, then connect each store's streams, and the purchase lands in the right stream with its name attached.

Sources

  1. Google Analytics Help, "Google Analytics hierarchy" (2,000 properties per account; 50 data streams per property; 360 property types), support.google.com/analytics/answer/9303323, accessed September 28, 2026
  2. Google Analytics Help, "[GA4] About roll-up properties" (360 only; 200 sources; no custom-dimension inheritance; no backfill; a user in several streams counts once per stream), support.google.com/analytics/answer/11526039, accessed September 28, 2026
  3. Google Analytics Help, "[GA4] Google Analytics account structure" (regional retailer and independent-subsidiary examples), support.google.com/analytics/answer/9679158, accessed September 28, 2026
  4. Google Analytics Help, "Set up cross-domain measurement", support.google.com/analytics/answer/10071811, accessed September 28, 2026
  5. Google Analytics Help, "Analytics dimensions and metrics" (Hostname, Stream name), support.google.com/analytics/answer/9143382, accessed September 28, 2026
  6. Google for Developers, "Measurement Protocol reference" (API secret created per data stream), developers.google.com/analytics/devguides/collection/protocol/ga4/reference, accessed September 28, 2026
  7. Shopify Help Center, "Expansion stores", help.shopify.com/en/manual/organization-settings/expansion-stores, accessed September 28, 2026
  8. WeltPixel Conversion Tracking, Shopify App Store listing (Plus plan $39 a month or $390 a year), apps.shopify.com/weltpixel-conversion-tracking, accessed September 28, 2026
  9. Google Analytics Help, "Connect Google Ads to Google Analytics" (400 links per property), support.google.com/analytics/answer/9379420, accessed September 28, 2026

Ready to upgrade your tracking?

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