Headstream

How we calculate our numbers

You should be able to check any number we show you. This page is how each one works, and what we can't see.

Metrics

Visitors (estimate)
Distinct browsers that viewed a page in this period.
Counted: One browser counts once, however many pages it viewed. A person on two devices counts twice until they're identified.
Left out: Known bots, plus any paths and IP addresses this project excludes. Repeat deliveries of the same event, matched by event ID.
Pageviews (exact)
Pages loaded in this period, including route changes in single-page apps.
Counted: Every page load and route change the script saw.
Left out: Known bots, plus any paths and IP addresses this project excludes. Repeat deliveries of the same event, matched by event ID.
Sessions (estimate)
Distinct visits. A new session starts after 30 minutes without activity.
Counted: One session per visit, by session ID.
Left out: Known bots, plus any paths and IP addresses this project excludes. Repeat deliveries of the same event, matched by event ID.
Bounce rate (estimate)
The share of sessions with exactly one pageview.
Counted: One-pageview sessions divided by all sessions.
Left out: Known bots, plus any paths and IP addresses this project excludes. Repeat deliveries of the same event, matched by event ID.
Revenue (exact)
Payments minus refunds and disputed money from Stripe, kept in an append-only ledger. Each entry is one Stripe event.
Counted: Payments. Refunds, as negative entries. Disputes, as a negative entry when Stripe takes the money and a positive one if it comes back.
Left out: Payments in other currencies, which are reported separately.

Attribution

Runs publish only after credits add up exactly to the ledger. If they don't, the run fails and the last good one stays up. Refunds and disputes are credited back to the original sale.

First touch
All credit goes to the first visit.
Last touch
All credit goes to the last visit before the payment.
Linear
Credit is split evenly across every visit.
U-shaped
40% each to the first and last visits, and 20% split across the rest. With two visits, each gets 50%.

What we can't see

  • Ad blockers can stop the script, and those visits are invisible to us.
  • Unknown bots can get through our filter.
  • One person on two devices counts as two visitors until they're identified.
  • Attribution only sees visits inside the lookback window, 90 days by default. A payment with no visit in that window stays unattributed.
  • Events from domains not on a project are counted on its data quality page. Rate-limited requests aren't counted.

Check it yourself

Every headline number links to its definition and the rows behind it. Revenue traces from the Stripe event to each credited visit, and every project has a data quality page, a change log and a full export of its raw events.

Changes to how we calculate

  • Stripe disputes now reduce revenue. Connecting or reconnecting Stripe backfills past disputes.
  • Wildcard goals such as /pricing* now match. They could report zero before, and past periods are recounted.