folder_open Analytics & Attribution

Shopify upsells missing from GA4 revenue: how to fix it

Martin Marinov Martin Marinov
10 min read
Topics shopifyga4ecommerce-trackingpost-purchase-upsellsconversion-tracking

Post-purchase upsells on Shopify often never show up in GA4 purchase revenue, even when the order count looks about the same. Shopify can show a solid week while GA4 comes in lower, and the missing amount is usually the upsell.

A while back you added a post-purchase upsell app. Customers take the one-click offer after they pay, and those add-ons show up in your Shopify orders. GA4 never seems to pick them up. If that sounds familiar, the problem is usually Shopify GA4 post-purchase upsell tracking. Your ads and your store are probably fine.

Below we explain why it happens, how to check your own store, and how to get upsell revenue into GA4 so the two reports finally line up.

Why the GA4 purchase event fires before the upsell

On a normal Shopify checkout, the customer pays and lands on the thank-you page. Then the GA4 purchase event fires with the order total.

A post-purchase upsell adds a step. After payment and before the thank-you page, Shopify shows an offer page run by your upsell app. Shopify’s documentation says that when a store has a post-purchase page, the checkout completed event fires on that first upsell page instead of the thank-you page.

That timing causes the gap. Most GA4 setups on Shopify send the purchase event when checkout completes. That includes the Google & YouTube app and most custom pixels. At that moment the customer hasn’t seen the offer yet, so the event carries only the original order total.

Say a customer buys a jacket on Saturday night. The purchase event goes to GA4 with the jacket price. Then they accept a matching beanie on the offer page. Shopify adds the beanie to the same order, so your Shopify order total goes up. GA4 already has its purchase event, and nothing sends it the extra amount.

Repeat that for every accepted upsell and you get a steady Shopify GA4 revenue mismatch. The better your upsell offers do, the bigger it gets.

Why you can’t just send the purchase event again

The obvious fix is to fire a second purchase event with the new order total. Don’t. GA4 removes duplicate purchase events that share a transaction ID. If your app resends a purchase with the original order number, GA4 will usually drop it, and you’ll still be short.

How to confirm the upsell gap in your own store

Before you change anything, make sure upsells are the cause. Other things also make GA4 and Shopify disagree, and you don’t want to fix the wrong one.

Pick a recent week and do this:

  • In Shopify, find orders where the customer accepted a post-purchase offer. Most upsell apps have a report of accepted offers, and the order timeline shows the added items too.
  • In GA4, build an exploration for the same dates with transaction ID as the dimension and purchase revenue as the metric.
  • Look up a few of those upsell orders by order number and compare the amounts.

If GA4 shows the original amount, Shopify shows a higher total, and the difference equals the upsell item, you’ve found the problem. If the whole order is missing from GA4, that’s a different tracking problem. We cover it further down.

Shopify GA4 post-purchase upsell tracking: sending the upsell as its own event

The clean fix is to leave the original purchase alone and record the upsell as its own event with its own value. Upsell revenue then shows up in GA4, and you can report on upsells separately.

There are two reasonable ways to do this.

Option A: a second purchase event with a separate transaction ID. When a customer accepts an upsell, send a purchase event with an ID such as the order number plus “-upsell”. GA4 won’t treat it as a duplicate because the ID is different, so the amount flows into your standard revenue reports. Add a custom parameter that marks it as an upsell so you can filter it out when you only want first purchases.

Option B: a custom upsell event. Send an event named something like upsell_accepted, with a value and currency, and mark it as a key event. Your purchase count stays clean. The catch is that upsell revenue won’t appear in the standard ecommerce reports, so you have to add it in yourself.

For most store owners we recommend Option A. You get total revenue in one place, and comparing with Shopify is straightforward.

Where the upsell event should come from

Browser tracking on the upsell page can be unreliable. These two sources work well:

  1. Your upsell app’s own tracking settings. Some apps can send an event to GA4 or the data layer when a customer accepts an offer. Ask their support what they send, what value they use, and whether the ID is different from the original order.
  2. Your server, using Shopify order data. Your developer can listen for Shopify’s order update and orders/edited webhooks, find the added upsell items, and send the event to GA4 through the Measurement Protocol. Capture the shopper’s GA4 client_id, and ideally the session_id, at checkout, for example in a cart attribute or order note attributes, and send them with the hit. Otherwise GA4 counts the upsell as a new user and files the revenue under Unassigned or Direct. Also pass the shopper’s consent state along with the order, for example from the Customer Privacy API or a stored consent flag. Only send the event when that consent or opt-out status allows analytics tracking.

The server option takes more setup, but it’s usually the more dependable choice once upsells are a regular part of your sales.

Steps for you or your web person

  1. List every app and pixel that sends a GA4 purchase event today: the Google & YouTube app, custom pixels under Customer events in Shopify settings, Google Tag Manager, and the upsell app. Only one of them should send the original purchase.
  2. Place a test order and confirm in GA4 DebugView that the purchase event fires once, with the right order number and the original total.
  3. Choose Option A or B. Write down the event name, the transaction ID format, and the parameters.
  4. Set up the upsell event in the upsell app or through a server-side webhook. Include the value, USD as the currency, the items, and the original order number as a parameter.
  5. Place another test order, accept the upsell, and confirm in DebugView that a second event arrives with the upsell amount and a different transaction ID.
  6. If you chose Option B, mark the custom event as a key event in GA4 admin.
  7. Decide whether Google Ads and Meta should count upsell value too, because they usually miss it in the same way.

If you’d rather have someone build and test this for you, our GA4 event configuration service for ecommerce stores covers this kind of setup.

Reconciling GA4 with Shopify orders each month

Tracking upsells closes the biggest gap. GA4 and Shopify still won’t match to the cent, and they don’t need to. You want a gap you understand that stays about the same from month to month.

Once a month, run this routine:

  • Export the month’s orders from Shopify, with order number and total.
  • Export transaction ID and purchase revenue from a GA4 exploration for the same dates.
  • Match the two lists on order number in a spreadsheet. Each “-upsell” row should match back to its original order.
  • Sort whatever doesn’t match into three groups: in Shopify but not GA4, in both with different amounts, and in GA4 but not Shopify.

Each group has its own usual cause. Orders missing from GA4 usually mean lost tracking. Different amounts usually come from upsells, discounts, shipping or taxes. Orders in GA4 but not Shopify often turn out to be test orders or duplicate tags.

Before you start, check the time zone setting in both tools. If they’re different, late-night orders land on different days and your weekly totals won’t line up even when tracking is fine.

Other causes of a Shopify GA4 revenue mismatch to rule out

If upsells don’t explain the whole gap, look here next:

  • Shipping and tax. Shopify reports often include them, and your GA4 purchase value may not. Make sure both sides use the same definition before you compare.
  • Refunds and cancellations. Shopify adjusts for them. GA4 only knows about a refund if something sends it a refund event.
  • Blocked tracking. Ad blockers, browser privacy settings and declined cookie banners keep some purchase events from reaching GA4. Server-side tracking reduces loss from ad blockers and closed tabs, but it must still respect each shopper’s consent and opt-out choices. Don’t use it to send data for visitors who declined tracking.
  • Orders placed outside the storefront. Draft orders, wholesale orders and in-person sales show up in Shopify but never fire a browser purchase event.
  • Duplicate tags. When two apps both send purchase events, GA4 revenue goes up, and that extra can hide an upsell gap.

Inconsistent campaign tags also put revenue under the wrong channel. Our free UTM link builder helps keep email and social links consistent. If your ad accounts are bidding on order values that leave out upsells, check your Meta Ads conversion tracking while you’re at it.

Frequently asked questions

Does the Shopify Google & YouTube app track post-purchase upsells in GA4?

Don’t count on it. The app sends the purchase event when checkout completes, and on stores with a post-purchase page, that happens before the customer sees the offer. Plan for a separate upsell event from your upsell app or your server.

Will a separate upsell event double count my orders in GA4?

With Option A, each upsell counts as an extra transaction in your purchase count. That’s why we add a parameter that marks upsells, so you can filter them out when you need a true order count. Revenue is correct either way.

Why does Shopify show the upsell inside the original order but GA4 doesn’t?

When a customer accepts the offer, Shopify edits the existing order and updates its total. GA4 got its purchase event earlier with the old total, and it won’t learn about later changes to the order unless you send them.

Should my upsell revenue count as a conversion in Google Ads and Meta?

Usually, yes, if you want bidding to favor customers who spend more. Google Ads supports conversion value adjustments, so you can add the upsell amount to the original conversion. Meta can’t change the value of a Purchase it has already received. There, you can send a separate custom event such as UpsellAccepted with a value, or accept an extra Purchase. Don’t reuse the original event_id, or Meta will deduplicate the upsell and drop it.

Is a small gap between GA4 and Shopify revenue normal after the fix?

Yes. Blocked tracking, refunds, and shipping and tax differences mean the numbers rarely match exactly. What matters is that you can explain the gap and it stays steady from month to month.

Your next step

This week, pick five recent orders where the customer accepted a post-purchase offer. Look up each order number in a GA4 exploration and check whether the upsell amount is there. That will tell you whether GA4 is undercounting your revenue.

If the numbers still don’t add up and you’d like us to look at your tracking, Call us+1 (415) 420-4059 or start with our free marketing audit.