Pages Per Session tells you how many pages users see on average during a visit—a core signal of engagement. In GA4, this metric works differently than Universal Analytics because GA4 is event-based rather than pageview-based. Understanding how it's calculated and where to find it is essential for diagnosing whether users are actually exploring your content.
How Pages Per Session Works in GA4
GA4 calculates Pages Per Session by counting page_view events within each session. A session is any group of interactions that occur within 30 minutes of idle time or before midnight.
Understand GA4's Event-Based Model
In GA4, a page view is captured when the page_view event fires on page load or route change. A session groups all events within a 30-minute window. Pages Per Session = total page views ÷ total sessions. Unlike Universal Analytics, there's no separate pageview hit type—it's just another event.
// GA4 fires page_view automatically via gtag on page load
// For manual tracking or custom implementations:
gtag('event', 'page_view', {
'page_title': 'Pricing Page',
'page_path': '/pricing',
'page_location': window.location.href
});Know What Counts as a Page
Each unique page path is one page. Single-page applications (SPAs) require manual page_view events when the view changes, since the URL might not change. Query parameters are stripped by default, so /product?color=blue and /product?color=red are treated as the same page. Only page_view events count—custom events like form submissions don't contribute to Pages Per Session.
// For SPAs: manually fire page_view on route change
// Example with React Router
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
export default function PageTracker() {
const location = useLocation();
useEffect(() => {
gtag('event', 'page_view', {
'page_path': location.pathname,
'page_title': document.title
});
}, [location]);
return null;
}Finding and Using Pages Per Session in GA4
Pages Per Session appears automatically in GA4 reports once your property receives data. You can view it in standard reports, custom explorations, or pull it programmatically via the Data API.
View the Metric in GA4 Reports
Navigate to Reports > Engagement and select Engagement Overview. Pages Per Session is displayed there alongside bounce rate and average session duration. For deeper analysis, go to Explore > Free Exploration and add Pages Per Session as a metric, then dimension it by Source/Medium, Device Category, or Landing Page to see where engagement differs.
// Fetch Pages Per Session via GA4 Data API
const response = await fetch(
`https://analyticsdata.googleapis.com/v1beta/properties/YOUR_PROPERTY_ID:runReport`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
body: JSON.stringify({
dateRanges: [{ startDate: '2025-01-01', endDate: '2025-12-31' }],
metrics: [{ name: 'screenPageViews' }, { name: 'sessions' }],
dimensions: [{ name: 'sessionSource' }]
})
}
);
const data = await response.json();
// Calculate: pageViewsPerSession = screenPageViews / sessionsInterpret the Metric Correctly
Higher Pages Per Session means users are exploring more. But always compare across segments: mobile might have lower pages-per-session due to navigation friction, while organic search might have higher engagement. Check Pages Per Session by landing page to identify which entry points lead to deeper exploration.
// Tag pages with custom dimensions for deeper segmentation
gtag('event', 'page_view', {
'page_path': '/blog/growth-hacking',
'page_title': 'Growth Hacking 101',
'content_type': 'blog',
'author': 'alice',
'topic': 'marketing'
});
// Then filter in Explore: dimension = content_type, metric = Pages Per Session
// Compare blog posts vs product pages to see which engages users moreCommon Pitfalls
- Counting bounces tanks the metric: Sessions with only one page (bounces) drag down Pages Per Session. Always segment by bounce rate or engagement time to isolate truly engaged users.
- Query parameter stripping: GA4 removes query parameters from page paths by default. If you track utm_source in the URL, create a custom dimension instead to preserve that segmentation.
- Session timeout splits user journeys: A user who explores slowly across 10 pages over 45 minutes will be split into two sessions (30-minute timeout), lowering each session's pages-per-session count unfairly.
- Forgetting SPA page tracking: Single-page apps require manual page_view events on route change. Without them, GA4 will show artificially low Pages Per Session because navigation won't register as new pages.
Wrapping Up
Pages Per Session in GA4 measures engagement by counting how many pages users see per visit. Unlike Universal Analytics, it's built on GA4's event model—every page view is a page_view event within a session. Use it to spot which traffic sources, devices, or pages drive deeper exploration, but always segment by bounce rate and traffic source to avoid misinterpreting the numbers. If you want to track this automatically across tools, Product Analyst can help.