GA4 Ecommerce Events — Purchase, Add_to_cart, and What's Between Them
Contents
GA4 ships with a ready-made set of e-commerce events (recommended events), but implementing them alone isn't enough — you need to understand exactly what each one measures and where it sits in the purchase path so that reports (Purchase journey, Monetization) actually make sense.
The Full E-commerce Event Path in GA4
GA4 defines a standard set of events covering the entire purchase path:
view_item_list— a product list (category, search results)select_item— clicking a product from a listview_item— landing on a product pageadd_to_cart— adding to cartview_cart— opening the cartbegin_checkout— starting checkoutadd_shipping_info/add_payment_info— filling in shipping/payment detailspurchase— completing the purchase
Every event should carry an items parameter (an array of products), plus currency and value wherever that makes financial sense.
purchase vs add_to_cart — Different Data Requirements
add_to_cart is an intent signal — a basic items array (id, name, price, quantity) is enough. Mistakes here are cosmetic — a wrong value will understate metrics, but it won't corrupt a transaction.
purchase is a financial transaction — GA4 additionally requires a unique transaction_id (otherwise you risk duplicated transactions when the confirmation page is refreshed) and a value that's consistent with the sum of items[].price * items[].quantity plus shipping/tax. A mismatch here means broken revenue data in every e-commerce report.
gtag('event', 'purchase', {
transaction_id: 'ORDER-12345', // unique, otherwise duplicates
value: 129.98,
currency: 'PLN',
shipping: 9.99,
items: [
{ item_id: 'DRESS-RED-M', item_name: 'Red Dress M', price: 119.99, quantity: 1 }
]
});The Most Common Mistake: dataLayer Populated Too Late
The classic problem with purchase via GTM: dataLayer.push() happens after the GA4 tag has already tried to read the variables. Result: the event fires, but without value or without items — a transaction that's "visible" but worthless in revenue reports.
Fix: dataLayer.push() must precede (or happen in the same event as) the GA4 purchase tag trigger — check the order in GTM Preview under the "Data Layer" tab.
What's Between add_to_cart and purchase — and Why It Matters
This is exactly the space where you lose the most conversions. The intermediate events (view_cart, begin_checkout, add_shipping_info, add_payment_info) let you build a precise funnel and see EXACTLY which checkout step people abandon at — without them, all you see is "something happens between cart and purchase," with no diagnosis.
If you only implement add_to_cart and purchase, skipping the intermediate steps, you have a black box instead of a funnel.
TL;DR
- Full path: view_item_list → select_item → view_item → add_to_cart → view_cart → begin_checkout → add_shipping/payment_info → purchase
purchaserequires a uniquetransaction_id— without it you risk duplicates on page refreshvaluein purchase must match the sum of items — a mismatch corrupts revenue data- Most common mistake: dataLayer.push() runs after the GA4 tag already read the variables
- Intermediate events (view_cart, begin_checkout, add_shipping/payment_info) are key to diagnosing where you lose conversions
Seeing the same issue in your GA4?
I'll review your setup as part of a GA4 audit. The first call is free.
Book a consultationMore articles about data analytics:
Back to blog