A funnel tells you how many people who started on one page reached another. Here is exactly what a cookieless two-point funnel counts, what it cannot, and how to set one up.
A conversion funnel answers one question: of the people who started here, how many got there? GhostMetrics answers it for exactly one pair of pages. You give it an entry page and a goal page, and it reports how many sessions began on the first and also viewed the second. Anything more elaborate belongs in a different tool.
A funnel is a sequence of steps with a count at each one. The first count is everyone who entered, and each later count is the subset who got that far. The gap between two counts is drop-off, and the ratio of the last count to the first is the conversion rate. The shape matters more than the headline rate: a funnel that loses most visitors between the landing page and the pricing page is a different problem from one that loses them between pricing and signup.
Most real funnels have more than two steps. A shop has product, cart, checkout and payment. A SaaS has landing page, pricing, signup form and confirmation. Tools that build these usually identify the person across steps, either by a cookie or a user ID, so they can follow one visitor through all four screens and tell you where that visitor stopped.
A cookieless tool makes a different trade. GhostMetrics has no cookie, no visitor ID and nothing that persists past a day, so it cannot follow a person. What it can do is group pageviews that share a daily hash and ask a set question: of the groups that started on page A, how many also touched page B? That is a coarser instrument, and the rest of this guide is about using it for what it is good at. If you want the wider picture of which numbers to collect first, our guide to measuring website traffic covers the basics.
The tab has two panels. The first is Conversion Funnel: a field labelled Entry Page (pre-filled with /), an arrow, a field labelled Goal Page (placeholder /signup) and an Analyze button. The second is Top Entry → Exit Paths, a table that fills in on its own.
Leave the goal blank and Analyze answers "Enter a goal page". Leave the entry blank and it falls back to /. With both filled in, the dashboard requests the funnel for the period you have selected (24h, 7d, 30d or 90d) and draws three rows:
The arithmetic is plain. Entries are the distinct sessions with an entry-flagged pageview on the entry page inside the window. Conversions are the distinct sessions among those that also have a pageview on the goal page. Drop-off is entries minus conversions. The rate is conversions divided by entries, times 100, rounded to one decimal place. Two small display rules: the period is a rolling window counted back from now, not calendar days, and large counts are abbreviated in the bars (1,500 shows as 1.5K).
This table needs no input. It lists up to 20 pairs of Entry Page and Exit Page, ranked by distinct sessions, for the selected period. A pair appears when a session has an entry-flagged pageview on one page and an exit-flagged pageview on another (or the same) page. The exit flag is set when a page's leave beacon arrives, which is the same mechanism that produces time on page; our entry and exit pages guide explains it. Read this table as a menu of candidate funnels: the top rows tell you which landing pages people start on, which is exactly the thing the Entry Page field needs.
When there is not enough data, the table says "Not enough session data yet".
This is the part that decides whether you can trust a number, so it gets its own section. The word "session" appears twice in GhostMetrics, and the two meanings are not the same thing.
The entry flag comes from the browser tab. The tracker keeps a pageview counter in sessionStorage, which belongs to one tab and is cleared when the tab closes. The first pageview in a tab has a depth of 1 and is sent with the entry flag. Later pageviews in that tab, including single-page-app route changes, are never entries.
The grouping comes from a daily hash. When the server receives any beacon, it computes a short hash of a secret daily salt, the site ID, the visitor's IP address and the browser's user-agent string, and stores only the hash on the row. The salt is replaced every UTC day, and the old one expires from storage after two days. The funnel joins rows on that hash, so a "session" in the funnel is "everything this IP and browser did on this site today".
Put the two together and the funnel's rules follow directly.
| Situation | What the funnel does | Why |
|---|---|---|
| Same person opens the entry page in three fresh tabs on one day | Counts one entry session | Entries are counted as distinct hashes, and all three tabs share one |
| Goal page was viewed before the entry page, same day | Still counts as a conversion | The goal join compares hashes, not timestamps |
| Landing on the entry page on Monday, reaching the goal on Tuesday | Not a conversion | The hash changes at the UTC day boundary, so the two rows cannot be joined |
| Visitor's IP address changes mid-visit (switching from Wi-Fi to mobile data) | Possible under-count | A new IP gives a new hash, so the goal row does not match the entry row |
| Two people on one office network with identical browsers | Counted as one session | Same IP and same user-agent string give the same hash |
| Entry page and goal page are the same path | Reads as 100% | The entry row also satisfies the goal condition |
None of this makes the funnel useless. For a landing page that sends traffic to a signup page, the same-day, same-browser grouping is close to what you would call a visit, and the two error directions (shared networks merge sessions, network switches split them) are both small for most sites. It does mean the output is a ratio you compare against itself over time, not a precise count of people.
Two more details. The goal is matched against every stored pageview row for the site, so a single-page-app route change that the tracker sees (it listens for history pushes and back/forward navigation) counts as a view of the goal path just like a full page load. And the goal row has no entry requirement: any pageview on the goal path counts, whether or not it was a landing.
location.pathname: the path only, with no domain, no query string and no hash. So /pricing?plan=pro is stored as /pricing. Matching is an exact string comparison, so include the leading slash and match any trailing slash your site uses: /pricing and /pricing/ are different goals, and the dashboard does not normalize either.A caution on step 5. Each run is a new, independent question, not a step in a path. A homepage-to-pricing rate of 18% and a homepage-to-signup rate of 2% do not multiply or nest, and the signup number may include visitors who skipped pricing entirely.
These numbers are illustrative, not benchmarks. A small SaaS runs three funnels over 30d, all starting at the homepage /.
| Goal page | Entry sessions | Converted | Drop-off | Rate |
|---|---|---|---|---|
/pricing | 846 | 152 | 694 | 18.0% |
/signup | 846 | 41 | 805 | 4.8% |
/welcome | 846 | 29 | 817 | 3.4% |
Each row is computed the way the code does it: converted divided by 846, times 100, rounded to one decimal (152 / 846 = 17.97%, shown as 18.0%). The three rows are separate funnels with the same denominator, so you can compare them directly. Of 846 sessions that landed on the homepage, 152 viewed pricing, 41 viewed the signup page and 29 reached the welcome page, which the app shows after signup.
Three readings, none of which need a path tool. First, 29 of the 41 sessions that viewed the signup page also reached the welcome page, roughly 71%. That is a comparison of two funnels, not a measured step, so treat it as approximate. Second, 41 signup views against 152 pricing views suggests that most pricing viewers never open the form, which is where to look at the pricing page. Third, some of those 41 sessions may never have seen pricing; the funnel cannot say.
A second funnel, from a blog post that ranks in search: 640 entry sessions to the signup page and 9 converted is 1.4%, with a drop-off of 631. Set beside the homepage's 4.8%, it suggests the post attracts readers more than buyers, which is a reason to put a clearer next step in the post, not necessarily to rewrite it.
The funnel's goal has to be a page path. That works when your conversion ends on a confirmation page, such as /welcome or /thanks. It does not work when the conversion is a click or a form submission that stays on one page, because there is no new pageview to count.
Custom events cover that case from the other side. A data-gm-event="signup-click" attribute records a click on any element, and window.ghostmetrics.track('name', { section: 'pricing' }) records one from code. They are stored in their own table, keyed by site, page path, event name, optional section and the session's UTM values. The Funnel tab never queries that table, so an event cannot be a funnel goal, and the Custom Events panel shows each event's count and when it last triggered, not who triggered it.
The practical pattern is two readings side by side:
/signup over 30d gives you the share of landings that reached the form page.signup-submit event on the form button gives you the number of submissions in the same period.Divide the second by the first entry count for a rough end-to-end rate, and treat it as a rough one: the event counts every click, not distinct sessions, and it is not restricted to sessions that started on the homepage. The custom events guide has the setup, and the UTM guide explains how campaign tags travel with an event within one tab session.
If your thank-you page exists, prefer it as the goal. A page view is a distinct-session count, while an event is a raw count, and distinct sessions are the cleaner numerator for a rate.
These are the limits to know before you base decisions on the tab:
| Capability | GhostMetrics Funnel tab | GA4 funnel exploration |
|---|---|---|
| Number of steps | Two: entry page and goal page | Multiple steps; check current docs for the limit |
| Step type | Page paths only | Events and conditions, including page views |
| Step order enforced | No | Yes, steps are sequential, with open and closed funnel options; check current docs |
| Segmenting and breakdowns | None in the tab; use landing pages | Segments and breakdowns available |
| Follows a person across days | No; the session hash changes daily | Yes, through a client ID cookie (consent applies in the EU and UK) |
| Ads and ecommerce attribution | Not available | A genuine strength |
| Setup effort | Type two paths | Define events, mark conversions, build an exploration |
If your business depends on a four-step checkout, on ad-spend attribution or on following the same customer across a week, GA4 is the right instrument and you should use it. Our GA4 alternative guide and Google Analytics alternatives roundup lay out the trade-offs, and the migration guide covers what to keep running while you move.
For a content site, a docs site or an early SaaS, the two-point funnel is often enough. It tells you whether a landing page is sending people to the page that matters, it does so without a cookie banner, and it takes half a minute to set up. That is the honest scope: a set-level question answered quickly, not a path reconstruction.
GhostMetrics gives you an entry page to goal page funnel, a table of top entry-to-exit paths, custom events for clicks that stay on one page, and the raw rows if you want to recompute anything. 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. It has no multi-step funnel builder; if you need one, use GA4.
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 funnel features are set by Google and change over time; check the current Google Analytics documentation before relying on specifics. The numbers in the worked example are illustrative, not benchmarks.