1
0 Comments

How we score anonymous visitors without storing any personal data. The boring honest version

A few people asked how the visitor scoring in our analytics tool works without cookies or personal data, so here is the honest version, including the parts that do not work.

The goal: given an anonymous session, estimate how likely it is to convert, so a founder can see "these 5 sessions today are worth paying attention to" without us ever storing who the person is.

The inputs we actually use, ranked by how much they correlate with conversion in our data

  1. Number of distinct return sessions. By far the strongest. People who come back convert.
  2. Whether they hit pricing and then came back later.
  3. Depth on docs or integration pages (real intent).
  4. Path shape through the site, not just page count.

Inputs we dropped because they were noise: raw time on page (a forgotten tab ruins it), single session scroll depth on its own, device type.

How it is built

  • Every event is first party and stored against a rotating session id, not a person. No third party cookie, nothing that survives across the rotation window.
  • Scoring runs at the edge on the event stream, so the score updates in near real time without a batch job.
  • For small sites we do not use a model at all. Weighted rules beat a model until there is enough volume to train on. We only switch to a learned model once a site has real numbers.

The honest limitations

  • You are scoring a session, not a person. A high score might be a competitor doing research.
  • Without identity you cannot do true cross device. We do not pretend to.
  • Garbage in, garbage out. A site with 30 visits a day gets a score that is barely better than a coin flip, and we say so in the product.

The thing I would tell my earlier self: ship the weighted rules version first. We almost spent a month on a model that a hardcoded heuristic matched, because we did not have the data volume to train anything yet.

Anyone else building scoring on anonymous data? Curious which signals held up for you and which turned out to be noise.

on June 3, 2026