Connecting GA4 to Shopify takes a few minutes. Setting it up so the numbers mean something takes more care. Most of the GA4 problems we see on Shopify stores come from a handful of settings that nobody checked after the first install.
This guide walks through those settings in the order we check them.
The purchase event and its parameters
Everything in GA4’s e-commerce reports depends on the purchase event and the parameters sent with it. These are the ones that matter most:
| Parameter | What it should contain |
|---|---|
transaction_id |
The Shopify order ID or order number, unique per order. Always send it. |
value |
The order’s revenue figure, as a number with no currency symbol. |
currency |
A three-letter code such as CAD or USD. Required whenever value is sent. |
tax |
Tax on the order, as a number. |
shipping |
Shipping charged, as a number. |
coupon |
The discount code, if one was used. |
items |
One entry per product, with item_id, item_name, price and quantity at least. |
Decide what value means
GA4 reports whatever you send as value. It does not add tax and shipping on its own. Pick a definition and stick to it. Many stores send the product subtotal after discounts as value, and put tax and shipping in their own parameters, so revenue in GA4 lines up with what the products earned. Others include everything the customer paid. Both work, as long as you know which one you chose when you compare GA4 with Shopify.
Get currency right
If your store sells in more than one currency through Shopify Markets, check that each purchase sends the currency the customer actually paid in, with the matching value. GA4 converts to your property’s reporting currency. A purchase sent as 150 with the wrong currency code reports a very different amount.
Always send transaction_id
The transaction_id is how you trace a GA4 purchase back to a Shopify order, and how you spot duplicates. Google uses it to discard some repeated purchases, but do not rely on that as a fix. A missing or random ID makes every later investigation harder.
How the purchase reaches GA4
On Shopify there are a few ways to send GA4 events, and the choice affects everything else.
- The Google & YouTube app connects GA4 through Shopify’s app pixel and sends standard e-commerce events, including purchases from checkout.
- A custom pixel in Settings, Customer events can send GA4 events (directly or through GTM) with your own rules for parameters.
- Theme code or GTM in the theme can send storefront events like
view_itemandadd_to_cart, but cannot see inside checkout on its own.
Use one method for purchases. Mixing them is the most common cause of double counting.
The checkout domain and cross-domain tracking
Shopify’s checkout now runs on your store’s own domain, so for most stores GA4 sees the storefront and checkout as one site. You do not need cross-domain tracking for a standard Shopify setup.
You do need it when part of the journey lives on another domain. Common cases are a headless storefront on a different domain from checkout, a separate landing page site, or a booking or subscription portal on a third-party domain. In GA4, add each domain under the data stream’s settings for configuring your domains, so the visitor’s session carries across.
Referral exclusions for payment gateways
When a customer pays through PayPal, a buy-now-pay-later provider, or a bank’s card verification page, they leave your site briefly and come back. Without the right setting, GA4 can treat that return as a new visit from the payment provider. The sale then shows up as “referral from paypal.com” instead of the Google ad or email that actually brought the customer.
In GA4, open the web data stream, go to the tag settings and find the list of unwanted referrals. Add each payment and verification domain your checkout uses. Typical entries are PayPal and any buy-now-pay-later or wallet providers you offer. Then check the traffic acquisition report a week later. Payment providers should no longer appear as sources of purchases.
Duplicate purchases from apps and GTM
Duplicates are usually the biggest error on stores that have been running for a few years. A typical history looks like this. A developer hardcoded GA4 into the theme. Later, someone added GTM with its own GA4 tag. Then the Google & YouTube app was installed. Each one now sends purchase.
To find them:
- In GA4, open Explore and build a free-form table with
transaction_idas the dimension and event count as the metric, filtered to thepurchaseevent. - Sort by event count. Any order ID with more than one purchase is a duplicate.
- Check whether the duplicates arrive at the same moment (two tags on the same page) or later (a reload of the order status page).
Then list every tool that sends GA4 data, using Tag Assistant on a test order. Keep one source for purchase and turn the rest off. Keeping one source for storefront events is a good idea too.
Comparing GA4 with Shopify fairly
GA4 and Shopify will never match exactly, and they should not be forced to. Here is how to compare them without chasing ghosts.
Use the same date range and time zone. GA4 reports in the property’s time zone and Shopify in the store’s. If they differ, set them to match or expect daily totals to shift.
Compare order counts first. Compare Shopify’s order count with GA4’s transactions for the same week. Counts do not depend on tax, shipping or currency settings, so they show tracking problems more clearly than revenue.
Then compare revenue on the same definition. If GA4’s value excludes tax and shipping, compare it with Shopify’s gross sales minus discounts, not with total sales.
Exclude orders GA4 never sees. Draft orders, point-of-sale orders, subscription renewals and orders created by apps do not pass through a browser. Remove them from the Shopify side before comparing.
Expect GA4 to be lower. Visitors who refuse analytics consent, block scripts, or leave checkout before the confirmation loads are not fully recorded. The size of the gap depends on your audience and your consent setup. Watch the gap over time. A sudden change matters more than its size on any given week.
Allow for processing time. GA4 can take a day or two to finish processing. Compare weeks that ended at least two days ago.
If GA4 shows more transactions than Shopify has orders, stop comparing and look for duplicates. That is never a healthy gap.
For the bigger picture of how GA4 fits with pixels and Shopify’s customer events, see our guide to tracking basics for Shopify owners.
What to do next
Run the duplicate check in Explore on last month’s purchases. It takes about ten minutes and gives you a clear yes or no. If you find duplicates, payment providers in your top sources, or a gap with Shopify that changed suddenly, send your store URL through our free tracking check. For a complete review of GA4, GTM and every app that sends data, with test orders and a ranked fix list, see the Tracking Audit.