Why it happens
A tag sends the purchase without a transaction ID. The transaction ID is a field of the purchase event that the sender fills in. A theme snippet, a tag manager tag or an app can send a purchase event and leave the field out, or fill it with a variable that is empty on that page. GA4 then reports the purchase and shows "(not set)" in the Transaction ID dimension.
The same purchase arrives from two senders with different IDs. Google uses the transaction ID to avoid counting one purchase twice. When one sender uses the order number and another uses a different value, or one leaves it empty, GA4 sees two purchases. The total looks too high, and single rows cannot be matched to orders.
Revenue counts but the source is missing. A purchase sent from a server without the shopper's browser ID can still carry revenue, yet GA4 cannot tell where the buyer came from. That shows as "(not set)" in source and medium, which is a different gap from the transaction ID, and the two are easy to confuse in one report.
Check it yourself
- 1In GA4, open Reports > Monetization > Ecommerce purchases. Set the date range to the last 7 full days.
- 2Open Admin > Property details and note the time zone. Compare the same days in Shopify admin > Analytics > Reports, which uses your store's time zone.
- 3Open Explore and start a Free form exploration. Add the dimension Transaction ID and the metrics Purchases and Purchase revenue.
- 4Sort by Transaction ID. A row with "(not set)" is a purchase sent without the ID. A value that appears twice is a duplicate.
- 5In Shopify admin, open Orders and filter by Sales channel. Compare the Shopify order numbers with the IDs in Explore. Note which orders are missing and which are extra.
- 6List every tag that sends purchases to GA4: your theme code, Google Tag Manager, a custom pixel under Shopify admin > Settings > Customer events, and any app. Open each one's purchase event and check that the transaction ID is filled.
- 7Keep one sender for purchases, or make every sender use the same value as the transaction ID, for example the order number.
- 8After the fix, place a test order and watch it in the GA4 Realtime report and then in Explore the next day. Standard reports can take longer than Realtime to show it.
Why each purchase needs one sender and one ID is in one sender per purchase on Shopify.
FAQ
What does (not set) mean in GA4?
GA4 received no value for that dimension on that row. For Transaction ID it means the purchase event came without the ID.
Do purchases without a transaction ID still count as revenue?
They can. The purchase and its revenue are counted, but you cannot match the row to an order, and a repeat of the same sale cannot be recognized.
Why do I see the same transaction ID twice?
A purchase was recorded twice, for example because the confirmation page loaded again or two tags fired. Check each sender and the page where it fires.
Is (not set) in source and medium the same problem?
No. That one is about where the buyer came from, and it does not depend on the transaction ID.