Both metrics try to answer "did this visit do anything?" They use different definitions of "anything", which is why the same traffic can show a 70% bounce rate in one tool and a 60% engagement rate in another.
Bounce rate in its classic form is the share of sessions that viewed exactly one page. Engagement rate is GA4's replacement: the share of sessions that were "engaged", which GA4 defines by time, conversions or a second page view. Because the rules differ, the numbers are not interchangeable.
Bounce rate is a ratio with a deliberately simple rule. Take every session that started on your site, count the ones where the visitor saw a single page and did nothing that registered a second interaction, and divide by total sessions. In the classic form, the "second interaction" is just a second pageview. That is all it means.
The simplicity is the appeal. You can explain it to anyone in one sentence, and you can compute it from nothing but a pageview log. It is also the reason the metric has a bad reputation: it treats two very different visits as identical. A reader who lands on your pricing page, closes the tab after four seconds and a reader who lands on a tutorial, reads it for five minutes and leaves both count as one bounce each.
That is not a bug in the arithmetic. It is a consequence of what the metric was built to detect: pages that fail to move a visitor onward. On a page whose job is to send people somewhere else (a landing page, a category page, a search results page), a high bounce rate is a real warning. On a page whose job is to answer a question (a docs page, a blog post, a recipe), a high bounce rate is often what success looks like.
Every bounce figure depends on how a tool defines a session. Cookie-based tools typically stitch a visit together with an identifier and a time-based expiry. A cookieless tool has to choose another boundary. GhostMetrics uses the browser tab: the tracker keeps a pageview counter in sessionStorage, and the counter is cleared when the tab closes. A "session" is one tab's lifetime, with no cookies and no visitor IDs involved.
That choice matters when you compare tools. Someone who opens your site, leaves the tab open overnight and clicks a second page the next morning is one session in a tab-scoped model. Someone who opens two articles in two separate tabs is two sessions, each with one page, so each can be a bounce. Neither tool is wrong; they are counting different things.
When Google replaced Universal Analytics with GA4, it dropped the old bounce rate and introduced engaged sessions. A session counts as engaged if it meets any one of three conditions: it lasts longer than a time threshold, it includes a conversion event (GA4 now calls these key events), or it includes two or more page or screen views. Engagement rate is engaged sessions divided by total sessions. GA4 also exposes a bounce rate again, defined as the share of sessions that were not engaged, so in GA4 the two figures are complements of each other.
The thresholds are configurable and Google has adjusted the reports over time, so check the current Google Analytics documentation before you quote a number. The point for this article is structural: GA4 added a time condition and a conversion condition to the old "second pageview" rule.
That redefinition is a fairer measure of attention. A reader who stays on a long article for several minutes is engaged in GA4 even if they never click anything. It also changes the reading of historical data: the same site can show a noticeably different bounce rate after moving from Universal Analytics to GA4, with no change in visitor behavior at all. If you have ever compared a pre-migration and post-migration chart and wondered what happened to your traffic quality, the definition is the first thing to check. Our migration walkthrough covers what changes when metrics are defined differently across tools.
Be fair to GA4: the conversion condition is genuinely useful. If a visitor lands, fills in a form and leaves, that session is engaged, which matches reality, whereas the classic definition scores it as a bounce. And because GA4 ties sessions to events and, where consent allows, to users, you can analyze engagement by audience, by campaign and by ad platform in ways a cookieless tool does not attempt. The cost is the consent banner and the weight of the tag; see whether GA4 is GDPR compliant for that side of the trade.
Put the same traffic through both definitions and four visit shapes land in different buckets. The table lists each shape and how the classic bounce rule and the GA4 rule score it.
| Visit shape | Classic bounce rule | GA4 engaged-session rule |
|---|---|---|
| One page, left after a few seconds | Bounce | Not engaged (bounce), if under the time threshold |
| One page, read for several minutes, then left | Bounce | Engaged, because it passed the time threshold |
| One page, then a conversion event fired | Bounce, unless the event adds a page | Engaged, because of the conversion |
| Two pages in quick succession | Not a bounce | Engaged, because of 2+ views |
The second row is where most of the disagreement lives. Content sites, documentation and blogs produce a lot of long single-page reads, so they typically see classic bounce rates that look alarming and GA4 engagement rates that look healthy for the same readers. Neither figure is lying; the second row simply sits on opposite sides of the line.
The practical conclusion: never put a bounce rate from one tool next to an engagement rate or a bounce rate from another and call one "better". You are comparing rulebooks, not sites. When you change tools, expect the headline figure to move on day one with no change in your audience, and record the date so you can explain the step change later.
GhostMetrics reports the classic definition and does not try to reproduce GA4's engaged-session rule. Concretely: the tracker counts pageviews per tab in sessionStorage. Bounce rate on the dashboard is the pageviews flagged as bounces divided by entry pageviews, and the flag is set when the leave beacon, sent as the tab is hidden or unloaded, reports a session depth of 1. In plain terms, a bounce is a single-page session in that tab. It is not GA4's rule of 10 seconds, a conversion or 2+ pageviews. The flag depends on that leave beacon arriving, so a tab that disappears without sending one (a crashed browser, a killed process) is simply not counted as a bounce. Bounce rows recorded before 16 October 2026 over-counted multi-page sessions, so do not compare a pre-October figure with a later one without allowing for that.
Three implications follow from that design, and all of them are worth knowing before you act on a number:
Because a classic bounce hides what happened on the page, the dashboard pairs it with other views, all available on the free plan:
utm_campaign.data-gm-event or window.ghostmetrics.track, so you can count the action that matters on a single-page visit, such as a click on a signup button.Together these answer the question the headline bounce rate cannot: was a single-page visit a failure or a finished job? Our guide to tracking custom events without Google Analytics shows how to wire up the action that defines success on a page.
One honest gap: GhostMetrics has no single "engagement rate" number. There is no conversion rule folded into bounce, and no per-visitor funnel. If a combined engagement score is what your team reports on, GA4 supplies one and the dashboard here does not.
The figures below are illustrative, not benchmarks. Suppose a blog post receives 1,000 entry pageviews. Of those, 800 are flagged as bounces under the classic rule, so the bounce rate reads 80%. That looks terrible until you find the post in the pages table and see an average time of several minutes and an average scroll depth near the bottom of the article.
Read together, those views say: the article is doing its job and people leave after finishing it. In GA4, many of the same visits would be engaged sessions on the time condition alone, and the reported engagement rate would look fine. Same readers, same behavior, two headline numbers that point in opposite directions.
Now invert it. A landing page with a 40% bounce rate sounds healthy, but if its average time on page is only a few seconds and the click events on the signup button are near zero, the second pageview may be accidental navigation rather than interest. A low bounce rate can be as misleading as a high one when the page's real goal is an action. That is the reason to count the action directly.
Run through this once a week. It takes a few minutes and it keeps one metric from steering your decisions alone.
data-gm-event="signup-click" or a similar name on the button that defines success, then compare the event count against entry pageviews on that page.A single target like "bounce rate under 50%" ignores page type. Pushing an answer page's bounce rate down usually means adding forced clicks (pagination, "read more" gates, auto-playing related links), and those make the reader's experience worse while improving the metric. If a change makes the number better and the page worse, the metric stopped measuring what you wanted.
Time on page is a timing estimate, not a measure of attention. A reader can leave a tab open while making coffee. Use it as a shape (the distribution) and not as a precise duration for one visit. That is also why the distribution view is more useful than the average.
The most common mistake is putting a classic bounce rate and a GA4 figure side by side during a migration and concluding that traffic quality changed. Run both tools in parallel for a few weeks and note the offset instead. The same advice applies when you compare different cookieless tools: check each one's definition of a session before comparing results. Our cookieless analytics comparison puts the main tools side by side.
A burst of single-page sessions from one referrer can be a link in a chat app, a scraper or a misconfigured campaign link. Before you rewrite a page for a bounce rate spike, check the referrers and the source types for the dates in question. A spike of "direct" visits is a hint to check how links are tagged; the direct traffic explainer covers what a missing referrer can and cannot tell you.
In a single-page app, navigating between views does not reload the page. GhostMetrics is SPA-aware: a pushState or popstate navigation counts as a new pageview, so an app that routes client-side can register depth above 1 where a naive tracker would see a bounce. If you compare against a tool that only counts full page loads, expect a gap.
Pick the metric from the question you are asking, not from habit.
| Question | Start with | Why |
|---|---|---|
| Does this landing page send people onward? | Classic bounce rate plus the click event on the next step | The page's job is a second step, which is exactly what bounce measures |
| Is this article being read? | Time-on-page distribution and scroll depth | A single-page visit is the expected outcome, so bounce adds little |
| Which channel brings visitors who stay? | Bounce and time on page per source, from the raw export grouped by referrer or UTM | Averages blend channels; the split shows where quality differs |
| Is the page slow or confusing on arrival? | Short average time on that page, plus its row in the per-page vitals table | Very short visits paired with poor load timings point to a speed issue |
| Do I need a single engagement score for a report? | GA4's engagement rate | It folds time, conversions and page count into one figure |
If your question is about speed, the vitals panel is the right companion; see real-user Core Web Vitals monitoring for how to read it. GhostMetrics captures FCP, LCP, CLS and TTFB from real users and does not capture INP.
The short version: GA4's engagement rate answers "did this session meet a bar of activity?", and classic bounce rate answers "did this visitor go anywhere else?". Both are legitimate questions. Neither answers "was the visitor satisfied?", and nothing in a cookieless or a cookie-based tool does that on its own. Combine a bounce figure with reading depth and a counted action, and you are as close as page-level analytics can get.
GhostMetrics puts bounce rate, time on page, the time-on-page distribution and a scroll-depth funnel in the same dashboard, so a high bounce rate on an answer page is one click away from the evidence that readers finished it. It sets no cookies, stores no IP addresses (they are hashed) and keeps no cross-session identifier. Install is one script tag in <head>, about 3 KB compressed on the wire.
The free plan is free forever, no card: one website, unlimited pageviews, a real-time dashboard, every view and full history. Raw event export as CSV or JSON is on every plan, including free. Pro is $9.99/mo flat with unlimited websites (fair-use ceiling of 250) and a public shareable dashboard, and it starts with a 30-day free trial that needs a card and charges nothing for 30 days.
Start free, no card See the live demoDisclosure: GhostMetrics is built by Null Agency and we use it on this site, so we are not a neutral party about our own product. GA4's definitions and thresholds are set by Google and change over time; check the current Google Analytics documentation before quoting exact figures. The numbers in the worked example are illustrative, not benchmarks.