Metric · Marketing

What is bounce rate, and how do you measure it in Metabase?

Bounce rate is the share of website sessions with no engagement — in GA4 terms, sessions that weren't engaged: under 10 seconds, no conversion event, one pageview. It's the fastest read on whether a landing page and its traffic source actually match. (Looking for the email deliverability metric? That's email bounce rate — a different number entirely.) Measure it in Metabase from session data exported from Google Analytics, Plausible, or PostHog.

TL;DRbounced sessions ÷ sessions, per landing page and per source. Know which definition you're on: GA4 counts engagement (time, conversions, pageviews), Universal Analytics counted only pageviews. The two aren't comparable, and neither is meaningful as a site-wide average.

What does a bounce rate chart look like in Metabase?

Track one landing page's bounced-session share by month and read it downward: the slide from about 62% to 48% is what page and message fixes look like compounding over a year. A one-month spike like April's usually means a new traffic burst that didn't match the page's promise — segment that month by source and medium before touching the page itself.

Bounce rate in Metabase: line chart of monthly bounce rate for one landing page, trending down.
Bounce rate as a Metabase card, built from exported session data. Figures are illustrative.

What bounce rate measures

It measures mismatch. A bounce means the promise that brought someone to a page — an ad, a search snippet, a social post — wasn't kept fast enough for them to do anything at all. Segmented by landing page it finds pages that underdeliver; segmented by source it finds traffic that was never going to engage. As a site-wide average it measures nothing, because it blends blog readers who found their answer with checkout visitors who fled, and feeds neither engagement rate analysis nor conversion work.

GA4 vs. the old definition

Universal Analytics called any single-pageview session a bounce, however long it lasted. GA4 inverted the frame: it defines engaged sessions — longer than 10 seconds, or containing a conversion event, or with two-plus pageviews — and a bounce is simply a session that wasn't engaged. The practical consequences: single-page content that holds attention no longer bounces, reported bounce rates fell sharply on migration without any behavior change, and any trend that crosses the migration date needs a seam drawn on the chart. If you compute bounce rate yourself from raw events, write the engagement rule into one SQL model so every card shares it.

What data does it need?

  • A sessions table (or a model built from raw events) with session_start, landing_page, source, medium, and an is_engaged flag computed from duration, conversions, and pageview count.
  • A converted flag per session if you want bounce and conversion side by side — the pairing that makes the metric actionable.
  • Source: the GA4 BigQuery export, or self-hosted analytics events from Plausible, PostHog, or Mixpanel landed in the warehouse by a pipeline tool.

SQL patterns

Bounce rate by landing page by month PostgreSQL
SELECT
  landing_page,
  date_trunc('month', session_start) AS month,
  COUNT(*) AS sessions,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE NOT is_engaged)
    / NULLIF(COUNT(*), 0), 1
  ) AS bounce_rate_pct
FROM sessions
WHERE session_start >= CURRENT_DATE - INTERVAL '6 months'
GROUP BY 1, 2
HAVING COUNT(*) >= 100
ORDER BY 1, 2;
Bounce vs. conversion by source/medium PostgreSQL
SELECT
  source,
  medium,
  COUNT(*) AS sessions,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE NOT is_engaged)
    / NULLIF(COUNT(*), 0), 1
  ) AS bounce_rate_pct,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE converted)
    / NULLIF(COUNT(*), 0), 2
  ) AS conversion_rate_pct
FROM sessions
WHERE session_start >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1, 2
HAVING COUNT(*) >= 200
ORDER BY sessions DESC;

Pitfalls

Trending across the UA-to-GA4 boundary. → The definition changed underneath the metric, so the drop at migration is an artifact, not a win. Annotate the seam or restate history with one definition — never let the old and new numbers share a line.
Reading the site-wide average. → Blog posts, landing pages, and app screens have structurally different baselines. The average moves whenever the traffic mix moves, which says nothing about any page. Always segment by landing page or page intent.
Confusing bounce rate with exit rate. → Every page where journeys naturally end has a high exit rate — that's fine. Bounce rate only applies to sessions that started on the page. Diagnosing a mid-funnel page by its "bounce rate" usually means you're looking at exits.
Ignoring low-sample landing pages. → A page with 12 sessions and a 75% bounce rate is noise. Gate the chart with a minimum session count (a HAVING clause) so small pages don't dominate the sorted view.

Where this metric applies

Metrics

Dashboards

FAQ

How does GA4 define bounce rate?
As the inverse of engaged sessions. A session is engaged if it lasts longer than 10 seconds, fires a conversion event, or views at least two pages — everything else is a bounce. That's a materially different metric from Universal Analytics, where any single-pageview session bounced regardless of how long someone read. A blog post that holds a reader for three minutes bounced under UA and doesn't under GA4, which is why bounce rates dropped across the board when sites migrated to GA4. Never trend the two definitions on one chart.
Bounce rate vs. exit rate — what's the difference?
Bounce rate is a property of sessions that started on a page: what share never engaged. Exit rate is a property of all pageviews of a page: what share were the last view of their session. A checkout confirmation page has a near-100% exit rate and that's healthy; a high bounce rate on a paid landing page usually isn't. High exits flag where journeys end; high bounces flag where they never began — pair the bounce view with landing page conversion rate to tell broken from merely final.
Is a high bounce rate on blog posts a problem?
Usually not. Someone arrives from search, reads the answer, and leaves satisfied — under GA4 that's often not even a bounce if they stayed past 10 seconds, and under stricter definitions it still represents a successful visit. Judge content pages against content benchmarks and their own trend in organic traffic terms, and reserve bounce-rate alarm for pages built to move people onward: landing pages, pricing, signup flows. Segmenting by page intent on a content performance dashboard keeps the two from being averaged together.
Is this the same as email bounce rate?
No — same word, unrelated metric. Email bounce rate is a deliverability measure: the share of sent emails that couldn't be delivered to the recipient's server. Website bounce rate is a behavior measure about sessions on your site. They share nothing but the name, so keep them on separate dashboards with unambiguous labels.
How do you track bounce rate in Metabase?
Metabase reads from your SQL database or warehouse, so land session-level data there first — the GA4 BigQuery export, or event exports from Plausible, PostHog, or Mixpanel via a pipeline tool — and build a sessions model with an is_engaged flag. Then chart 1 − engaged ÷ sessions by landing page and by source/medium, and pin both next to engagement rate on a website analytics dashboard.