Pages Per Session
Pages per session measures the average number of pages visited during a single, continuous visit to a website.
Business Use Case
A content team monitors pages per session by landing page and traffic source. If paid social traffic has low pages per session compared with organic search, the team can improve landing page internal linking, content recommendations, or audience targeting to increase on-site exploration.
Business Criticality
Medium
Journey / Navigation Area
Digital Analytics
Scope
User
Formula
Total Pageviews ÷ Total SessionsCalculation Notes
1️⃣ Use page_view events only. 2️⃣ Exclude screen_view unless creating a combined KPI. 3️⃣ Exclude bot/internal traffic where possible. 4️⃣ Handle sessions with zero page_view events consistently. 5️⃣ Decide on including all sessions or only those with at least one page_view. 6️⃣ Verify virtual page views for SPA implementations. 7️⃣ Align on page view counting for repeated reloads in Adobe.
Technical Details
Events
| Platform | Event |
|---|---|
| Google Analytics 4 | page_view |
| Adobe | pageView |
Data Mappings
W3 Data Layer
{
"event": "page_view",
"page": {
"pageName": "Product Detail",
"pageURL": "https://www.example.com/products/widget-a",
"pageType": "product",
"siteSection": "catalog"
},
"session": {
"sessionId": "sess_123456",
"pageViewCount": 3
},
"web": {
"webPageDetails": {
"name": "Product Detail",
"URL": "https://www.example.com/products/widget-a"
}
}
}GA4 Data Layer
{
"event": "page_view",
"page_title": "Product Detail",
"page_location": "https://www.example.com/products/widget-a",
"page_path": "/products/widget-a",
"page_referrer": "https://www.example.com/category/widgets",
"session_id": "sess_123456",
"page_view_count_in_session": 3
}Adobe Client Data Layer
{
"event": "page-view",
"web": {
"webPageDetails": {
"name": "Product Detail",
"URL": "https://www.example.com/products/widget-a",
"server": "www.example.com",
"siteSection": "catalog",
"pageViews": {
"value": 1
}
}
},
"session": {
"sessionID": "sess_123456",
"pageViewCount": 3
}
}XDM Mapping
{
"eventType": "web.webpagedetails.pageViews",
"web.webPageDetails.pageViews.value": 1,
"web.webPageDetails.name": "Product Detail",
"web.webPageDetails.URL": "https://www.example.com/products/widget-a",
"web.webReferrer.URL": "https://www.example.com/category/widgets",
"_experience.analytics.customDimensions.eVars.eVar1": "sess_123456"
}SQL Queries
Google Analytics 4 (BigQuery)
WITH session_pageviews AS ( SELECT user_pseudo_id, user_id, CONCAT(user_pseudo_id, '-', CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS session_id, COUNTIF(event_name = 'page_view') AS page_views FROM `project.dataset.events_*` WHERE _TABLE_SUFFIX BETWEEN '20250101' AND '20250131' GROUP BY 1, 2, 3 ), valid_sessions AS ( SELECT session_id, page_views FROM session_pageviews WHERE session_id IS NOT NULL ) SELECT SAFE_DIVIDE(SUM(page_views), COUNT(DISTINCT session_id)) AS pages_per_session FROM valid_sessions;Adobe Experience Platform (AEP Query Service)
WITH session_pageviews AS ( SELECT identityMap.ECID[0].id AS mcid, session_id, COUNT(CASE WHEN eventType = 'web.pageView' THEN 1 END) AS page_views FROM dataset.events WHERE timestamp BETWEEN '2025-01-01' AND '2025-01-31' GROUP BY mcid, session_id ), valid_sessions AS ( SELECT session_id, page_views FROM session_pageviews WHERE session_id IS NOT NULL ) SELECT SUM(page_views) / COUNT(DISTINCT session_id) AS pages_per_session FROM valid_sessions;Source Data
Digital Analytics
Dependencies
Prerequisite: List the dependencies required for this KPI
Events:
Dimensions:
Report Attributes
Dimensions: Landing Page, Page Path, Page Title, Source/Medium, Default Channel Group, Device Category, Country, Content Group, New vs Returning Metrics: Page Views, Sessions, Pages per Session, Engaged Sessions, Bounce Rate, Average Engagement Time
Recommended Reporting Views
Segment Eligibility
True
Governance
Governance
GitHub
catalog/kpis/pages-per-session.yml