xavier-ramirez.com
← Writing

Your own activation platform · 00 · 19 Aug 2026 · 9 min read

How anonymous traffic becomes revenue

The chain from an anonymous session to a measured incremental dollar.

Only a small fraction of the people who visit a storefront buy something on that visit. The obvious read is that the rest are waste — bounce rate, a number to shrink. That read is backwards. That majority is the business, and everything a customer data platform does is one long attempt to keep knowing who they are, accurately enough and long enough to reach them again. This post walks the whole chain end to end, names the link everything else hangs on, and says what the six posts after it build.
01 · Spine02 · Identity resolution03 · Profiles & propensity04 · Consent & deletion05 · Activation & match rates06 · Measurement

This post is the map. Every stage below is a post.

Worked exampleThis series uses a multi-brand customer data & activation platform as its running example — clickstream from direct-to-consumer storefronts, orders, ad spend, and the audiences the platform pushes back out to ad and email destinations. The pipeline itself is domain-agnostic; the data just happens to belong to commerce brands.

The chain

One person, six hops, and every hop can lose them

It is a Tuesday. Someone opens the storefront on a laptop. They have no account, no cookie, no name. By Friday they are a row in an audience being synced to an ad destination, and by the following month they are a number in an incrementality readout. Step through every hop they make.

one person, six hops
01 / 6 · Tue

A laptop, a cookie, and no name

Someone opens the storefront. The collector sets dev_31f0a and stamps session sess_9c22. Four page views, one add to cart, no purchase.

What the platform knows now
device dev_31f0asession sess_9c225 events
How this hop loses them

A cookie the browser expires in seven days makes this person a stranger again next week.

next: a second device

Notice how much of that is bookkeeping about a person’s continuity. The events are easy. The purchase is easy. The hard part is the claim that Tuesday’s laptop, Wednesday’s phone and Friday’s order belong to one human being.

The squeeze

The identity you rented is being taken back, one layer at a time

Third-party cookies are the layer everyone talks about, and they are the least interesting one. The durable change is that the browser stopped being neutral about how a cookie was written.

who wrote the cookie

↳ A real customer comes back every week or two. Drag past 7 and watch the top lane fall apart.

cookie still valid at the next visitexpired — the visitor returns as a new device
A 10-day gap is longer than the seven-day cap, so the script-written cookie is always gone by the next visit. The same person returns 10 times and is counted as 10 separate devices, each with one session and nothing to attach an order to later.

Put a number on it. Take a thousand devices that come back after a gap of ten days. With a script-written cookie, all thousand return as new devices — a thousand strangers, a thousand first sessions, nothing to attach an order to later. With a server-set first-party cookie, the same thousand come back as themselves. Nothing about the analysis changed. The only thing that changed was who wrote the cookie.

The constraint is real and the panic is not. You lose the identity you were renting. You keep the identity you observe on your own property — provided you actually observe it well.

The spine

Every downstream number is a bet that two sessions were the same person

This is the sentence to carry through all six posts. Lifetime value, cost per acquisition, propensity, incrementality — none of them are measurements of customers. They are measurements of profiles, and a profile is whatever your resolution logic decided. Get that decision wrong and the arithmetic downstream is perfect and meaningless.

The silent version is the one to fear. Nobody files a ticket saying “identity resolution is under-merging.” They say revenue per customer looks flat, and it looks flat for a year.

The leak

You can build all of this correctly and still lose half of it at the door

Suppose the graph is right. The audience is right. Eighteen hundred profiles, hashed correctly, consented properly, pushed to a destination. The destination recognises nine hundred of them.

Match rate — keys submitted versus keys the destination recognises — is the number that tells you whether the entire pipeline was worth building. Everything upstream is invisible to the business until it survives this one join on someone else’s infrastructure.

Post 5 owns the mechanics. For now, know the name of the number.

Wrong turns

Two reasonable answers that hand away the thing you are trying to own

Governance

Consent is a join key, and deletion is a fan-out

Consent modelled as a filter is consent you can forget to apply. Somebody writes a new audience query, ships it, and it compiles membership without ever touching the consent table — no error, no failing test, just marketing sent to people who said no. Modelled as a join key it is structurally unavoidable: there is no code path that produces membership without joining consent, and the join fails closed.

Why the browser’s opt-out signal belongs at collection
A universal opt-out signal arrives as a request header on the very first call. Acting on it in the collector means the event is published already marked as not shareable, so nothing downstream has to know the signal exists. Push enforcement later and every layer you skipped is another copy you have to remember to clean.

Deletion is the mirror image. A request that deletes from your warehouse and stops there is not a deletion — the profile still sits in an audience inside three destinations you synced to last Tuesday. Doing it properly means a tombstone that fans out: delete from the warehouse, split the identity component, drop audience membership, and issue removals to every destination this profile was ever sent to. Which requires having kept a per-profile sync ledger from day one. Post 4 owns this, and it is a data-model decision, not a compliance chapter.

What the series builds

Six posts, one stage each, each with a runnable tag on the same open-source repo.

The honest framing

This is a teaching-grade reference implementation, not a product. The parts it shows you are the tractable parts: a stream consumer, a component solver, a diff engine, a hash-based holdout. The hard part in any real company is the organisational agreement about what a customer is — whether a household counts as one, whether last quarter’s consent still applies, whether a returned order still makes someone a buyer. Every one of those is a product decision wearing an engineering costume. Build the pipeline so that when the answers change, you can change them in one place.

Explain it back

Your team ships a normalisation fix: email addresses are now lowercased and trimmed before hashing, which is unambiguously correct. Two weeks later the high-intent audience has grown slightly, match rate on the ad destination is up four points, and the marketing lead says the audience has started performing worse per dollar. Nothing errored. What happened?
Reveal a model answer

The fix changed the hash of every address that previously had stray case or whitespace, so the keys you send today are not the keys you sent before. Profiles that were previously two separate people collapsed into one — good — but the sync engine diffs against a snapshot keyed by the old hashes, so it emitted a wave of adds for people the destination already had under a different key, and a wave of removes for keys that no longer exist. The destination sees heavy churn in a list it was optimising against and effectively restarts its learning phase, which is what the lead is feeling as worse performance.

The fix is to treat normalisation policy as a versioned part of the audience contract: rebuild the snapshot under the new policy in one migration, then diff against that, rather than letting a semantic change leak out as ordinary daily churn. The second-order consequence is subtler — every historical match-rate number was computed under the old policy, so your baseline for alerting is now wrong too, and the relative-drop alarm you rely on is comparing against a rate that no longer means the same thing.

Next in the series · 01
Your own activation platform: the spine

The collector, the envelope, and the topics everything else reads from — five stages at their thinnest honest version, so the later posts have somewhere to land.

Clone it and run it