TL;DR GA4 has no ecommerce switch to turn on. Ecommerce reports fill up when your site sends the recommended ecommerce events, from
view_itemtopurchase, with anitemsarray and the right parameters. Set them up through the dataLayer and GTM, or your platform's integration, check them in DebugView, and watch them after every release: most ecommerce data breaks quietly.

How to enable ecommerce in Google Analytics 4
Universal Analytics had an "Enable Ecommerce" setting. GA4 does not. A GA4 property shows ecommerce data as soon as it receives ecommerce events with product data, so enabling ecommerce means implementing those events:
- Create the property and a web data stream, and install the Google tag, directly or through Google Tag Manager. The GA4 setup guide covers this step.
- Choose how events reach GA4. Shopify, WooCommerce and most ecommerce platforms have an integration that sends the standard events for you. A custom store pushes them to the dataLayer and sends them with GTM.
- Push the ecommerce events to the dataLayer at each step of the funnel, with an
itemsarray (see the example below). - Send them to GA4. In GTM, a GA4 event tag per event, with the ecommerce option that reads the data from the dataLayer turned on.
- Validate in DebugView before publishing, then check the Monetization reports after 24 to 48 hours.
The GA4 ecommerce events
Google's ecommerce measurement guide lists the recommended events. The ones most stores need:
| Funnel step | Event | What it carries |
|---|---|---|
| Product list | view_item_list, select_item | The list and the products in it |
| Product page | view_item | The product viewed |
| Cart | add_to_cart, remove_from_cart, view_cart | The products and their quantity |
| Checkout | begin_checkout, add_shipping_info, add_payment_info | The cart, plus shipping tier and payment type |
| Order | purchase | transaction_id, value, currency, tax, shipping and the items |
| After the order | refund | The transaction_id of the order refunded |
| Promotions | view_promotion, select_promotion | The promotion and its creative |
Use the names exactly as Google writes them. A Purchase or an order_complete event is a custom event, and it never reaches the Monetization reports.
A purchase event, step by step
The site pushes the order to the dataLayer on the confirmation page:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null }); // clear the previous ecommerce object
window.dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "T-10482",
value: 129.90,
tax: 22.54,
shipping: 4.95,
currency: "EUR",
items: [{
item_id: "SKU-2231",
item_name: "Trail running shoes",
item_brand: "Example",
item_category: "Footwear",
price: 124.95,
quantity: 1
}]
}
});
Three rules prevent most revenue errors:
- Always send
currencywithvalue. Without it, GA4 cannot report the revenue. - Send a unique
transaction_id. It is how GA4 tells one order from another, and it helps avoid counting a purchase twice when the confirmation page reloads. - Send
item_idoritem_namefor every item, with the same IDs your product feed and your backend use, so product reports can be joined with them.
Where ecommerce data shows up in GA4
Once the events arrive, the Monetization section of Reports fills in:
- Ecommerce purchases: views, add-to-carts, purchases and item revenue per product.
- Purchase journey and checkout journey: where shoppers drop off between product page, cart, checkout and purchase.
- Transactions: each order with its ID and revenue, the report to compare with the backend.
For questions the standard reports do not answer, such as revenue by landing page for organic traffic, build an exploration: GA4 custom reports explains how.
How to check that ecommerce tracking is right

Before release, go through the funnel in GTM preview mode and open DebugView in GA4: each event should appear once, with its parameters and items. After release, compare GA4 with the source of truth for orders, your backend:
- Purchases and revenue in the Transactions report against the orders in the backend for the same days. A gap of a few percent is normal (ad blockers, consent); a sudden change is not.
- Duplicate transactions: the same
transaction_idmore than once. - Revenue in the wrong currency or with
valuesent as text. - Events missing on one platform: the app, a payment provider that redirects, a new checkout template.
The last check is the one a one-time setup misses. A release renames a dataLayer key, a checkout redesign drops the purchase push, a consent change blocks the tag on one market, and the reports keep rendering with less revenue in them. Trackingplan watches the ecommerce events on real traffic, learns their normal volumes and properties, and alerts the team that owns them when a purchase loses its currency, its items or its volume. For the checks to run on every conversion, see how to validate conversion tracking.
Using the data

With the events in place, the reports answer the questions stores ask most:
- Where the funnel leaks. The checkout journey shows the step with the biggest drop; a drop that appears overnight is more often a tracking break than a change in shoppers.
- Which products sell and which only get viewed. Item views against add-to-carts and purchases, per product and per list.
- Which channels bring revenue, not just sessions. Revenue and purchases by session source and medium, with attribution settings agreed before anyone reads them. More in customer journey analysis for ecommerce in GA4.
- What mobile shoppers do differently. The same funnel split by device category.
Frequently asked questions
How do I enable ecommerce in Google Analytics 4?
There is no setting to turn on. Send the recommended ecommerce events, such as view_item, add_to_cart, begin_checkout and purchase, with an items array, and GA4 fills the Monetization reports. Platform integrations (Shopify, WooCommerce) or a dataLayer with Google Tag Manager are the usual ways.
Why does GA4 show purchases but no revenue?
Usually because the purchase event has no currency, or value is sent as text. GA4 needs both a numeric value and a currency code to report revenue.
Why don't GA4 transactions match my backend?
Some gap is normal: ad blockers, declined consent and payment redirects that never return to the site. A large or sudden gap points to a tracking problem, such as a missing purchase on one template, duplicated transactions, or a new checkout that stopped pushing the event.