# Why attribution covers less than you think

**Three measured ceilings on first-touch attribution, and how to tell whether a
number you are reading is a finding or an artefact.**

---

Every analytics product shows you a channel breakdown. Almost none tell you
what fraction of traffic that breakdown describes. On a pilot account the
honest answer was **6.5%**, and on two of three accounts it was **0%** — the
chart rendered blank and looked like a bug.

Here are the three things that cap it, measured rather than assumed.

---

## 1. The pixel misses the landing page-view

**76% of unattributed human visitors have a self-referral as their first
recorded event.**

The pixel loads asynchronously. On the page a visitor arrives at — the one
carrying `?utm_source=…` and the external referrer — the script frequently has
not executed by the time they click through. The first event we record is the
*second* page, whose referrer is the customer's own domain.

We checked the two obvious alternative explanations and both were wrong:

- **Identity churn?** No: 1.00 ids per session. Visitors were not fragmenting.
- **Session loss?** No.

It is simply that the arrival is the hardest page-view to capture, and it is
the only one that carries the attribution.

**This is a real ceiling, not a bug to fix.** Any first-touch number you read
should be understood as "of the visitors whose arrival we caught".

## 2. Attribution only describes visitors who carried campaign data

The channel breakdown is built from events with campaign context. Where the
traffic is organic, direct, or arrives without parameters, there is nothing to
attribute — and the page rendered an empty chart rather than saying so.

Silence reads as "no data exists". It should read as "this describes 6.5% of
your traffic". We now show the coverage figure next to the chart, because a
number without its denominator is not an answer.

## 3. Revenue attribution has a much lower ceiling than visit attribution

Connecting a visit to an order requires an identity that appears on both sides.

```
0.9%  of revenue joinable via email
      order_id works as a second bridge
      user_id is a useless grain — do not build on it
```

And a subtler trap, which is the one most likely to produce a confident wrong
conclusion:

**85.6% of buyers were already customers before we ever saw them.**

If you compute "identified visitors convert at X%" over all buyers, you are
mostly measuring people who had already bought before the pixel existed. The
causality runs backwards. Filter to visitors whose first session predates their
first order, or the number means nothing.

---

## Identification yield is a property of your audience, not your setup

Two accounts, identical configuration, same pipeline:

```
Account A   ~50% of visitors matched to a person
Account B      0 of 313 visitors matched
```

Nothing was misconfigured on B. Identification depends on whether your visitors
appear in the data our providers have, which is a property of *who visits you* —
geography, device, whether they are logged into the ecosystems that feed the
graph.

**Configuration parity does not buy identification parity.** If you are
comparing two properties, compare their audiences before concluding one is
broken.

---

## How to tell a finding from an artefact

Before acting on any number in a dashboard — ours or anyone's — ask four
questions:

1. **What is the denominator?** A rate without one is a claim without evidence.
   Our `total` is capped at what your plan permits, not the raw row count, so
   rates computed against it are wrong by construction. That is documented, and
   it is the sort of thing worth checking in any tool.
2. **Is the population what I think?** See [case study 1](./most-of-your-visitors-were-not-people.md)
   — 69% of one account's "visitors" were crawlers.
3. **Could the causality run backwards?** The buyers-were-already-customers
   trap, above.
4. **Does zero mean zero, or does it mean not-measured?** Our own `is_bot`
   column was NULL on 28.9% of rows, and the intent score is 0 for 87.8% of
   visitors — which is *correct*, because most visitors genuinely show no
   intent signal. One of those zeros is a measurement; the other is an absence.

The product's job is to make those distinguishable. Where we have not yet, the
honest thing is to say so on the page rather than render a confident chart.
