Product Detail View Rate
Also known as: Product View Rate, PDP View Rate, PDP Reach Rate, Product Page View Rate
Product Detail View Rate is the percentage of all sessions that reach at least one product detail page (PDP), showing how well search, navigation, listing pages and landing pages move shoppers from browsing to looking at a specific product. It measures only whether shoppers reach the PDP, not whether they add the product to cart afterwards, which Add to Cart Rate and Item View to Cart Rate measure.
Business Use Case
1️⃣ Merchandising: when the weekly rate for a category drops more than 2 percentage points below its 8-week baseline, the category manager reviews that listing page's tile imagery, default sort order, out-of-stock suppression and price display, then reorders or refreshes the assortment shown above the fold. 2️⃣ Site Search & Navigation (Product): when sessions that use internal search reach the PDP well less often than sessions that browse categories, the search product owner tunes relevance rules, synonyms and zero-results fallbacks, then checks the result against the rate for search sessions. 3️⃣ Performance Marketing: during the weekly channel review, paid campaigns whose landing sessions reach the PDP at less than half the site average are flagged. The team either points them at a more specific product or category landing page or moves budget to ad groups that reach the PDP more often. 4️⃣ Product / UX: the digital experience team uses the rate as the primary metric for listing page and navigation A/B tests (filters, facets, tile layout), and ships a variant only if it lifts PDP reach significantly without lowering the session Add to Cart Rate.
Business Criticality
High
Journey / Navigation Area
Discovery
Owning Function
Merchandising
Scope
Session
Formula
Calculation Notes
1️⃣ Numerator = distinct sessions (user_pseudo_id + ga_session_id in GA4; visit ID in Adobe) with at least one view_item (Adobe prodView) event. A session that views 12 products counts once; the total number of PDP views is reported separately by the Product View metric. 2️⃣ Denominator = every session in the reporting period (the full session base): bounced, single-page and non-engaged sessions, and sessions that land directly on a PDP. Do not narrow it to engaged sessions or sessions that viewed a listing page, because that turns the KPI into a step-conversion rate and breaks comparisons across periods. 3️⃣ Only a full PDP render counts. Quick-view overlays, hover previews and recommendation carousels must either fire view_item_list / select_item or carry a distinguishing parameter (e.g. view_type = quick_view) and be excluded. Otherwise category pages with quick-view enabled report a PDP reach that is too high. 4️⃣ Sessions end after 30 minutes of inactivity (GA4 default; Adobe visits also close after 12 hours or 2,500 hits). GA4 does not split a session at midnight, so a session is attributed to the date it started, and numerator and denominator must use that same session-start date. 5️⃣ Apply the same filters to numerator and denominator: known bots and spiders, internal IP ranges, QA/staging hostnames, and hits without a valid session ID. Do not mix consent-mode modelled sessions (GA4 UI) with the observed-only BigQuery export in one trend line. 6️⃣ This KPI stops at reaching the PDP. Product Detail View Rate × the session-scoped share of PDP-viewing sessions that add to cart gives only the add-to-cart sessions that also viewed a product page. Quick-add from listing pages and quick-view adds happen without a PDP view, so the full session Add to Cart Rate is higher than this product. Item View to Cart Rate is item-scoped (items added ÷ items viewed), so it cannot be multiplied into this KPI. 7️⃣ GA4 BigQuery daily tables keep receiving late hits for up to 72 hours. Restate the trailing three days before publishing weekly figures. In single-page apps, view_item must fire on every virtual PDP route change, but must not fire again when the shopper only switches a variant (size or colour) on the same product.
Technical Details
Events
| Platform | Event |
|---|---|
| Google Analytics 4 | view_item |
| Adobe | prodView |
Data Mappings
W3 Data Layer
{
"page": {
"pageInfo": {
"pageID": "pdp-SKU-10482",
"pageName": "pdp:running shoes:trail runner pro",
"destinationURL": "https://www.example.com/p/trail-runner-pro-SKU-10482",
"referringURL": "https://www.example.com/c/running-shoes"
},
"category": {
"primaryCategory": "product detail",
"pageType": "pdp"
}
},
"product": [
{
"productInfo": {
"productID": "SKU-10482",
"productName": "Trail Runner Pro",
"manufacturer": "Northpeak"
},
"category": {
"primaryCategory": "Footwear",
"subCategory1": "Running Shoes"
},
"attributes": {
"listName": "Category Listing - Running Shoes",
"viewType": "full_pdp"
},
"price": {
"basePrice": 129,
"currency": "USD"
}
}
],
"event": [
{
"eventInfo": {
"eventName": "Product View",
"eventAction": "prodView",
"type": "view_item",
"timeStamp": "2026-09-16T14:05:22Z"
},
"category": {
"primaryCategory": "ecommerce"
}
}
]
}GA4 Data Layer
{
"event": "view_item",
"page_type": "pdp",
"view_type": "full_pdp",
"ecommerce": {
"currency": "USD",
"value": 129,
"items": [
{
"item_id": "SKU-10482",
"item_name": "Trail Runner Pro",
"item_brand": "Northpeak",
"item_category": "Footwear",
"item_category2": "Running Shoes",
"item_list_name": "Category Listing - Running Shoes",
"price": 129,
"quantity": 1
}
]
}
}Adobe Client Data Layer
{
"event": "prodView",
"eventInfo": {
"eventType": "commerce.productViews"
},
"page": {
"pageName": "pdp:running shoes:trail runner pro",
"pageType": "pdp"
},
"product": [
{
"productID": "SKU-10482",
"productName": "Trail Runner Pro",
"brand": "Northpeak",
"category": "Footwear/Running Shoes",
"listName": "Category Listing - Running Shoes",
"viewType": "full_pdp",
"price": 129,
"currency": "USD",
"quantity": 1
}
]
}XDM Mapping
{
"eventType": "commerce.productViews",
"commerce": {
"productViews": {
"value": 1
}
},
"productListItems": [
{
"SKU": "SKU-10482",
"name": "Trail Runner Pro",
"quantity": 1,
"priceTotal": 129,
"currencyCode": "USD",
"productCategories": [
{
"categoryID": "footwear-running-shoes",
"categoryName": "Footwear/Running Shoes"
}
]
}
],
"web": {
"webPageDetails": {
"name": "pdp:running shoes:trail runner pro",
"URL": "https://www.example.com/p/trail-runner-pro-SKU-10482",
"siteSection": "pdp"
}
},
"_experience": {
"analytics": {
"customDimensions": {
"eVars": {
"eVar10": "Northpeak",
"eVar11": "Category Listing - Running Shoes",
"eVar12": "full_pdp"
}
}
}
}
}SQL Queries
Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
-- Product Detail View Rate = sessions with >= 1 full-PDP view_item / all sessions (session-start date)
WITH events AS (
SELECT
user_pseudo_id,
event_date,
event_name,
MAX(IF(ep.key = 'ga_session_id', ep.value.int_value, NULL)) AS ga_session_id,
MAX(IF(ep.key = 'view_type', ep.value.string_value, NULL)) AS view_type
FROM `your-project.analytics_123456789.events_*`,
UNNEST(event_params) AS ep
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY))
AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND (device.web_info.hostname IS NULL OR device.web_info.hostname NOT LIKE '%staging%')
GROUP BY user_pseudo_id, event_date, event_timestamp, event_name, event_bundle_sequence_id
),
sessions AS (
SELECT
user_pseudo_id,
ga_session_id,
PARSE_DATE('%Y%m%d', MIN(event_date)) AS session_date,
MAX(IF(event_name = 'view_item' AND COALESCE(view_type, 'full_pdp') != 'quick_view', 1, 0)) AS has_pdp_view
FROM events
WHERE ga_session_id IS NOT NULL
GROUP BY user_pseudo_id, ga_session_id
)
SELECT
session_date,
COUNT(*) AS total_sessions,
SUM(has_pdp_view) AS pdp_view_sessions,
ROUND(SAFE_DIVIDE(SUM(has_pdp_view), COUNT(*)) * 100, 2) AS product_detail_view_rate_pct
FROM sessions
WHERE session_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY)
GROUP BY session_date
ORDER BY session_date;Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
-- Product Detail View Rate = visits with >= 1 full-PDP commerce.productViews / all visits (visit-start date)
WITH hits AS (
SELECT
endUserIDs._experience.ecid.id AS ecid,
timestamp,
eventType,
commerce.productViews.value AS product_views,
_experience.analytics.customDimensions.eVars.eVar12 AS view_type,
SESS_TIMEOUT(timestamp, 60 * 30) OVER (
PARTITION BY endUserIDs._experience.ecid.id
ORDER BY timestamp
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS session
FROM aep_web_events_dataset
WHERE timestamp >= date_sub(current_date(), 31)
AND timestamp < current_date()
AND endUserIDs._experience.ecid.id IS NOT NULL
AND (web.webPageDetails.URL IS NULL OR web.webPageDetails.URL NOT LIKE '%staging%')
),
visits AS (
SELECT
ecid,
session.num AS visit_num,
MIN(to_date(timestamp)) AS visit_date,
MAX(CASE
WHEN (eventType = 'commerce.productViews' OR product_views > 0)
AND COALESCE(view_type, 'full_pdp') <> 'quick_view'
THEN 1 ELSE 0
END) AS has_pdp_view
FROM hits
GROUP BY ecid, session.num
)
SELECT
visit_date,
COUNT(*) AS total_visits,
SUM(has_pdp_view) AS pdp_view_visits,
ROUND(100.0 * SUM(has_pdp_view) / NULLIF(COUNT(*), 0), 2) AS product_detail_view_rate_pct
FROM visits
GROUP BY visit_date
ORDER BY visit_date;Source Data
Digital Analytics (GA4)
Dependencies
Prerequisite: List the dependencies required for this KPI
Report Attributes
Device Category Session Default Channel Group Session Source / Medium Campaign Landing Page Type Item Category New vs Returning User Country
Recommended Reporting Views
Segment Eligibility
true
Governance
Governance
GitHub
catalog/kpis/product-detail-view-rate.yml