Browse Analytics
Products explore
The Products explore has one row for every item of an ecommerce action, with the product it is. What it covers, what to know when reading it, and every dimension and metric in it.
The Products explore has one row for every item of an ecommerce action: a product listed, selected, viewed, added to the cart or taken out of it, checked out, bought or refunded, each with the product it is. It reads your organisation's own item lists and, for a store that captures purchases, Kontala's Shopify pixel's lines, so you have it whenever you have the Items explore. It comes with the Products: what sells? dashboard.
Good to know
- An item's Action is what its row says. A pushed event counts by its name, as GA4, Universal Analytics, Segment and the Meta Pixel name theirs; a page's own list by its page type, so a Product detail page is a view of its first item and a Cart page a view in the cart; and a Shopify line by the list the pixel reported it in.
- A purchase's lines count once. An order is named by its Order transaction ID, a Shopify order's own id, or else its page view, and only its first report counts (Counted), so a reloaded thank-you page, or an order reported by two tools, adds nothing where the order has an id. Every refund counts.
- A product's attributes, such as Brand, Category and Latest price, are what its items last carried.
Used on dashboards
Charts on these dashboards are built on the Products explore:
- Products: what sells?: Products and Categories and lists
Dimensions
The Products explore has 47 dimensions.
The product
| Dimension | Type | Description |
|---|---|---|
| Product | String | The product's name as the store calls it: the title Kontala's Shopify pixel last reported for it, which is the store's own, untranslated, else the latest name any of its items carried, else its Product key. Products of one name are one row here, as a Shopify product's variants are: Product key tells them apart. |
| Product key | String | What the product is known by: its standard Item ID, else its Item SKU, else the id its list names, else its name, written name: and in lower case. Items with the same key are one product in every list and every tool, so a product a data layer lists by its variant's id is the line Kontala's Shopify pixel reports by that id. |
| Known by | String | Which of Product key's sources the product's latest item was known by: Item ID, SKU, List ID, the id its list names, or Name, an item that named no id at all. |
| Item ID | String | The standard field Item ID the product's items last carried: for a Shopify line, its variant's id. |
| SKU | String | The standard field Item SKU the product's items last carried. |
| Product group ID | String | The standard field Item group ID the product's items last carried: the product a variant is of, for a Shopify line Shopify's own product id, which groups a product's sizes and colours. |
| Brand | String | The brand the product's items last carried: the standard field Item brand, for a Shopify line its vendor. |
| Category | String | The category the product's items last carried: the standard field Item category, for a Shopify line its product type. |
| Category 2 | String | The standard field Item category 2 the product's items last carried: the level of a category tree below Category. |
| Category 3 | String | The standard field Item category 3 the product's items last carried: the level below Category 2. |
| Category 4 | String | The standard field Item category 4 the product's items last carried: the level below Category 3. |
| Category 5 | String | The standard field Item category 5 the product's items last carried: the level below Category 4. |
| Variant | String | The variant the product's items last carried: the standard field Item variant, for a Shopify line its variant's title. |
| Colour | String | The colour the product's items last carried. |
| Size | String | The size the product's items last carried. |
| Latest price | Number | The unit price the product's items last carried in a currency something states, else the last they carried at all, in Latest price currency. |
| Latest price currency | String | The currency of Latest price. |
| First seen | Timestamp | When the product's first item was, in the window of events kept: a product seen before it was first seen when its oldest item kept was. Time intervals: Day, Week, Month. |
| Last seen | Timestamp | When the product's latest item was. Time intervals: Day, Week, Month. |
The item
| Dimension | Type | Description |
|---|---|---|
| Action | String | What the visitor did with the product: Viewed in a list, Selected from a list, Viewed, Added to wishlist, Added to cart, Removed from cart, Viewed in cart, Checked out, Shipping chosen, Payment chosen, Purchased or Refunded. A pushed event says it by its name, a page's own list by its page type, and a Shopify line by the list Kontala's Shopify pixel reported it in. |
| Action step | Number | Where the action falls on the way from a list to an order, from 1 for Viewed in a list to 12 for Refunded, to sort Action by. |
| Item list | String | Which of the organisation's item lists the item came from, by the name it was given when the list was mapped, or which of a Shopify store's lists Kontala's Shopify pixel reported it in. |
| Position | Number | The item's position in its list, counting from 0. |
| List name | String | The list the site showed the product in, such as Related products or Search results: the standard field Item list name where the item names one, else the standard field List name of the event or page it came in, as GA4 gives an event's list to every item that names none of its own. |
| Coupon | String | The standard field Item coupon: a coupon applied to the item itself. |
| Price | Number | The unit price the item stated, the standard field Item price where the list fills it, in Currency. |
| Quantity | Number | The quantity the item stated, the standard field Item quantity where the list fills it. Empty where it states none, which the metrics count as one. |
| Currency | String | The currency the item's price is in: its own standard field Item currency where its list fills it, else the cart's, checkout's or order's as Kontala's Shopify pixel reported it, else the standard field Order currency on the row the item came from. Group by it before reading a sum: amounts in two currencies do not add up. |
| Counted | Boolean | Whether the item counts toward its action's totals: every item does but a purchase's, whose lines count in its first report alone, so a reloaded thank-you page, or an order reported by two tools, adds nothing where the order is named by an id; one named by its page view alone counts again when the page is reloaded, as in the Visits explore. |
Time
| Dimension | Type | Description |
|---|---|---|
| Event time | Timestamp | When the event happened, by the visitor's device, kept between 30 days before and 24 hours after Kontala received it. The default time axis. Time intervals: Raw, Hour, Day, Week, Month, Quarter, Year, Hour of day (number), Day of the week (index), Day of the week (name). |
Page
| Dimension | Type | Description |
|---|---|---|
| Hostname | String | The host the page was served from. One visitor can move between subdomains, so use Site, not Hostname, to tell your properties apart. |
| Path | String | Decoded and redacted. High-signal segments are replaced with |
| Section | String | The path's first segment, such as /blog or /products; / for the home page. |
| Subsection | String | The path's first two segments, such as /blog/2026. Empty for a path with fewer than two. |
Attribution carried across the visit
| Dimension | Type | Description |
|---|---|---|
| Channel | String | How this visit arrived, from its first page view: the click id, the campaign medium and the referrer, in that order of trust. Every page view of a visit reads the same channel. Organic Search is a link from the host a search engine serves its results on, such as www.google.co.uk, so a link from Gmail, Google's sign-in or Google's other products reads as any other site's does. A click id says which network, not that the visit was paid: Meta adds fbclid to organic posts and shares as well as ads, so a Meta ad reads Paid Social only when its link carries a paid utm_medium such as cpc or paid_social, and Google's srsltid, on free product listings and organic results, reads Organic Search. Other Campaign is a tagged visit no other rule places, display ads' dclid included. AI Assistants is a visit an AI assistant sent: a link from ChatGPT, Perplexity, Gemini, Copilot, Claude, DeepSeek or Grok, known by its referrer or by ChatGPT's own utm_source=chatgpt.com, its shopping cards included, or any link tagged utm_medium=ai-assistant. An ad shown in an assistant stays paid, a ChatGPT ad by the oppref OpenAI appends to it, which reads Paid Search, and a link an assistant's app opens with no referrer and no tag reads Direct. Direct means no referrer at all, which covers an app and an https-to-http hop rather than only a typed URL. Internal is a visit that began from a page on this same site. Empty for a visit with no page view. |
| Session campaign source | String | The campaign source that started this visit, carried onto every page view in it. This is the dimension to group by for acquisition; Campaign source answers the narrower question of which page view physically carried the parameter. |
| Session campaign medium | String | The campaign medium that started this visit, carried onto every page view in it. |
| Session campaign | String | The campaign that started this visit, carried onto every page view in it. |
Geo
| Dimension | Type | Description |
|---|---|---|
| Country | String | The visitor's country as a two-letter code, such as GB, from their IP address. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| Country name | String | The country's name in English, as the Unicode CLDR gives it, read from Country's code; a code CLDR does not name reads as itself. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| Continent | String | One of seven continents, read from Country by the UN's regions: North America includes Central America and the Caribbean. Russia is Europe; Turkey, Cyprus, Georgia, Armenia and Azerbaijan are Asia, as the UN files them. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
Browser environment
| Dimension | Type | Description |
|---|---|---|
| Device class | String | Bucketed from window width, not from the User-Agent. A narrow desktop window reads as mobile, which is the honest answer for a layout question; Device type answers the hardware one. |
Browser, operating system and device
| Dimension | Type | Description |
|---|---|---|
| Device type | String | Desktop, mobile, tablet or smart tv, from the User-Agent header, and unknown where it names no platform: the hardware, where Device class is the layout the window's width gives. A tablet asking for desktop sites, as Safari on iPad does by default, reads as desktop. |
| Browser | String | The browser, from the User-Agent header. A browser built on Chromium that does not name itself there, such as Brave, Arc or a desktop app, reads as Chrome. A page opened inside an app reads as the app where it names itself, such as Instagram or the Google app, and as In-app browser where it does not. An app's own screens, from Kontala's SDK, read as App. |
| Operating system | String | The operating system, from the User-Agent header; iOS includes iPadOS. There is no version beside it, because browsers freeze theirs: Windows 11 reports Windows 10 and every Mac reports macOS 10.15. An iPad asking for desktop sites, as Safari on iPad does by default, reads as macOS, and many Android tablets read as Linux the same way. |
Data source and quality
| Dimension | Type | Description |
|---|---|---|
| Site | String | The property the event was sent to, read from the key it was sent with. |
| Allowed origin | Boolean | Whether the page's origin is one its property allows. False marks a development server, a staging copy or another site carrying the snippet, so filter on true for real traffic. A property that lists no allowed origins allows every one. |
Metrics
The Products explore has 19 metrics.
| Metric | Calculation | Description |
|---|---|---|
| Products | Count distinct | Distinct products the items were, by Product key. |
| Item list views | Count | Items shown in a list: GA4's view_item_list and its kin, a listing page's own list, or a search results page's. |
| Item list clicks | Count | Items selected from a list: GA4's select_item and its kin. |
| Item list click-through rate | Ratio (%) | Item list clicks per item list view, as GA4 counts it: a list that shows a product often and sends few visitors to it reads low. |
| Item views | Count | Items viewed on their own page: GA4's view_item and its kin, or a Product detail page's own list. |
| Units added to cart | Sum | Units added to the cart: each item's quantity, or one where it states none, as GA4 counts items added to cart, and 0 for a product none were added of. |
| Units removed from cart | Sum | Units taken out of the cart, counted as Units added to cart is. |
| Units checked out | Sum | Units in a checkout opened, counted as Units added to cart is. |
| Units purchased | Sum | Units bought: each line of an order's first report, its quantity, or one where it states none, so an order reported twice counts once, and 0 for a product none were bought of. |
| Item revenue | Sum | What the units bought came to: each line's price times its quantity, as GA4 counts item revenue, in Currency. Before the order's own discounts and without its shipping and taxes, so it need not add up to the Visits explore's Revenue, which is what each order came to. |
| Orders | Count distinct | Orders with the product among their lines, each once. |
| Average price paid | Ratio | Item revenue per unit purchased, over the units whose line states its price, since a unit of no price adds nothing to Item revenue. |
| Units refunded | Sum | Units refunded: each line of every refund, its quantity, or one where it states none; a second refund of one order is another refund, a partial refund's, as GA4 counts it. |
| Item refund amount | Sum | What the units refunded came to, each line's price times its quantity, as Item revenue is counted. |
| Viewers | Count distinct | Distinct visitors who viewed the product on its own page: today each is a device, as the Visits explore counts one. |
| Visitors who added to cart | Count distinct | Distinct visitors who added the product to their cart. |
| Buyers | Count distinct | Distinct visitors who bought the product. |
| Cart-to-view rate | Ratio (%) | Visitors who added the product to their cart per visitor who viewed it, as GA4 counts it. A visitor can add a product from a list without viewing its page, so it can pass 100%. |
| Purchase-to-view rate | Ratio (%) | Visitors who bought the product per visitor who viewed it, as GA4 counts it, both in the date range: a visitor who viewed it last month and bought it this one counts in this month's buyers alone. |