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:
- What is the denominator? A rate without one is a claim without evidence.
Our
totalis 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. - Is the population what I think? See case study 1 — 69% of one account's "visitors" were crawlers.
- Could the causality run backwards? The buyers-were-already-customers trap, above.
- Does zero mean zero, or does it mean not-measured? Our own
is_botcolumn 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.