How item-scoped dimensions work
Ecommerce events in GA4 do not carry a single product; they carry a list of them. A view of a category page, an add to basket, a checkout step and a purchase all send an array in which each entry is one product line, with its own identifier, name, brand, category, variant, price and quantity. Anything that lives on one of those entries is item-scoped.
The scope matters because it sits below the event. The event knows the order value and the currency; the item knows which trainers, in which size, at which price. When GA4 builds its product reports it reads the item array, which is why a badly formed array produces empty or duplicated product rows even though the purchase total is correct.
You can also register your own item-scoped custom dimensions, taking values from parameters you add to each entry — supplier, fabric, delivery class, whether the line was discounted.
Why item scope matters
It is the only scope that answers merchandising questions. Which products are viewed but never added, which categories carry the revenue, which variant sizes sell out of proportion to their stock — none of that can be recovered from event or session data, because those levels only ever saw a total.
It also feeds the systems outside analytics. Product identifiers sent at item scope are what let audiences, catalogue campaigns and dynamic ads match a viewer to the specific thing they looked at, so a mismatch between your feed and your ecommerce tracking quietly weakens remarketing as well as reporting.
Common mistakes with item scope
The commonest is inconsistency across the funnel. If a product is sent with one identifier on the product page and another at purchase, GA4 treats them as two different items and the journey from view to sale falls apart. The identifier has to match the one in your product feed as well, character for character.
Next is missing fields. Sending an item without a name, or without a price, leaves gaps that show up as blank rows rather than as an error, so nobody notices until a report is questioned. Free text is a related trap: category values typed by hand drift into near-duplicates that split the same product group across several rows.
Finally, item-scoped values cannot be mixed freely with session-scoped ones. A table that puts product name next to traffic source is asking GA4 to spread a visit-level label across product lines it never described.
How to act on it
Treat the item array as a contract between the website and the analytics account, and write it down before anyone touches code: the exact parameter names, which are mandatory, and where each value comes from. Take the identifier from the same field your product feed uses, and generate the array from your store’s data rather than from what happens to be on the page.
Then test the whole path — product view, add to basket, checkout, purchase — on a real order and confirm the same item appears with the same identifier at each step. This is fiddly work, and it is usually the part of a GA4 implementation worth doing carefully once rather than repairing later.