Skip to content
← All articles

Analytics & Tracking

Empty Ecommerce Events: When GA4 Records the Action but Not the Item

September 18, 2026 · 8 min read

Your GA4 property is counting purchases. Revenue for the month lands close enough to the figure in your order system that nobody has questioned it. Then someone opens the Items report to find the best selling product, and the table is either empty or every row reads (not set).

The events fired. What they carried is the problem. An ecommerce event that arrives without its items array tells GA4 that something was bought without telling it what, and that gap travels further than one empty report. It reaches your product funnel, your remarketing audiences, and the way Google Ads decides what a click is worth.

What does a complete ecommerce event actually contain?

Three parts, and most broken setups have the first one only.

The event name is the action: view_item, add_to_cart, begin_checkout, purchase and the rest of the recommended set. On its own it records that something happened.

The items array is what the action was about. Each entry describes one product, using item_id, item_name, price, quantity and optional fields like item_brand, item_category and item_variant. GA4 needs item_id or item_name to report a product at all, and downstream platforms need the ID specifically.

The event level parameters are currency and value, plus transaction_id on a purchase. value is the monetary worth of the event, currency is the ISO code it is denominated in, and transaction_id is what stops the same order being counted twice if the confirmation page is refreshed or reached again from an email.

Miss the second part and you get actions with no subject. Miss the third and you get subjects with no worth.

Why are my GA4 ecommerce reports empty?

The common causes are mundane, and none of them announce themselves.

The tag fires before the data exists. A GA4 event tag triggered on page view will run before a data layer push that happens later in the page lifecycle, so the tag finds nothing to read and sends the event bare.

The ecommerce object was never cleared. When one page pushes several ecommerce events, the old items array persists in the data layer and merges into the next push. Google's own guidance is to send dataLayer.push({ ecommerce: null }) immediately before each ecommerce push for exactly this reason. Skip it and later events inherit earlier products.

The tag is not configured to send the data. In Google Tag Manager, a GA4 event tag reads ecommerce data from the data layer only when you tell it to. The checkbox is easy to miss, and without it the tag sends a correctly named event with none of the payload underneath.

The values are the wrong type. price and quantity need to be numbers. Sent as strings, which a templating language will do quietly, they can be rejected or misread, and the revenue that depends on them goes with them.

currency is missing. If you set value without currency, GA4 has no way to know what the number means, and the revenue may not be reported. This is the single most common reason a purchase count looks right while the revenue column does not.

The platform is only half instrumented. Hosted carts ship some events by default and leave the rest to a theme or an app, so purchase works out of the box while view_item and add_to_cart were never wired at all.

How do I check what my events are really sending?

Look at the outgoing request, not at the tag configuration. A tag can look perfect and still send nothing useful.

Open GA4 DebugView, enable debug mode for your browser, and walk your own site: a category page, a product page, an add to cart, a checkout, a test order. Click each event as it arrives and read its parameters. DebugView shows you the items array as GA4 received it, which is the version that matters.

For a second opinion, open DevTools, go to the Network tab, tick Preserve log and filter for collect. Ecommerce items appear in the request as pr1, pr2 and so on, each packing the item's ID, name, price and quantity into one string. If those parameters are absent, the event left the browser empty regardless of what your container preview showed.

Then check the data layer itself in GTM preview mode. Select the event in the left hand timeline, open the Data Layer tab, and confirm the ecommerce object holds what you expect at the moment the tag fired. Comparing that against what DebugView received tells you whether the problem is upstream in the push or downstream in the tag.

Do this in a clean browser profile. Ad blockers and privacy extensions will block the requests you are trying to read.

What does missing item data actually cost?

The product funnel disappears first. Without view_item and add_to_cart carrying products, GA4 cannot calculate view to cart or cart to purchase rates per item, so you cannot tell a product nobody finds from a product people find and reject. Those are opposite problems with opposite fixes.

Dynamic remarketing stops being dynamic. Google Ads and Meta build their product ads by matching the IDs you send against the IDs in your Merchant Center feed or catalogue. If the ID is absent, or present in a different format than the feed uses, the audience still builds but the ads fall back to generic creative, and you pay a dynamic campaign's premium for a static result.

Bidding loses its sense of proportion. Value based strategies optimise toward the value you report. When every conversion arrives with no value, or with the same default value, a four figure order and a four dollar accessory look identical to the algorithm, and it will happily buy more of whichever is cheaper to win.

Merchandising goes back to guesswork. Which categories convert, which variants get abandoned, which price points stall at the cart: all of it lives in fields you are not sending.

Why does add to cart usually break first?

Because there is rarely one add to cart. There is the button on the product page, the quick add on a category listing, the quantity increment inside the cart, the reorder link in an account area, a subscription renewal, and a bundle that adds several items at once.

Each of those is a different piece of code. Teams instrument the obvious one, the product page button, confirm it works, and ship. The others stay silent, so the cart rate reads low for reasons nobody can find, because the denominator is whole and the numerator is partial.

Worth doing while you are in there: add a parameter recording which route the event came from. It costs one field and it turns an unexplained cart rate into a list of routes you can compare, which is also the fastest way to notice the day one of them stops reporting.

How do I fix it without rebuilding the site?

In order of what it costs you to leave broken.

Start with purchase, because revenue, bidding and attribution all read from it. Confirm it carries transaction_id, value, currency and a complete items array, and that the IDs match the ones in your product feed exactly, including any prefix the feed adds.

Then view_item and add_to_cart, which are what remarketing and the product funnel need. Instrument every route into the cart, not just the main one.

Then the middle of the funnel: begin_checkout, add_shipping_info, add_payment_info. These earn their place when you want to know which checkout step is losing people.

While you are there, clear the ecommerce object before every push, send numbers as numbers, and set currency on anything carrying a value. Then retest each route in DebugView, because a fix that was verified on the product page tells you nothing about the quick add on the listing.

FAQ

Why does my GA4 Items report show (not set)?

The events reached GA4 without a usable items array, so there is no product name or ID to group by. Either the data layer push happened after the tag fired, the ecommerce object was never populated, or the GA4 tag in Tag Manager is not set to read ecommerce data from the data layer. Open DebugView, click the event, and look at its parameters: if items is missing there, the problem is in the push or the tag, not in the report.

Do I need the items array on every ecommerce event?

On every event that is about a product, yes. view_item, add_to_cart, begin_checkout, purchase and the rest are only useful if GA4 knows which products they refer to, and the product funnel is built by matching items across those events. A few events, such as refund for a whole order, can be sent without items, but treating the array as optional elsewhere is what produces a funnel with actions in it and nothing to follow through it.

Why is my GA4 revenue different from my order system?

Usually one of four things. currency is missing so value is not being read. price and quantity are arriving as strings. The purchase event fires again when someone refreshes or revisits the confirmation page, and without a transaction_id GA4 cannot deduplicate it. Or the value you send includes tax and shipping while your order system reports net, which is a definition difference rather than a fault. Compare a handful of individual orders by transaction ID before assuming the tracking is wrong.

Yes, and it should. If a visitor declines analytics storage, GA4 with Consent Mode sends a cookieless signal rather than a full event, so those purchases are modelled instead of measured. That is working correctly, but it means a share of your ecommerce data is an estimate, and the share grows in regions with higher rejection rates. Check what your banner is actually blocking before concluding that events are broken.

How do I track more than one way of adding to cart?

Fire the same add_to_cart event from each route, with the same item fields, and add one extra parameter naming the route, such as product page, quick add, cart increment or reorder. Register it as a custom dimension in GA4. The cart rate then stays comparable across the site while remaining breakable down by route, which is what lets you see that one path has stopped reporting rather than that demand has fallen.

Want help with Conversion Tracking Setup & Implementation?

Accurate, deduplicated conversions wired into every platform you buy media on, so bidding optimizes toward revenue rather than noise.

More reading

Advanced Tracking

September 17, 2026 · 10 min read

Is Google Tag Manager Slowing Down Your Site?

PageSpeed Insights often blames Google Tag Manager, but the tags inside it are usually the weight. How to read the report, what to fix first, and what server-side tagging really changes.

Read article