sixtysteps.co

Why do my analytics show sessions that were never a real person

By Ryan Richardson · Published 8 October 2026

Because collectors record everything that hits the server, including prefetchers, scanners and bots, and that's correct behaviour. On one split test, about 30% of raw sessions were phantoms. Filter them at read time using an engagement signal, never at collection, so the definition can change later without losing data.

What this step is

Filtering phantom sessions at read time is step 47 (Part VII), marked moderate difficulty, almost nobody does this, with partial tooling support. The partial rating matters: most analytics suites filter only a published list of known bots, which a headless browser with a normal user agent walks straight through.

The number, and why it has no single value

In one split test, about 30% of raw sessions were phantoms: prefetchers, scanners and bots registering a session and leaving without drawing a page. A shorter forensic window came back higher. A cut against paid clicks alone came back lower. There isn't one real number, so the denominator has to be stated every time a phantom rate is quoted, or the figure is worthless.

A separate, earlier read on the same kind of problem found a hard spike at 23 seconds: 274 page loads, zero scroll, zero engaged time, that looked like a performance problem and wasn't. It was a measurement full of ghosts, and real time got spent chasing a page issue that didn't exist.

The four-signal check

No single tell is enough on its own; all four together is near certain: traffic source showing as direct or not-set, a country outside the advertised markets, an engagement rate of exactly zero, and one page per session. Acting on any single signal alone deletes real people along with the bots.

The read rules

Absence is the tell: no page drawn, no scroll, no active time is not a person. Require a sign of life before a session enters any denominator (a scroll past a quarter, ten seconds of active time, or a click). Collect everything, filter only when reading, because filtering at collection deletes the data for good while filtering at read time lets the definition change later. Read through one saved view, so two people always get the same number.

Where it breaks

Filtering at collection instead of read time, which deletes the raw data permanently. Over-filtering, which deletes real people on slow connections and flatters the funnel. Under-filtering, the default, which makes everything read worse than it is.

The numbers
ClaimValueSource
Share of raw sessions that were phantoms in one split testabout 30%The Sixty Steps manuscript
Page-load spike later traced to a measurement artefact274 loads at a 23-second spike, zero scroll, zero engaged timeThe Sixty Steps manuscript
Four-signal phantom signaturedirect/not-set source; country outside advertised markets; zero engagement rate; one page per sessionMeasured in Real Money, Field Manual
Matrix status for this stepModerate difficulty, almost nobody does this, partial toolingThe Sixty Steps matrix
Go deeper

This page covers one step. The full method is in the book.

Read the full part
sixtysteps.co
AI-powered growth for what's next. Sixty Steps is Onwards Analytics — a data and analytics firm.
Pages
Home Library The book — $7 About
Start
The Teardown — free [email protected]
© 2026 Onwards Analytics Every claim on this site carries a number, or is marked as reasoning.