BLOG · 19 OCTOBER 2026

GA4 duplicate purchases on Shopify: why one order counts twice

GA4 shows more purchases or more revenue than your Shopify orders, or the same transaction ID twice in a report. The sale happened once. Somewhere a second purchase event reached GA4, and GA4 could not tell that it was the same order.

To fix it you need to know how GA4 recognises a repeat, and which tools on a Shopify store can send a second copy.

How GA4 spots a repeat

Google's help on measuring ecommerce says Google Analytics deduplicates purchase events with the same transaction ID. Three details in that page decide whether it works for you:

  • The same user. Google says it removes repeats with the same transaction ID from the same user. Two copies of one order that arrive with different client IDs may both be counted.
  • Web streams only. Google says this deduplication works for data collected through web streams, not app streams.
  • The ID must be real and unique. Google warns against sending an empty transaction ID, because all purchases with an empty value are then treated as one. Sending the same ID for different orders undercounts.

So GA4 can remove a repeat only when both copies carry the same transaction ID and look like the same visitor. Most duplicates on Shopify break one of those two conditions.

Where the second copy comes from

Two tags send purchases. The most common case. The Google & YouTube sales channel sends purchases to GA4, and a Google Tag Manager container, a custom pixel or theme code sends them too. Each tag may fill the transaction ID differently. One uses the order number with its # sign, another the long order ID. GA4 sees two different IDs and counts both.

A browser tag and a server connection. A server can send the same order through GA4's Measurement Protocol. If it uses the same transaction ID but a different client ID, for example because it did not have the visitor's ID, GA4 may treat it as a different user and keep both.

The order page fires again. Old purchase code that runs on every load of the confirmation or order status page sends the purchase again when the customer comes back from the order email. With the same transaction ID and the same browser, GA4 should remove it. Code that builds a new ID each time defeats that.

Two GA4 tags on one property. A store that added the Google tag in the theme and again through an app may send each event twice, purchases included.

Test and real orders mixed. A test order with a real looking ID, sent during setup, can stay in the reports and look like an extra sale.

Check it yourself

  1. 1In GA4, open Explore and start a Free form exploration. Add the dimension Transaction ID and the metrics Purchases and Purchase revenue. Use the last 7 full days.
  2. 2Sort by Purchases. A transaction ID with more than one purchase is a repeat GA4 did not remove.
  3. 3Look at the IDs. If the same order shows up once as a short number and once as a long ID, two tags fill the field differently.
  4. 4In Shopify admin, open Settings > Customer events and list every app pixel and custom pixel that could send to GA4.
  5. 5Check your theme code and any Tag Manager container for a GA4 purchase event. Note which field each one uses for the transaction ID.
  6. 6Check the Google & YouTube channel's connection to GA4. Keep in mind that removing it stops all the events it sends, not only purchases.
  7. 7Compare GA4's purchase count with your paid online orders for the same days, in the same time zone. GA4 uses the property's time zone, set under Admin > Property details.
  8. 8After a fix, place a test order and watch it arrive once in the Realtime report. Standard reports can take longer to show it.

How to fix it

Keep one sender for purchases per GA4 property where you can. If you need two, make both send the same transaction ID, in the same format, for example the Shopify order ID, and make sure a server copy carries the visitor's client ID when it has one.

If the extra sender is a tag you control, in Tag Manager, a custom pixel or theme code, remove only its purchase event and keep its page views and other events. Those events give GA4 your traffic sources, so removing the whole tag usually costs more than it fixes.

The rule behind it all is one sender per purchase on Shopify.

FAQ

Will GA4 remove the duplicates from past reports?

Google's page describes the deduplication of purchase events as they come in. It does not say that past data is corrected after you fix a tag, so expect the old days to stay as they are.

Is a duplicate the same as "(not set)" in Transaction ID?

No. "(not set)" means a purchase arrived without any transaction ID. Google's rule compares transaction IDs, so a purchase without one has nothing to match on, and it often comes together with duplicates.

Why does revenue look right but the purchase count is too high?

Some duplicates carry a value of zero or a different value. Look at Purchases and Purchase revenue per transaction ID side by side.

Can I use the order number as the transaction ID?

Yes, if every sender uses the same value for the same order. What matters is that it is unique per order and identical across senders.

Where Tikra fits

Tikra sends each paid online order to GA4 as one purchase event, with the Shopify order ID as the transaction ID. When Tikra's pixel read the buyer's Google Analytics client ID and session ID with analytics consent, they go with the purchase. Without them, Tikra uses an ID made for the order: the revenue counts, but GA4 cannot show where the buyer came from.

Because Tikra cannot read GA4's own count, the Google Analytics 4 card asks you to confirm that the store's own GA4 purchase tracking is off before GA4 gets any order from Tikra. If your Google Analytics tag runs in Tag Manager, a custom pixel or your theme code, you remove only its purchase event there and keep the other events. Google gives no confirmation per order, so Tikra shows its GA4 orders as sent and asks you to look for the next order in Realtime.

Tikra applies your customers' consent choices to every order. In Strict mode an order is sent to GA4 only when the buyer allowed analytics. A written guarantee in our Terms covers eligible orders: at least 97 % reach each platform, fixed within 12 hours or a month's fee credited (Terms of Service, section 8).

The free diagnosis does not read GA4. It shows your paid orders of the last 7 full days, how many came from a Meta, Google or TikTok ad, and, after a full day and 10 paid online orders, how many your shoppers' browsers reported. It sends none of your orders anywhere.

Run the free diagnosis

Related

Problem

GA4 shows fewer purchases than Shopify

GA4 reports fewer purchases or less revenue than your Shopify admin. Why browser tracking loses orders and how to compare transaction IDs in Explore.

Problem

GA4 purchases with no transaction ID or "(not set)"

GA4 shows purchases with no transaction ID or (not set). Why it happens on Shopify and how to find the purchases in Explore and fix the sender.

Problem

Purchases show up days later in Meta Ads Manager or GA4

Why Meta Ads Manager or GA4 shows a purchase days after the order: attribution windows, processing time and late server events. How to compare fairly.

Problem

Purchases counted twice after you switched tracking apps

Meta or GA4 counts more purchases than Shopify since you changed tracking apps. Where the old app's pixel, server connection or theme code keeps sending, and how to find it.

All tracking problems · All guides