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
- 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.
- 2Sort by Purchases. A transaction ID with more than one purchase is a repeat GA4 did not remove.
- 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.
- 4In Shopify admin, open Settings > Customer events and list every app pixel and custom pixel that could send to GA4.
- 5Check your theme code and any Tag Manager container for a GA4 purchase event. Note which field each one uses for the transaction ID.
- 6Check the Google & YouTube channel's connection to GA4. Keep in mind that removing it stops all the events it sends, not only purchases.
- 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.
- 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.