GA4 Item Funnel
This module is available exclusively for Premium users.
The ga4_item_funnel module processes GA4 e-commerce data to create datasets focused on item-level performance throughout the buying journey.
It transforms nested event and item data into structured funnels and attribution-ready outputs, showing how users interact with individual products across steps such as view_item_list, select_item, view_item, add_to_cart, begin_checkout, and purchase.
Functional Overview and Business Value​
- Product performance optimization: Identify products that are frequently viewed but rarely added to cart versus products that convert strongly once discovered.
- Funnel bottleneck detection: Pinpoint where user drop-off happens for specific product lines, brands, or categories.
- Item-list attribution: Measure which lists (for example Search Results, Related Products, Summer Sale) drive engagement and sales.
- Customizable insights: Tailor reporting with optional item and session drilldowns.
Attribution Models​
Item-list attribution is based on item list impressions and supports:
- First: Credits the first list where an item was seen in the session.
- Last: Credits the most recent list where an item was seen in the session.
This enables attribution even when later events (like purchase) do not include list parameters.
Output Table Descriptions​
The module produces three output tables for different analysis needs.
ga4_item_funnel_sessions​
- Description: Granular, intermediate-style reporting table.
- Granularity: 1 row per item per session.
- Functionality: Aggregates e-commerce item events at session + item level and includes base session attributes plus list attribution arrays.
ga4_item_funnel_report​
- Description: Aggregated daily funnel reporting table.
- Granularity: Grouped by
session_date, enabled item dimensions, and enabled drilldowns. - Functionality: Primary BI table with event/session/user funnel metrics and purchase revenue/quantity.
ga4_item_list_attribution_report​
- Description: Aggregated reporting table focused on item-list performance.
- Granularity: Grouped by
session_dateand configured item-list dimensions. - Functionality: Provides first-touch and last-touch list attribution metrics for downstream engagement and sales.
Technical Configuration (config.json)​
The module uses a single configuration file: includes/custom/modules/ga4_item_funnel/config.json
Example:
{
"version": 1,
"enabled": true,
"dependencies": ["ga4"],
"drilldowns": {
"channel_group": true,
"device_category": true,
"is_new_session": true
},
"listAttribution": {
"saveListInformation": true,
"dimsToStore": ["item_list_name", "item_list_id", "item_list_index"],
"pickDimsFromTheseEvents": ["view_item_list", "select_item", "view_item"]
},
"itemDrilldowns": {
"item_id": true,
"item_name": true,
"item_brand": false,
"item_variant": false,
"item_category": true,
"item_category2": false,
"item_category3": false,
"item_category4": false,
"item_category5": false,
"affiliation": false
},
"itemParamsCustom": [
{ "name": "item_params_custom.item_stocklevel", "renameTo": "stock" }
],
"sessionDimensions": [
{ "name": "session_params_custom.page_language", "renameTo": "language" },
{ "name": "geo.country" }
]
}
Configuration Options​
Essential Settings​
| Setting | Description | Example |
|---|---|---|
enabled | Enable/disable the module | true or false |
version | Configuration version (must remain 1) | 1 |
dependencies | Required module dependencies | ["ga4"] |
Session-Level Drilldowns​
Configure which session dimensions to include:
"drilldowns": {
"channel_group": true,
"device_category": false,
"is_new_session": false
}
Available Options:
channel_group: Addslast_non_direct_traffic_source.default_channel_groupingcolumndevice_category: Adds device segmentation (desktop, mobile, tablet, smart tv)is_new_session: Enables new vs. returning user analysis usingga_session_number = 1logic
List Attribution Settings​
Configure extraction and stateful tracking of item-list properties:
"listAttribution": {
"saveListInformation": true,
"dimsToStore": ["item_list_name", "item_list_id", "item_list_index"],
"pickDimsFromTheseEvents": ["view_item_list", "select_item", "view_item"]
}
saveListInformation(boolean): Enables list tracking and attribution logic.dimsToStore(array of strings): List dimensions to persist (item_list_name,item_list_id,item_list_index).pickDimsFromTheseEvents(array of strings): Events scanned to capture list metadata for later funnel events.
Item Dimension Drilldowns​
Toggle standard item dimensions on/off:
"itemDrilldowns": {
"item_id": true,
"item_name": true,
"item_brand": true,
"item_variant": true,
"item_category": true,
"item_category2": true,
"item_category3": true,
"item_category4": true,
"item_category5": true,
"affiliation": true
}
Disable item dimensions that aren't filled consistently across all e-commerce events, as they can "break" funnel analysis when drilling down. For example, if view_item_list has no item_variant but add_to_cart does, consider disabling item_variant.
Custom Item Parameters​
Include custom item parameters from your configuration:
"itemParamsCustom": [
{ "name": "item_params_custom.item_stocklevel", "renameTo": "stock" }
]
Use fully qualified source fields that exist in your available item parameters and map them with renameTo when needed.
Example:
[
{ name: "item_params_custom.item_stocklevel", renameTo: "stock" }
]
Additional Session Dimensions​
Add any column from the ga4_sessions table:
"sessionDimensions": [
{ "name": "session_params_custom.page_language", "renameTo": "language" },
{ "name": "geo.country" }
]
name: Valid column name fromga4_sessionstablerenameTo: Optional renamed column in output (auto-sanitized if omitted)
Table Structures​
ga4_item_funnel_sessions​
Granularity: 1 row per item per session with aggregate metrics
| Column | Description |
|---|---|
session_date | Date of the session (partitioning column) - based on start date of the session |
session_start_timestamp_utc | UTC timestamp when the session started |
session_start_timestamp_local | Local datetime when the session started (converted using LOCAL_TIMEZONE variable) |
is_final | Indicates if the data is final or subject to change (based on 72h window) |
session_id | Unique identifier for the session - contains only non-NULL values (cluster column) |
ga_session_number | Google Analytics session number for the user |
user_pseudo_id | Pseudonymous identifier for the user |
user_id | Unique identifier for the user - last non-null value of the session |
property_id | Google Analytics property ID |
platform | The data stream platform (Web, IOS or Android) from which the event originated |
| Item Details | |
item.item_id | Unique identifier for the item |
item.item_name | Name of the item |
item.item_brand | Brand of the item |
item.item_variant | Variant of the item (e.g., size, color) |
item.item_category | Primary category of the item |
item.item_category2 | Secondary category of the item |
item.item_category3 | Tertiary category of the item |
item.item_category4 | Fourth-level category of the item |
item.item_category5 | Fifth-level category of the item |
item.price_in_usd | Item price converted to USD |
item.price | Item price in local currency |
item.quantity | Quantity of the item in the event |
item.item_revenue_in_usd | Revenue from this item converted to USD |
item.item_revenue | Revenue from this item in local currency |
item.item_refund_in_usd | Refund amount for this item converted to USD |
item.item_refund | Refund amount for this item in local currency |
item.coupon | Coupon code applied to this item |
item.affiliation | Affiliation or partner associated with the item |
item.location_id | Physical location identifier where the item was sold |
item.item_list_id | Identifier for the list where the item appeared |
item.item_list_name | Name of the list where the item appeared |
item.item_list_index | Position of the item in the list |
item.promotion_id | Identifier for the promotion applied to the item |
item.promotion_name | Name of the promotion applied to the item |
item.creative_name | Name of the creative/ad that promoted the item |
item.creative_slot | Slot position of the creative/ad |
| E-commerce Event Totals | |
item_totals.add_payment_info | Number of times payment info was added for this item in the session |
item_totals.add_shipping_info | Number of times shipping info was added for this item in the session |
item_totals.add_to_cart | Number of times this item was added to cart in the session |
item_totals.add_to_wishlist | Number of times this item was added to wishlist in the session |
item_totals.begin_checkout | Number of times checkout was initiated with this item in the session |
item_totals.purchase | Number of times this item was purchased in the session |
item_totals.refund | Number of times this item was refunded in the session |
item_totals.remove_from_cart | Number of times this item was removed from cart in the session |
item_totals.select_item | Number of times this item was selected in the session |
item_totals.select_promotion | Number of times a promotion for this item was selected in the session |
item_totals.view_cart | Number of times cart containing this item was viewed in the session |
item_totals.view_item | Number of times this item was viewed in the session |
item_totals.view_item_list | Number of times a list containing this item was viewed in the session |
item_totals.purchase_quantity | Total quantity of this item purchased in the session |
item_totals.item_revenue | Total revenue generated by this item in the session |
ga4_item_funnel_report​
Granularity: Daily aggregates by item and configured dimensions
| Column | Description |
|---|---|
session_date | Date of the session used for aggregation (partitioning column for performance optimization) |
property_id | Google Analytics property ID |
platform | The data stream platform (Web, IOS or Android) from which the events originated |
is_final | Indicates if the data is final or subject to change (based on 72h window) |
| Dynamic Item Dimensions (conditionally included) | |
item.item_id | Unique identifier for the item (included if itemDrilldowns.item_id = true) |
item.item_name | Name of the item (included if itemDrilldowns.item_name = true) |
item.item_brand | Brand of the item (included if itemDrilldowns.item_brand = true) |
item.item_variant | Variant of the item (included if itemDrilldowns.item_variant = true) |
item.item_category | Primary category of the item (included if itemDrilldowns.item_category = true) |
item.item_category2 | Secondary category of the item (included if itemDrilldowns.item_category2 = true) |
item.item_category3 | Tertiary category of the item (included if itemDrilldowns.item_category3 = true) |
item.item_category4 | Fourth-level category of the item (included if itemDrilldowns.item_category4 = true) |
item.item_category5 | Fifth-level category of the item (included if itemDrilldowns.item_category5 = true) |
item.affiliation | Affiliation or partner associated with the item (included if itemDrilldowns.affiliation = true) |
item.{custom_param_name} | Custom item parameters as specified in itemParamsCustom array - field names match the configured parameter names |
| Session-Level Drilldowns (conditionally included) | |
default_channel_grouping | Default channel grouping for traffic attribution (included if drilldowns.channel_group = true) |
device_category | Device category (Desktop, Mobile, Tablet, Smart TV) (included if drilldowns.device_category = true) |
is_new_session | Boolean indicating if this was the user's first session (included if drilldowns.is_new_session = true) |
| Custom Session Dimensions (dynamically added) | |
{custom_dimension_name} | Additional dimensions from ga4_sessions table as specified in sessionDimensions configuration array - column names determined by renameTo value or auto-sanitized from original field name |
| Comprehensive Funnel Metrics | |
item_totals.events.{event_name} | Total count of each e-commerce event type for this item (e.g., add_to_cart, purchase, view_item) |
item_totals.sessions.{event_name} | Count of unique sessions where each e-commerce event type occurred for this item |
item_totals.users.{event_name} | Count of unique users who performed each e-commerce event type for this item |
item_totals.purchase_quantity | Total quantity of this item purchased across all purchase events |
item_totals.item_revenue | Total revenue generated by this item across all purchase events |
ga4_item_funnel_report adapts its schema based on configuration:
- Item dimensions: Only enabled
itemDrilldownsappear in the item struct - Custom item parameters: Fields from
itemParamsCustomarray are dynamically added - Session drilldowns: Only enabled
drilldownscreate additional columns - Custom session dimensions: Additional columns based on
sessionDimensionsconfiguration - Event metrics: All standard e-commerce events are tracked (13 event types total)
ga4_item_list_attribution_report​
Granularity: Daily aggregates by item-list dimensions and configured drilldowns
| Column | Description |
|---|---|
session_date | Session date used for aggregation |
property_id | Google Analytics property ID |
platform | Data stream platform (Web, IOS, Android) |
is_final | Indicates if data is final (72h window logic) |
item_list.item_list_name | Item list name (if enabled in listAttribution.dimsToStore) |
item_list.item_list_id | Item list ID (if enabled in listAttribution.dimsToStore) |
item_list.item_list_index | Item list index (if enabled in listAttribution.dimsToStore) |
attribution_first.events.{event_name} | Event counts attributed to first list impression of the item in-session |
attribution_last.events.{event_name} | Event counts attributed to most recent list impression of the item in-session |
attribution_first.item_revenue | Revenue attributed with first-touch list model |
attribution_last.item_revenue | Revenue attributed with last-touch list model |
Looker Studio Template + Calculation Examples​
We created a free-to-use Looker Studio template that was specifically designed to work with the GA4Dataform modules. Feel free to copy it and adapt it to your needs! You can find it here.
When connecting ga4_item_funnel_report to your BI tool, here are useful calculated metrics:
Event-Based Metrics​
sum(item_totals.events.add_to_cart): Total add-to-cart events for itemsum(item_totals.events.purchase): Total purchase events for item
Session-Based Metrics​
sum(item_totals.sessions.purchase): Sessions where item was purchasedsum(item_totals.sessions.view_item): Sessions where item was viewed
User-Based Conversion Rates​
sum(item_totals.users.purchase) / sum(item_totals.users.view_item): User-based purchase-to-detail ratesum(item_totals.users.add_to_cart) / sum(item_totals.users.view_item): User-based view-to-cart rate
Revenue Metrics​
sum(item_totals.item_revenue): Total item revenuesum(item_totals.purchase_quantity): Total units soldsum(item_totals.item_revenue) / sum(item_totals.purchase_quantity): Average selling price
Common Use Cases​
- Product Performance Analysis: Identify top and bottom-performing items across the funnel
- Category Optimization: Compare performance across product categories
- List Attribution Analysis: Compare first-touch vs. last-touch list impact on conversions
- Inventory Planning: Use purchase quantities and revenue data for demand forecasting
- Personalization Insights: Analyze item performance by user segments
- A/B Testing: Compare item performance across different user experiences