5 min read

What Is Bounce Rate in Google Analytics 4

If you're coming from Universal Analytics, bounce rate in GA4 is not what you remember. Google fundamentally changed how it's calculated—bounce rate is now derived from engagement, not page views. This matters because a 40% bounce rate in GA4 doesn't mean the same thing as a 40% bounce rate in UA, and comparing them directly will mislead you.

How GA4 Calculates Bounce Rate

GA4 treats a bounce as a session with zero engagement. A session is engaged if any of these happen: it lasts 10+ seconds, fires 2+ events, or triggers a conversion.

Understand the engagement-based definition

In Universal Analytics, a bounce happened when someone viewed a single page and left—simple as that. GA4 flipped this: a bounce is any session that doesn't hit your engagement criteria. This means a user can view 5 pages on your site but still bounce if it all happens in under 10 seconds and no events fire. Conversely, someone can bounce after 15 seconds on a single page if they scrolled and triggered an event.

javascript
// GA4 engagement rules (what prevents a bounce)
// A session is engaged if ANY of these occur:

// 1. Session lasts 10+ seconds
setTimeout(() => {
  console.log('Session is now engaged via duration');
}, 10000);

// 2. 2+ events fire (including page_view)
gtag('event', 'scroll', {
  'percent_scrolled': 50
});
gtag('event', 'click', {
  'element': 'cta_button'
});
// ^ 2 events = session is engaged

// 3. A conversion event fires
gtag('event', 'purchase', {
  'value': 99.99,
  'currency': 'USD'
});
// ^ Conversion event = session is engaged regardless of duration
GA4's engagement rules determine whether a session bounces

Find it in the GA4 interface

Go to Reports > Engagement > Overview. The bounce rate appears in the top row of metrics. You'll also see Engagement rate right next to it—that's 100% minus your bounce rate. To break bounce rate down by source or page, add a dimension using the Rows selector below the chart.

Tip: Scroll events don't count as engagement by default. If your users are scrolling but bouncing, you'll need to track scroll depth explicitly via gtag('event', 'scroll') to mark them as engaged.

Query Bounce Rate Programmatically

If you're pulling bounce rate into dashboards or reports, use the Google Analytics Data API v1 instead of the Reporting API (which is deprecated).

Run a basic bounce rate report

Use the runReport method with the bounceRate metric. You'll need your GA4 property ID and a service account credential with Editor access to the GA4 property.

javascript
const {BetaAnalyticsDataClient} = require('@google-analytics/data');

const client = new BetaAnalyticsDataClient();

const request = {
  property: 'properties/YOUR_PROPERTY_ID',
  dateRanges: [
    {
      startDate: '2025-01-01',
      endDate: '2025-12-31',
    },
  ],
  metrics: [
    {
      name: 'bounceRate',
    },
    {
      name: 'sessions',
    },
  ],
};

const [response] = await client.runReport(request);
response.rows.forEach((row) => {
  const bounceRate = row.metricValues[0].value;
  console.log(`Bounce Rate: ${(bounceRate * 100).toFixed(2)}%`);
});
Query GA4's bounce rate metric via the Data API v1

Segment bounce rate by traffic source

Add a dimensions array to break down bounce rate by where users came from. Common dimensions are sessionDefaultChannelGroup (Organic, Direct, Paid, etc.) and firstUserSource (where they first arrived).

Watch out: The bounceRate metric is returned as a decimal (0.35, not 35). Multiply by 100 and round to display as a percentage.

Bounce Rate vs. Engagement Rate

Bounce rate and engagement rate are inverses of each other. Understanding both helps you interpret traffic quality correctly.

Interpret bounce rate in context

A 50% bounce rate sounds bad until you realize it means 50% engagement rate—half your sessions are engaged. For content sites (blogs, docs), a 60–70% bounce rate is normal and acceptable. For e-commerce, 30–40% is typical. The key is whether bounces are *intentional*—a user who reads a single article and leaves intentionally is different from someone who hits a dead link.

javascript
// Query both bounce and engagement to understand your traffic
const request = {
  property: 'properties/YOUR_PROPERTY_ID',
  dateRanges: [{
    startDate: '2025-01-01',
    endDate: '2025-12-31',
  }],
  metrics: [
    { name: 'bounceRate' },
    { name: 'engagementRate' },
    { name: 'engagedSessions' },
    { name: 'bounceCount' },
  ],
  dimensions: [
    { name: 'pagePath' },
  ],
};

const [response] = await client.runReport(request);
response.rows.forEach((row) => {
  const page = row.dimensionValues[0].value;
  const bounce = row.metricValues[0].value;
  const engaged = row.metricValues[1].value;
  console.log(`${page}: ${(bounce*100).toFixed(1)}% bounce, ${(engaged*100).toFixed(1)}% engaged`);
});
See engagement and bounce side-by-side per page to identify problem areas

Define engagement for your use case

GA4's default 10-second threshold works for most sites, but if your users typically spend 5 seconds on a valuable page, lower the threshold. You can also fire custom events on meaningful actions. Go to Admin > Property > Data Streams and click your stream to adjust engagement settings, or implement custom events in gtag.js.

Common Pitfalls

  • Directly comparing bounce rates between GA4 and Universal Analytics without accounting for the calculation change. GA4's numbers will be different because the methodology is fundamentally different.
  • Not setting up scroll or click tracking events. If your users engage by scrolling but don't click or stay 10+ seconds, GA4 won't count them as engaged—you need custom events.
  • Assuming a high bounce rate always means bad UX. For single-topic pages (docs, FAQs, blog articles), bouncing after reading is expected behavior, not a failure.
  • Forgetting that bounce rate includes sessions that fire *one* event and leave. If your site tracks pageviews but the user doesn't interact further, that's a bounce, even if they spent 20 seconds reading.

Wrapping Up

Bounce rate in GA4 is engagement-derived, not page-view-derived. The 10-second minimum and multi-event rules mean you're measuring something meaningfully different from Universal Analytics. To understand traffic quality, look at engagement rate alongside bounce rate, and set up custom events for actions that matter in your product. If you want to track this automatically across tools, Product Analyst can help.

Track these metrics automatically

Product Analyst connects to your stack and surfaces the insights that matter.

Try Product Analyst — Free