GA4 for ecommerce measures a sale through a sequence of events that Google defines, from view_item to purchase, and revenue is only correct if the purchase event carries transaction_id, value, currency and the item list. The most common errors are a purchase counted twice, revenue at zero because currency is missing, and shipping added to the value. GA4 revenue never matches the store to the cent, but the difference has a known cause, and you can check it order by order with a spreadsheet.
This guide is about the online store. The general logic of events, automatic and custom, is in the guide to events in GA4, and how the layer that carries store data to Tag Manager works is covered in Data Layer.
The purchase events GA4 expects for ecommerce
Google describes, in the GA4 ecommerce guide, the actions a typical implementation measures, each with a fixed event name. Using the right name is what makes the monetization reports fill in on their own.
| Event | When it fires | What must be included |
|---|---|---|
| view_item_list | A product list appears (category, search) | items with the products shown |
| select_item | Click on a product in the list | items with the clicked product |
| view_item | Product page opens | items, value and currency |
| add_to_cart | Product goes to the cart | items with quantity |
| view_cart | Cart is opened | items for the whole cart |
| begin_checkout | Checkout starts | items, value, currency, coupon if any |
| add_shipping_info | Shipping method chosen | shipping_tier |
| add_payment_info | Payment method chosen | payment_type |
| purchase | Order completed | transaction_id, value, currency, items |
| refund | Order returned or refunded | transaction_id |
The items list accepts up to 200 elements per event, according to the same guide. Each item needs item_id or item_name, and ideally you send both, along with price and quantity.
It’s common for the events above to be right and the problem to be further down. The purchase event fires, but without one of the fields that make revenue show up correctly.
The purchase event and the errors that affect revenue
The purchase event is the only one that becomes revenue in GA4. Google’s event reference lists what it needs, and each missing field breaks something different.
Missing or empty transaction_id
The transaction_id is the order number. GA4 uses it to remove duplicate purchases. The Google Analytics help page on transaction IDs explains that two purchases with the same ID from the same user count as one. It also includes a warning that catches many stores: if the ID is sent as an empty string, GA4 treats every purchase that arrives that way as a duplicate and removes it.
Deduplication only works for web streams, not app streams.
Missing currency
Without the currency parameter, GA4 receives the value but doesn’t calculate revenue correctly. Every purchase needs currency with the three-letter code, BRL for the Brazilian real.
value with shipping or tax
Google’s reference says value is the sum of price times quantity for all items, without shipping and without tax. Shipping goes in shipping and tax goes in tax, separately. A store that sends the order total in value sees higher revenue in GA4 than the sum of its products, and the comparison with the platform gets skewed.
Purchase counted twice
This happens when two tags send the same purchase. The classic case is a store that uses the platform’s native integration and, years later, someone installs GA4 again through Google Tag Manager. Both fire. If both send the same transaction_id, GA4 holds the line. If one of them sends no ID, revenue doubles.
Purchase recorded before payment
With Pix and boleto (popular Brazilian payment methods), the thank-you page appears when the order is created, not when it’s paid. If purchase fires there, GA4 counts a boleto that was never paid as a sale. The store needs to decide what it wants to measure and put that in writing. For Google Ads, the ideal is to send only what was paid, which usually calls for an integration through the store’s server.
Why GA4 revenue doesn’t match the store
Even with GA4 fully set up for ecommerce, the report will show fewer orders than the platform. What matters is knowing where the difference comes from and whether it’s stable.
| What you see | Likely cause | How to check |
|---|---|---|
| GA4 with fewer orders, stable gap | Visitor who declined cookies or uses a blocker | Check consent and consent mode |
| GA4 with more revenue than the store | Shipping and tax inside value, or a duplicate purchase | Compare value with the items subtotal |
| GA4 with double the orders on some days | Two active purchase tags | Count how many tags fire on the thank-you page |
| Paid orders that never reach GA4 | Customer who paid and didn’t return to the thank-you page | List the missing IDs and check the payment method |
| Revenue in GA4 with no items | purchase without items | Open the event in debug mode |
Consent is the biggest cause today. People who decline cookies don’t show up in GA4 the same way, and the consent mode v2 guide explains what changes with and without it.
How to check that revenue matches, step by step
This is the GA4 ecommerce check we run on every store before touching campaigns. It doesn’t need a paid tool.
- Pick a closed period. The last 30 days, not including today.
- Export the store’s orders. Paid orders only, with order number, product subtotal, shipping and date.
- Open the purchases in GA4. In the ecommerce purchases report or in an exploration with the transaction ID dimension and the purchase revenue metric.
- Compare the total number of orders. Write down the difference as a percentage.
- Match the IDs. List the order numbers that are in the store but not in GA4, and the ones in GA4 but not in the store. The second group is the most revealing, because it points to duplicates, test orders or unpaid boletos.
- Compare revenue per order. If GA4 always shows a higher amount, shipping is inside value.
- Make a test purchase with debug mode on. Check in DebugView that purchase arrives only once, with the four fields. The Google Tag Assistant shows which tags fire on the thank-you page.
A small, stable difference that consent explains is normal. A difference that changes a lot from one week to the next is almost always a duplicate tag or purchase firing in the wrong place.
GA4 for ecommerce on each platform
Store platforms have their own way of sending events to GA4. On Shopify it’s the Google integration inside the platform, and on WooCommerce it’s usually a plugin. The problem starts when someone adds a second path on top of the first.
The rule is to pick a single path for purchase. If the platform’s native integration sends the complete events, Tag Manager is left for what it doesn’t cover. If it sends incomplete data, turn it off and do everything through Tag Manager with the store’s data layer. What you can’t do is leave both on and hope the transaction_id holds.
From GA4 to Google Ads
A store that advertises on Google needs the same sale reaching Google Ads, with the same value. There are two ways: the Google Ads conversion tag on the thank-you page, or importing the GA4 purchase. Choose one as the primary conversion. If both count the same sale, the campaign thinks it sells double and bids more than it should.
Enhanced conversions help recover part of the sales that the cookie loses. If you want to send only the paid order, or margin instead of revenue, the way to do it is an integration with the store’s system.
Frequently asked questions
What are the GA4 ecommerce events? They are view_item_list, select_item, view_item, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info, purchase and refund, plus view_promotion and select_promotion for internal banners.
Which parameters does the GA4 purchase event need? transaction_id, value, currency and items. The value is the sum of price times quantity of the items, without shipping and tax, which go in shipping and tax.
Why is GA4 revenue different from the store’s? Because of declined consent, ad blockers, a duplicate tag, shipping inside the value, or a purchase recorded before payment. The order-by-order check shows which of these causes is weighing in.
How do you connect GA4 to Shopify? Through the Google integration available in Shopify itself, which sends purchase events without code. Before installing Tag Manager on top of it, check that purchase won’t start firing twice.
Do you need a plugin for GA4 on WooCommerce? WooCommerce doesn’t send ecommerce events on its own, so you need a plugin or an implementation through Tag Manager. Use a single path for purchase.
Revenue measured from the ad to the paid order
Ciclicko’s conversion tracking sets up GA4 for ecommerce with the complete events, checks revenue order by order against the platform, and connects the paid sale to Google Ads, so the campaign optimizes for what actually reached your bank account. The work starts with the check described above, done on your store.