Reading time: 10 min · Last updated: January 2026
A complete reference for GA4 e-commerce tracking. All events, parameters, and implementation examples in one place — copy-paste ready for your data layer.
Table of Contents
E-commerce Funnel Overview
GA4 tracks the complete shopping journey through these events:
“The most important events are view_item, add_to_cart, begin_checkout, and purchase — these populate GA4’s default Ecommerce purchases report.”
— Google Analytics Documentation
Product Discovery Events
view_item_list
Fire when a user sees a list of products (category page, search results, recommendations).
| Parameter | Type | Required | Example |
|---|---|---|---|
item_list_id |
string | No | “category_shoes” |
item_list_name |
string | No | “Running Shoes” |
items |
array | Yes | [{item_id, item_name, …}] |
select_item
Fire when a user clicks on a product from a list.
| Parameter | Type | Required | Example |
|---|---|---|---|
item_list_id |
string | No | “search_results” |
item_list_name |
string | No | “Search Results” |
items |
array | Yes | [{item_id, item_name, index}] |
view_item
Fire when a user views a product detail page.
| Parameter | Type | Required | Example |
|---|---|---|---|
currency |
string | Yes | “EUR” |
value |
number | Yes | 99.99 |
items |
array | Yes | [{item_id, item_name, price}] |
Cart Events
add_to_cart
Fire when a user adds a product to the shopping cart.
| Parameter | Type | Required | Example |
|---|---|---|---|
currency |
string | Yes | “EUR” |
value |
number | Yes | 99.99 |
items |
array | Yes | [{item_id, item_name, price, quantity}] |
Data Layer Example:
dataLayer.push({
event: "add_to_cart",
ecommerce: {
currency: "EUR",
value: 99.99,
items: [{
item_id: "SKU_12345",
item_name: "Running Shoes Pro",
price: 99.99,
quantity: 1,
item_brand: "SportBrand",
item_category: "Shoes",
item_category2: "Running"
}]
}
});
view_cart
Fire when a user views their shopping cart.
remove_from_cart
Fire when a user removes a product from the cart.
Both events use the same parameters as add_to_cart.
Checkout Events
begin_checkout
Fire when a user starts the checkout process.
| Parameter | Type | Required | Example |
|---|---|---|---|
currency |
string | Yes | “EUR” |
value |
number | Yes | 199.98 |
coupon |
string | No | “SUMMER20” |
items |
array | Yes | […] |
add_shipping_info
Fire when a user submits shipping information.
| Parameter | Type | Required | Example |
|---|---|---|---|
shipping_tier |
string | No | “Express” |
| + currency, value, coupon, items |
add_payment_info
Fire when a user submits payment information.
| Parameter | Type | Required | Example |
|---|---|---|---|
payment_type |
string | No | “Credit Card” |
| + currency, value, coupon, items |
Purchase & Refund
purchase
Fire when a transaction is completed. This is the most important e-commerce event.
| Parameter | Type | Required | Example |
|---|---|---|---|
transaction_id |
string | Yes | “ORD-2026-001234” |
currency |
string | Yes | “EUR” |
value |
number | Yes | 189.98 |
tax |
number | No | 36.10 |
shipping |
number | No | 5.99 |
coupon |
string | No | “SUMMER20” |
items |
array | Yes | […] |
Important: Each transaction_id must be unique. Duplicate IDs will be deduplicated in GA4 reports.
Data Layer Example:
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "ORD-2026-001234",
currency: "EUR",
value: 189.98,
tax: 36.10,
shipping: 5.99,
coupon: "SUMMER20",
items: [{
item_id: "SKU_12345",
item_name: "Running Shoes Pro",
price: 99.99,
quantity: 2,
item_brand: "SportBrand",
item_category: "Shoes"
}]
}
});
refund
Fire when an order is refunded (full or partial).
Uses the same parameters as purchase. For partial refunds, include only the refunded items in the items array.
Promotion Events
view_promotion
Fire when a promotion banner or block is displayed.
select_promotion
Fire when a user clicks on a promotion.
| Parameter | Type | Example |
|---|---|---|
promotion_id |
string | “summer_sale_2026” |
promotion_name |
string | “Summer Sale 20% Off” |
creative_name |
string | “Hero Banner Blue” |
creative_slot |
string | “homepage_hero” |
Items Array Reference
Every e-commerce event requires an items array. Here are all available item parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
item_id |
string | Yes* | SKU or product ID |
item_name |
string | Yes* | Product name |
price |
number | No | Unit price |
quantity |
number | No | Number of items |
item_brand |
string | No | Brand name |
item_category |
string | No | Primary category |
item_category2-5 |
string | No | Sub-categories (up to 5 levels) |
item_variant |
string | No | Size, color, etc. |
index |
number | No | Position in list |
discount |
number | No | Discount amount |
coupon |
string | No | Item-level coupon |
* Either item_id or item_name is required. Best practice: include both.
Validation Checklist
Before going live, verify your implementation:
| ☐ | Currency is consistent — same format across all events (EUR, not €) |
| ☐ | Values are numbers — not strings (“99.99” vs 99.99) |
| ☐ | Transaction IDs are unique — no duplicates across purchases |
| ☐ | Items array is present — even for single-product events |
| ☐ | item_id or item_name exists — at least one is required |
| ☐ | Events fire in correct order — view_item before add_to_cart before purchase |
| ☐ | No PII in parameters — no emails, names, or addresses |
| ☐ | Test in GA4 DebugView — verify events appear correctly |
Further Reading:
Written by
Lukas Meier
Product Analytics Specialist with 10 years of experience configuring tracking for e-commerce and SaaS products across Europe. Creator of EU-Medin.