Tracking & Attribution

How Do You Track Leads Across Devices?

Cookies can't cross devices, so cross-device tracking is identity resolution. The signals that actually connect a phone session to a laptop purchase.

Quick answer

Cross-device lead tracking works by resolving identity rather than by following cookies, because cookies cannot travel between devices. You connect a phone session to a laptop session using shared identifiers — an email or phone number the person supplied on both, a durable visitor ID, a click ID seen twice, or a weaker signal like IP address plus user agent within a short window. The strength of your matching is the strength of your identifiers, not the strength of your pixel.

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

Cross-device lead tracking works by resolving identity, not by following cookies — because a cookie is stored on one device and cannot travel to another. Connecting a phone session to a laptop session requires a signal that exists on both: an email or phone number the person supplied twice, a durable visitor identifier, a click ID seen on both visits, or a weaker inference like matching IP address and user agent within a narrow window.

The practical consequence is that cross-device tracking is a function of what you collect, not what you install. A perfect pixel on both devices still produces two strangers if nothing links them.


Why do cookies fail across devices?

Because a cookie is a file on one machine, scoped to one browser on that machine.

When someone visits on their phone, the browser stores a cookie locally. That file exists on the phone. It is not synced, not shared, and not visible to a laptop, a tablet, or even a different browser on the same phone. There is no mechanism by which it could be.

So the lunchtime research session and the evening form submission are, from a cookie’s point of view, two unrelated anonymous visitors. The ad click that started everything sits on the phone session. The conversion sits on the laptop session. Last-click attribution credits the laptop’s source — usually Direct or organic — and the campaign that actually created the lead gets nothing.

This isn’t a tracking failure in the usual sense. Nothing broke. The tracking worked correctly on both devices; the two records simply have no field in common.

Three things make it worse for lead generation specifically. Consideration cycles are longer than in ecommerce, so more time passes between devices. The conversion is often a form rather than a purchase, so there’s no order record to match on afterwards. And the highest-intent research — reading comparisons, checking pricing — disproportionately happens on mobile during gaps in the day, while the actual form fill happens at a desk.


What signals can actually connect two devices?

Six, and they differ enormously in strength. The honest way to think about this is as a ladder: use the strongest signal available, and treat the weak ones as last resorts rather than as equals.

1. A shared visitor identifier. The strongest signal, but only within a browser — this is what recognises a returning visitor on the same device. It anchors everything else; without it you’re re-identifying strangers on every visit.

2. Email address. The workhorse of cross-device matching. If the person supplied an email on the phone (a newsletter signup, a partial form) and the same email on the laptop, the two sessions are provably the same person. Deterministic, and as reliable as identity matching gets.

3. Phone number. The same logic, and valuable because it fails differently from email. People maintain work and personal email addresses and use them in different contexts; almost nobody has two phone numbers they use interchangeably. Collecting both roughly doubles your chance of a deterministic match.

4. IP address plus user agent. A probabilistic signal, useful within a short window. Two sessions from the same IP with the same browser and OS a few minutes apart are plausibly the same person. Over a longer window, or on a shared network, they plausibly aren’t — an office, a household, or a mobile carrier range will produce false merges if this tier is trusted too far.

5. Device fingerprint. A hash of stable browser and device characteristics. It re-identifies a browser that cleared its cookies, which is genuinely useful, but it identifies a browser, not a person — so it doesn’t bridge devices on its own, and it needs a bounded window and a cap on how many sessions it can merge, or a common configuration will collapse strangers together.

6. Click identifier seen twice. If the same gclid or fbclid appears on two sessions, the same ad click landed in both — usually because a link was shared, reopened, or resumed on another device. Narrow, but decisive when present.

The ordering matters more than the list. A wrong merge is worse than no merge, because it doesn’t produce a gap in your data, it produces confident, wrong data: one person’s journey stitched onto another’s purchase. Any system that treats these six as interchangeable will report a higher match rate and a less truthful one.

Six identity signals arranged as a ladder from deterministic to probabilistic, with the strongest signals resolving first


Is device fingerprinting a good solution?

It’s a useful tier and a bad foundation, and it’s worth being precise about why.

Fingerprinting infers a device from characteristics the browser exposes — screen dimensions, timezone, language, rendering behaviour. It’s genuinely effective at recognising a browser that cleared its storage, which makes it a reasonable last resort behind deterministic signals.

Three limits, though. It identifies a browser rather than a person, so it doesn’t solve the cross-device problem it’s often sold as solving. Its accuracy decays as browsers actively reduce the entropy available — this is a moving target by design, not a stable technique. And common configurations collide: a stock laptop model running a default browser in a common timezone produces a fingerprint shared with many other people.

Which is why a bounded window and a hard cap on how many sessions a single fingerprint may merge aren’t optional refinements — without them, the tier quietly generates false identities at scale.


What can you do to improve cross-device matching?

Four things, and the first one matters more than the other three combined.

Ask for a second identifier. Every deterministic match depends on the person having given you something twice. A form collecting only an email has one chance; one collecting email and phone has two that fail in different circumstances. This costs some completion rate and it’s the single highest-leverage change available.

Capture identifiers before the conversion, not at it. If the only email you ever see arrives at the final step, every earlier session stays anonymous and can only be joined backwards. Capturing an identifier earlier in the funnel means the journey is already attached to a person by the time they convert.

Make the visitor identifier durable. Much of cross-device matching is actually multi-session matching that happens to span devices. A visitor ID written by JavaScript is capped at seven days in Safari; one set by the server as a first-party cookie isn’t. That difference decides whether a three-week consideration cycle can be joined at all.

Normalise before comparing. John.Smith@Gmail.com and johnsmith@gmail.com are the same mailbox and won’t match as strings. Phone numbers arrive in several formats for the same number. Normalising both sides — lowercase and trim for email, E.164 for phone — recovers matches that were always present in the data.


How does PartialLeads stitch cross-device leads?

By resolving every session into a person-level cluster across six ranked tiers, and by capturing identifiers early enough that the deterministic tiers have something to work with.

Capture as they type, not on submit. The tag records form fields on input with a short debounce, and flushes any pending field when the page is hidden or the form is submitted. A visitor who types an email on their phone and abandons has already supplied a deterministic match key for a purchase they make later on a laptop.

A six-tier cluster resolver. Sessions are unioned into one person by visitor ID, email, phone, IP plus user agent, device fingerprint, and click ID — in that order of confidence. Strong signals resolve first; weak ones only get consulted when nothing better exists.

Bounded weak tiers. The device-fingerprint tier operates inside a 90-day window and is capped at a fixed number of sessions it may merge, specifically to bound false merges. This deliberately costs some matches. That trade is the right way round.

A durable, ITP-resistant visitor ID. Stored in localStorage with a first-party cookie backup, and the cookie is set by the server rather than by script — so Safari’s seven-day cap on script-written cookies doesn’t apply. Long lead cycles stay joinable.

Visit-sibling inheritance for the within-visit breaks. Not every split journey spans days. A session that loses its attribution mid-visit can inherit it from a sibling session on the same client, IP and user agent within a 30-minute window. There’s a second variant for the case that defeats plain IP matching: the same browser with a matching ad-click cookie within ten minutes, with the IP allowed to differ — which is what happens when a phone drops off wifi onto mobile data partway through a checkout.

Normalisation handled centrally. Email is lowercased and trimmed; phone is converted to E.164 with a country-code fallback derived from the session’s geography. One canonical builder rather than per-call-site handling.

The stitched journey is visible per lead. The leads list renders each touch as a badge, so a row reads as a sequence — and the ring treatment on each badge encodes how that session was joined to the person, separately from which channel it came from. You can see that a session was matched by phone rather than by cookie without opening the record.

Honest boundaries. Three. A person who researches on a device you never saw, converts in a private window, and supplies an identifier you’ve never received is genuinely unmatchable — no method resolves that without guessing, and guessing is what produces confidently wrong attribution. The weak tiers are deliberately bounded, which means some real matches are declined to avoid false ones. And fingerprinting identifies a browser, not a person; it is a recovery tier for cleared storage rather than a cross-device solution.

The same phone switching from wifi to mobile data mid-checkout: the IP address signal no longer matches, while the browser and the ad-click cookie still do, so the attribution is held

Problem PartialLeads mechanism Where you see it working
Cookies can’t travel between devices Person-level cluster across six ranked identity tiers Journey ribbon showing multiple sessions on one lead
No identifier captured before the person leaves Field capture on input with a terminal flush on hide or submit Partial leads carrying email or phone
One identifier, one chance to match Email and phone treated as independent deterministic tiers Match recorded against the tier that resolved it
Safari drops the visitor ID after seven days Server-set, ITP-durable first-party cookie Same visitor recognised weeks later
Weak signals create false identities Fingerprint tier bounded by a 90-day window and a merge cap Fewer, more trustworthy merges
Phone switches wifi to mobile data mid-checkout Cellular-handoff inheritance: same browser and click cookie, IP allowed to differ Attribution held across the network change
Formatting breaks otherwise-valid matches Email lowercased and trimmed, phone normalised to E.164 Matches that string comparison would miss
No way to tell how a session was joined Stitch tier encoded in the journey badge treatment Leads list, without opening the record

Tell us what's broken. We'll fix your tracking — free.

Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.

Sources

  1. WebKit — Tracking Prevention in WebKit: https://webkit.org/tracking-prevention/
  2. Mozilla Developer Network — User-Agent header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/User-Agent
  3. Wikipedia — E.164 international telephone numbering plan: https://en.wikipedia.org/wiki/E.164
  4. Google Ads Help — About auto-tagging: https://support.google.com/google-ads/answer/3095550

Frequently asked questions

QCan you track a user across devices without them logging in?
Partially, and only through inference. Deterministic matching needs a shared identifier — an email or phone the person supplied on both devices — which usually means a form rather than a login. Without one, you're left with probabilistic signals like IP plus user agent, which are useful within a short window and unreliable beyond it. Honest cross-device tracking depends on collection, not on cleverness.
QDoes cross-device tracking work on iOS?
The deterministic part does. Identifier-based matching happens on your server, so it isn't affected by browser privacy rules at all — an email is an email regardless of platform. What iOS and Safari restrict are the cookie and storage signals underneath, which shortens how long a returning visitor stays recognisable. A server-set first-party cookie survives considerably longer than a script-written one.
QWhat's the difference between deterministic and probabilistic matching?
Deterministic matching uses something the person gave you — an email, a phone number — so a match is a fact. Probabilistic matching infers a connection from circumstantial signals like IP address, device characteristics and timing, so a match is a judgement with an error rate. Both are legitimate; the mistake is presenting probabilistic matches with the same confidence as deterministic ones.
QHow accurate is cross-device matching?
It depends entirely on which tier resolved the match, which is why a single accuracy figure would be meaningless. An email match is as accurate as the email being the same person's — effectively certain. An IP-plus-user-agent match within minutes is usually right; the same match across a day on an office network often isn't. Judge accuracy per tier, and be suspicious of any tool that reports one overall number.
QWill identity resolution merge two different people by mistake?
It can, and preventing it is the main design constraint. Shared networks, shared devices and common browser configurations all produce signals that look like one person and aren't. This is why weak tiers need time windows and merge caps, and why matching should be ranked rather than treated as a pool of equal signals. A false merge is worse than a miss, because it produces confident data pointing the wrong way.
QDo I need a CDP to do cross-device tracking?
No, though a customer data platform is one way to get it. The underlying requirement is an identity graph — a store of which identifiers belong to which person, with confidence attached — plus somewhere to apply it during attribution. That capability is built into some attribution tools directly. The question to ask a vendor isn't whether they have a CDP, it's which signals they match on and in what order.
QWhy does my lead's journey show "Direct" for the converting session?
Usually because the converting session genuinely had no source — the person arrived on a different device, or returned by typing your domain, so no campaign parameters were present. Direct isn't a channel, it's an absence of evidence for that one session. If the earlier session that carried the ad click is stitched into the same person, the journey can show the real origin even though the converting visit had nothing on it.

Find the qualified leads your forms are currently throwing away.

Install PartialLeads on one landing page, send traffic, and compare what your CRM captured against what PartialLeads recovered and qualified.