The Complete GA4 Ecommerce Tracking Checklist
From view_item to purchase — every event, parameter, and validation step you need for accurate ecommerce reporting.
GA4 ecommerce tracking is deceptively simple on the surface — push a few events with an items array and you're done. In reality, most implementations we audit have at least 3 critical issues that silently corrupt revenue data, break funnel reports, and misattribute product performance. GA4 ecommerce is the highest-stakes area of your implementation because errors directly impact business decisions about products, marketing spend, and inventory.
This comprehensive checklist covers every event, required parameter, and validation step you need for accurate GA4 ecommerce reporting — from the first product impression to the completed purchase and beyond.
The Complete Event Flow
GA4 ecommerce uses a predefined set of events that map to a typical shopping funnel. For complete funnel reporting, you need these events firing in order:
view_item_list— Fires on product listing or category pages when products are displayed to the user. Captures which products were shown and in what order (list position).select_item— Fires when a user clicks on a product from a list. Captures which product was selected and from which list.view_item— Fires on the product detail page. This is one of the most important funnel events for measuring conversion rate by product.add_to_cart— Fires when a user adds a product to their shopping cart. Should include the exact quantity and variant information.remove_from_cart— Often overlooked but important for understanding cart abandonment behavior.view_cart— Fires when the user views their cart page. Include all items currently in the cart.begin_checkout— Fires when the checkout process begins. This marks the transition from browsing to buying intent.add_shipping_info— Fires when shipping information is provided. Include the shipping_tier parameter.add_payment_info— Fires when payment information is provided. Include the payment_type parameter.purchase— Fires when the order is completed. This is the most critical event — errors here directly affect revenue reporting.
You don't need to implement every event to get value from ecommerce tracking. At minimum, implement view_item, add_to_cart, begin_checkout, and purchase. These four events give you a functional conversion funnel.
The Items Array: Getting It Right
Every ecommerce event must include an items array containing the products involved. Each item object must have these required parameters:
item_id(required): Your product's unique identifier (SKU, product ID). Without this, product-level reports are empty.item_name(required): The product name as displayed to the user.price(recommended): The unit price as a number (not a string). Must be the individual item price, not the total.quantity(recommended): The number of units. Defaults to 1 if omitted.item_brand(optional): The brand or manufacturer name.item_category(optional): Primary product category. GA4 supports up to 5 category levels (item_categorythroughitem_category5).item_variant(optional): Product variant (size, color, etc.).discount(optional): Per-item discount amount.coupon(optional): Coupon code applied to this item.
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T-12345',
value: 99.98,
tax: 8.50,
shipping: 5.99,
currency: 'USD',
coupon: 'SUMMER10',
items: [{
item_id: 'SKU_001',
item_name: 'Blue Widget',
item_brand: 'Acme',
item_category: 'Widgets',
item_category2: 'Blue',
price: 49.99,
quantity: 2,
discount: 0
}]
}
});
The 5 Most Common Mistakes
-
Missing
item_id:Without
item_id, GA4's product-level reports (most popular products, product performance, etc.) are completely empty. This is the most common ecommerce tracking error and the easiest to miss because purchase events still fire — they just don't associate with specific products. -
Currency mismatches or missing currency:
Sending
value: 49.99withoutcurrency: 'USD'breaks revenue reports. GA4 requires thecurrencyparameter on every ecommerce event with a monetary value. If your site supports multiple currencies, ensure the currency matches the price values in theitemsarray. Mixed currencies in the same event will corrupt your revenue data. -
Duplicate purchases (missing
transaction_id):The
transaction_idmust be unique per order. If users refresh the thank-you page, re-open a confirmation email, or navigate back to the confirmation page, the purchase event fires again. Without a uniquetransaction_id, GA4 counts it as a new purchase, inflating your revenue. Always implement server-side deduplication or use a flag in session storage to prevent duplicate fires. -
Not clearing the ecommerce object:
As covered in our dataLayer guide, you must push
dataLayer.push({ ecommerce: null })before every ecommerce event. Without this clear step, GTM may merge old product data with new events, creating phantom products in your reports. -
Price as string instead of number:
Sending
price: "49.99"(string) instead ofprice: 49.99(number) causes GA4 to treat the value as text rather than a numeric value. Revenue calculations won't work, average order value will be zero, and product performance metrics will be empty.
Purchase Event Validation Checklist
Before going live with your purchase event, verify each of these items:
- ✅
transaction_idis unique per order and doesn't change on page refresh - ✅
valuematches the actual order total (including tax and shipping if applicable) - ✅
currencyis present and matches the price currency (ISO 4217 format: USD, EUR, GBP) - ✅ Each item has
item_idanditem_name - ✅
priceis a number, not a string - ✅
quantityreflects the actual quantity purchased - ✅
ecommerce: nullpush precedes the purchase push - ✅ The event only fires once per transaction (no duplicate fires on refresh)
- ✅ Tax and shipping are included if your reporting requires them
Refund Tracking
GA4 supports refund tracking through the refund event. This is critical for accurate revenue reporting — without refund tracking, your GA4 revenue will always be higher than actual revenue:
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'refund',
ecommerce: {
transaction_id: 'T-12345', // Must match original purchase
value: 49.99,
currency: 'USD',
items: [{
item_id: 'SKU_001',
quantity: 1
}]
}
});
Ecommerce Validation
NiceLookingData validates your ecommerce implementation against Google's recommended schema and flags missing required parameters, currency issues, duplicate transaction risks, string-vs-number type mismatches, and missing ecommerce clear steps.
Key Takeaways
- At minimum, implement
view_item,add_to_cart,begin_checkout, andpurchaseevents for a functional ecommerce funnel. - Every item must have
item_idanditem_name— without these, product-level reports are empty. - Always include
currency, use numeric values forprice, and ensuretransaction_idis unique per order. - Clear the ecommerce object (
ecommerce: null) before every ecommerce dataLayer push to prevent data bleeding between events. - Implement refund tracking to keep GA4 revenue aligned with actual business revenue.