Entry pages answer "where do visits begin?" Exit pages answer "which pages were left?" Neither answers "what went wrong?" without context.
An entry page is the first page of a visit; an exit page is a page a visitor left. Entry pages are an acquisition view: which pages earn first impressions. Exit pages are a context view: a high count means little until you know what the page is for.
sessionStorage. A new tab starts a new entry; a reload or a click within the tab does not.Every visit has a beginning and an end. The page where it begins is the entry page, often called the landing page. The page where it ends is the exit page. If someone arrives on a blog post from a search result, reads it, clicks to your pricing page and then closes the tab, the blog post is the entry page and the pricing page is the exit page.
The two are easy to confuse with "top pages". Top pages count every view of a page, wherever in the visit it happens. A page can be a top page without being a top entry page: your pricing page may be viewed constantly, but almost always as the second or third page. Entry pages count only the views that started a visit, so they show which pages work as front doors. Exit pages show the other end.
Three related terms are worth separating:
For how bounce relates to the engagement rate used in Google Analytics 4, see bounce rate vs engagement rate explained.
The flag is set in the browser, not inferred on the server. When gm.js loads, it reads a counter called gm_depth from sessionStorage. If there is no counter yet, this is the first pageview in this tab, the depth is 1, and the pageview is sent with an entry flag. If there is a counter, it adds one and the pageview is not an entry. The server stores the flag with the row, and the Entry Pages panel counts the rows where it is set, grouped by page path, as the top ten for the selected period.
Because sessionStorage belongs to a single browser tab and is cleared when that tab closes, an entry in GhostMetrics means "first pageview in this tab". That has consequences you can predict:
sessionStorage survives a reload, so the counter goes up and the reloaded page is recorded at depth 2.pushState or popstate is recorded as a pageview with the entry flag off.The same flag drives the Visitors figure on the Overview tab, which is the number of entry pageviews. That is why Visitors and the entry flag always agree: they are the same rows, totalled two ways. The Entry Pages panel simply shows the ten pages with the most of them.
Exit works differently, and the difference matters when you read the panel. Alongside the pageview beacon, gm.js sends a second, "leave" beacon. It fires the first time the tab becomes hidden (which includes switching tabs and navigating away) or when the page is about to unload, and for a single-page app it also fires when the route changes. It carries the time spent on the page and the maximum scroll depth reached.
On the server, the leave beacon finds the most recent pageview row for the same page path from the same visitor hash within the previous six hours, writes the time and scroll values onto it, and sets its exit flag. The Exit Pages panel counts rows with the flag set, grouped by page, as the top ten for the period.
Read that carefully, because it differs from the textbook definition. The flag means "this pageview reported that it was left". It is set on every page a visitor leaves, including the first page of a visit that continued to a second page. It is not reserved for the last page of the visit. The practical effect is that the exit list tracks your traffic ranking closely, because a page with many views will have many leaves. A page that appears high on exits is often simply a page that is viewed a lot.
To get something closer to the classic "last page" question, compare instead of reading the exit list alone:
Two further details of the leave beacon are worth knowing. It is sent once per page, so a reader who switches away at ten seconds and returns for a long read has the ten seconds recorded. And the time and scroll averages on the dashboard use only rows with an exit flag, which is why a page whose beacon never arrived is left out of those averages instead of dragging them toward zero.
Entry pages are the more dependable of the two panels, because they come from the pageview beacon rather than from a second beacon that has to arrive. Four questions make them useful.
A caution about sources: a visit that began with a UTM-tagged link keeps its tag for every later untagged pageview in that tab, so campaign analysis works best when you look at the entry page where the visit began. The UTM parameters guide covers how to tag, and direct traffic explained covers entries that arrive with no referrer at all.
The common instinct is to see a page high on the exit list and treat it as a problem. That is wrong about as often as it is right. What matters is whether the exit is where the visit was supposed to end. The table sorts common page types by what a high exit count means.
| Page type | High exits usually mean | What to check |
|---|---|---|
| Thank-you or confirmation page | The goal was reached and the visit is over. Healthy. | That people reach it at all, via a custom event on the button before it |
| Contact or location page | The visitor found the address or phone number and left to use it. Often healthy. | Whether a click-to-call or map link is tracked as an event |
| Blog post or article | The reader got the answer. Neutral to healthy. | Scroll depth and time; whether a next step exists |
| Documentation page | The question was answered. Healthy, unless it is a dead end for setup steps. | Whether the next step in the sequence is linked |
| Pricing or sign-up page | The visitor weighed the offer and left. Worth investigating. | Clicks on the sign-up button as an event, versus views |
| Mid-journey page (category, listing, step two) | The path ended before it should have. Worth investigating. | Broken links, slow loading, unclear next action |
| Error or not-found page | A dead link or mistyped address. Fix the cause. | Which referrer or internal link leads there |
The pattern is that exits are only informative paired with an intention. Before you read the Exit Pages panel, write down the page where you want visits to end. Then the panel answers a real question: how many visits ended somewhere else?
The way to measure intention is a custom event. Put data-gm-event="signup-click" on the sign-up button and the Events tab shows its count. Compare that with the views of the page that holds the button, and you have a click-through measure that does not depend on exit flags at all. Events carry the page path, and only a section label is stored as metadata. The custom events guide covers naming.
None of these makes the data unusable. They make it a trend and ranking tool rather than an audit. If your question needs strict last-page-of-session logic or multi-session journeys, a tool built on persistent visitor identifiers answers it, at the cost of cookies or consent. GA4 is the usual choice there; see the GA4 alternative guide for the trade-off.
GhostMetrics is cookieless web analytics: no cookies, no localStorage, no stored IP addresses. The free plan is free forever with no card: one website, unlimited pageviews, the real-time dashboard, every dashboard view, full history, including Entry Pages, Exit Pages, the All Pages table and Session Depth, plus raw CSV or JSON export on every plan. We use it on nullagency.io.
Several sites or a public dashboard URL? Pro is $9.99/mo flat with unlimited websites (fair-use ceiling of 250) and a 30-day free trial; a card starts the trial, nothing is charged for 30 days, and you can cancel anytime. Custom events work with data-gm-event="signup-click" on any element or window.ghostmetrics.track('name', { section: 'pricing' }) from code.
Disclosure: GhostMetrics is built by Null Agency and we use it on this site, so we are not a neutral party about our own product. The definitions of entry and exit above describe how GhostMetrics counts them and differ in places from other tools; check each tool's current documentation before comparing numbers across products.