The anonymous-to-known gap: why you can't connect the click to the customer
Your analytics knows about visitors. Your database knows about customers. Nothing joins them — and that missing join is why acquisition attribution fails in every business with a considered purchase.
anonymous sessions + email → one person → whole journey
The gap is a missing join. Analytics stores anonymous visitors; your database stores customers with emails; nothing writes the row that says this anonymous visitor became this customer. Without it, everything before the signup is orphaned permanently.
Bridging it is one API call at the moment an email arrives. The hard part is realising it needs to exist at all.
Every company has two databases that never talk to each other.
Database one — your analytics — is full of anonymous visitors. Sessions, page paths, referrers, campaigns. It knows a great deal about behaviour and nothing at all about people.
Database two — your application — is full of customers. Emails, orders, subscriptions, support tickets. It knows a great deal about people and nothing at all about how they arrived.
The join between them does not exist. That missing join is the single largest cause of bad acquisition attribution, and it is not a browser problem, a cookie problem or a privacy problem. It is a row nobody wrote.
What it costs
Here is a customer, in one business, spread across two systems that never met:
| Day | What happened | Which database |
|---|---|---|
| 0 | Clicks a Facebook ad, browses three pages | Analytics (anonymous) |
| 0 | Leaves | — |
| 4 | Returns from a Google search, reads more | Analytics (anonymous, possibly a new visitor) |
| 4 | Subscribes to the newsletter | Both — and nothing links them |
| 11 | Clicks the email, buys for $129 | Application (customer) |
Ask “which campaign acquired this $129 customer?” and neither system can answer. Analytics saw the Facebook click but has no idea it became a customer. The application has the customer and the order but no idea a Facebook click ever happened.
The honest answer available to most companies is: we don’t know. So the sale gets credited to email, the Facebook campaign shows a CPA that gets it paused, and the machine that was generating customers gets switched off for underperforming.
The bridge
The fix is one call, at the moment an email legitimately arrives:
flowsk.identify("hello@example.com", { via: "newsletter" })
or, better, from your server where you know what actually caused it:
{
"source": "server",
"category": "identification",
"name": "lead_captured", // ← the cause, which the browser cannot know
"email": "hello@example.com",
"dedup_key": "subscriber_9182"
}
What that does is retroactive, and that is the important word. Every anonymous session that visitor ever had now belongs to a named person. Day 0’s Facebook click is no longer an orphan; it is the first touch of a customer who bought on day 11.
And it works forwards too: every future purchase by that person inherits the campaign that acquired them. Month twelve’s renewal is still credited to the ad that started it.
Why “what caused it” matters
identify(email) says we learned an email. It does not say why, and the browser has no reliable way to know.
Your server does. It knows whether this was a newsletter subscription, a gated download, an account creation, a demo request or a checkout. Those are wildly different intent signals, and having the cause on the person record is the difference between “we have 4,000 emails” and “we have 340 people who requested a demo, and here is where each of them came from.”
Where the cookie still matters
The bridge only works if the anonymous history is still there when the email arrives.
If the visitor’s id expired after seven days — which it does, in Safari, for any JavaScript-set cookie — then the day-0 Facebook click is already gone by the time they subscribe on day 4 as a “new” visitor. The join happens, but there is nothing on the other side of it.
So the two fixes are complements, not alternatives:
- A durable server-set id keeps the anonymous history alive long enough to be claimed.
- An early identification claims it, and takes over from the cookie permanently.
Get both and the seven-day cap stops being your ceiling. Get neither and every considered purchase in your business is attributed to whatever happened to be last.
The practical sequence
- Find every place an email enters your system. There are more than you think — forms, checkout, support, imports.
- Call identify from the server at each one, with the cause recorded.
- Make sure the anonymous id is durable, so there is a history to claim. See proxy setup.
- Then look at first-touch by campaign. It will not resemble your last-touch report, and the difference is what your acquisition channels were always worth.
The mechanics of merging identities — two devices, out-of-order events, one person — are covered in identity resolution.
Frequently asked questions
Doesn't GA4 do this with User-ID?
It can associate a logged-in user id with sessions going forward. What it does not do is retroactively bind the anonymous sessions that came before the signup, which is exactly the part containing the acquisition.
When should I call identify?
The first moment you legitimately have an email: newsletter, gated content, account creation, checkout. Earlier is better — the cookie only has to survive until the email arrives.
What if someone gives a fake email?
It does not matter much for attribution. The point is a stable key that binds the anonymous history to a person. A typo'd email still links the sessions; it just makes a poor mailing list entry.
What about people who never identify?
They stay anonymous, and their journey lives or dies with the cookie. That is why a durable server-set id matters — it is the fallback for everyone who never hands over an email.
Does this work across devices?
Yes, once identified on each. Two devices, two anonymous ids, one email — they merge into one person. That is the only reliable cross-device join available now that third-party cookies are gone.
See how much of your funnel needs the bridge
Describe how long your buyers take to convert. Everything past day seven depends on either a durable id or an early email.
Stop guessing which ad made the sale.
Flowsk Signals stitches the anonymous click to the email to the purchase — first-party, server-side, de-duplicated. One snippet, $29/mo, and every conversion comes with a receipt you can inspect.