Deeplinkly

Glossary/Attribution mechanics

Cross-device attribution

Definition

Cross-device attribution is the practice of crediting a conversion that happens on one device to an advertising touch that happened on a different device belonging to the same person, which requires an identity that both devices share.

Every identifier the platforms give you is scoped to one device, so cross-device attribution is not a harder version of ordinary attribution — it is a different problem with one reliable solution. That solution is a logged-in identity you observe on both devices. Everything else on offer is either a walled garden reporting an aggregate back to you, or probabilistic matching whose accuracy nobody can verify. This is distinct from cross-platform attribution, which is about reconciling iOS, Android and web measurement regimes for one campaign.

Why no device identifier can do this

Every mainstream identifier is device-scoped, which is the whole difficulty.
IdentifierScopeBridges two devices?
IDFAOne iOS deviceNo
IDFVOne vendor, one iOS deviceNo
GAIDOne Android deviceNo
App Set IDOne developer, one Android deviceNo
First-party cookieOne browser, one deviceNo
SKAdNetwork postbackOne install, aggregatedNo
Your own user IDThe personYes

The last row is the entire answer, and it explains why the vendor conversation about cross-device so often ends in vagueness. A measurement partner has access to the same device-scoped identifiers you do. If they claim cross-device without asking you to send them a user identity, they are either reporting a platform's aggregate back to you or inferring the link from signals like IP address and user agent — which is fingerprinting under a friendlier name.

The four available methods, honestly rated.
MethodBasisUser-level outputLimit
Login identityA user ID you observe on both devicesYesOnly logged-in users
Walled-garden graphThe platform's own logged-in usersNoAggregate, their platform only
Data clean roomHashed identifiers matched in a neutral environmentNoBoth sides must have the identity
Probabilistic graphIP, user agent, timingClaimedUnverifiable; ATT-prohibited

Cross-device coverage is capped by your login rate

If 30% of users log in, deterministic cross-device attribution can see at most 30% of journeys, and no configuration changes that. This is the number to establish before buying anything: a vendor promising full coverage on a 30% login rate is promising inference. Raising the login rate is the only lever that raises the ceiling.

The stitch: anonymous identity to known identity

The implementation is the same on every surface. Assign an anonymous identifier on first touch, record every event against it, and when the user authenticates, emit an alias that binds that anonymous identifier to the durable user ID. The alias is what lets you re-attribute a history recorded before you knew who someone was.

Web: the touch that happens before anyone logs in
// First touch. No identity yet, so record the campaign against an
// anonymous id that persists in first-party storage.
const anonymousId = getOrCreateAnonymousId();

track({
  anonymousId,
  event: "campaign_click",
  campaignId: new URLSearchParams(location.search).get("cid"),
  clickId: new URLSearchParams(location.search).get("click_id"),
});

// Later, possibly days later, on the same browser.
async function onLogin(userId) {
  // The alias is the whole mechanism. Without it the campaign_click
  // above stays orphaned and the conversion looks organic.
  await identify({ anonymousId, userId });
}
App: the same user ID, on a different device
// The app has its own anonymous id — a different device, so a
// different value. It must send the identical userId string.
func onAuthenticated(userId: String) {
    // Normalise before hashing or sending: trim, lowercase.
    // "User@Example.com " and "user@example.com" must not become
    // two identities, which is the most common stitch failure.
    Deeplinkly.identify(userId: userId)
}

func onPurchase(amount: Decimal, currency: String) {
    // Attributed by identity, not by this device's click history —
    // there was no click on this device.
    Deeplinkly.track(event: "purchase", value: amount, currency: currency)
}
The join that produces the cross-device credit
-- Resolve every anonymous id to a person, then credit the
-- conversion to the campaign touched on ANY of their devices.
WITH identity AS (
  SELECT anonymous_id, user_id
  FROM identity_alias
  QUALIFY ROW_NUMBER() OVER (
    PARTITION BY anonymous_id ORDER BY aliased_at DESC
  ) = 1
),
touches AS (
  SELECT
    COALESCE(i.user_id, t.anonymous_id) AS person,
    t.campaign_id,
    t.device_id,
    t.occurred_at
  FROM campaign_touch t
  LEFT JOIN identity i USING (anonymous_id)
),
conversions AS (
  SELECT
    COALESCE(i.user_id, c.anonymous_id) AS person,
    c.device_id AS converting_device,
    c.revenue,
    c.occurred_at
  FROM conversion c
  LEFT JOIN identity i USING (anonymous_id)
)
SELECT
  t.campaign_id,
  COUNT(*)                                          AS conversions,
  SUM(c.revenue)                                    AS revenue,
  -- The share of credit that only a cross-device join can see.
  AVG(CASE WHEN t.device_id <> c.converting_device
           THEN 1 ELSE 0 END)                       AS cross_device_rate
FROM conversions c
JOIN touches t
  ON  t.person = c.person
  AND t.occurred_at <= c.occurred_at
  AND t.occurred_at >= c.occurred_at - INTERVAL '7' DAY
GROUP BY t.campaign_id;

The cross_device_rate column is the one worth reporting to whoever asked for this. It states, as a measured fraction rather than a vendor claim, how much credit the join actually moved — and it is usually far smaller than expected, which is a useful correction before anyone builds a strategy on it.

Double counting, and the windows that cause it

A single person with three devices generates three touch histories, and a naive join credits the conversion once per matching touch. The query above already guards against the worst of it with an attribution window and a single conversion row, but the design decision cannot be avoided: when touches on two devices both precede one conversion, which gets the credit?

Credit rules and what each one distorts.
RuleEffect across devices
Last touchFavours the converting device, usually mobile
First touchFavours the discovery device, usually desktop
Credit every matching touchDouble counts; totals exceed conversions
Multi-touch fractionalNo inflation, but no single source of truth

Do not blend cross-device results into SKAdNetwork numbers

SKAdNetwork reports at the install level with no identity and its own timers, so it cannot participate in an identity join at all. A cross-device figure and a SKAN figure are two measurements of different things, and adding them produces a number that describes neither. Report them side by side, which is the cross-platform discipline.

The privacy position is worth stating plainly, because it is the part that gets teams into trouble. Stitching identities you were given — a user logging into your own product on two devices — is first-party data handling, and the consent you need is the ordinary consent for processing account data. Inferring that two devices belong to one person from IP address and user-agent similarity is a different act, it is what ATT exists to govern, and it is not made acceptable by a vendor performing it on your behalf.

UTM builder

A cross-device join is only as good as the campaign identifiers on both sides of it. The builder produces consistently encoded parameters so the desktop touch and the app conversion carry the same campaign key rather than two spellings of it.

Open the utm builder

Frequently asked questions

What is cross-device attribution?
It is crediting a conversion that happens on one device to an advertising touch that happened on another device belonging to the same person — a desktop ad click followed by a purchase in a phone app, for example. Because every advertising identifier is scoped to a single device, it requires an identity such as a logged-in user ID that you observe on both devices.
Why can't the IDFA or GAID be used for cross-device attribution?
Both are device-scoped by design: one physical device has one IDFA or one GAID, and a second device belonging to the same person has an entirely unrelated value. There is no field in either identifier that relates it to another device, so no query can join them. The same is true of the IDFV, the App Set ID and first-party cookies.
How accurate is cross-device attribution?
Deterministic identity stitching is exact for the users it covers, and its coverage is capped by your login rate — a 30% login rate means at most 30% of journeys can be resolved. Probabilistic identity graphs claim broader coverage from signals like IP address and user agent, but that accuracy cannot be independently verified by the advertiser paying for it, and the technique is prohibited on iOS under ATT.
What is an identity alias and why does it matter?
An alias is a record binding an anonymous identifier assigned on first touch to the durable user ID learned at login. Without it, every event recorded before authentication stays orphaned, so a campaign click that happened days before signup cannot be connected to the conversion and the install appears organic. The alias is what makes pre-login history attributable.
Does SKAdNetwork support cross-device attribution?
No. SKAdNetwork reports at the install level with no user identity, aggregates results to protect anonymity, and delivers postbacks on its own timers, so there is nothing in a postback that could be joined to activity on another device. Cross-device figures and SKAdNetwork figures measure different things and should be reported side by side rather than combined.

Related terms

  • Cross-platform attributionCross-platform attribution is the practice of measuring one advertising campaign across iOS, Android and the web, where each platform supplies a different attribution signal at a different level of granularity and the results cannot be directly summed.
  • Deterministic attributionDeterministic attribution credits an install to a specific click by matching an identifier that is present in both records, producing a one-to-one link rather than a statistical estimate.
  • Multi-touch attributionMulti-touch attribution distributes the credit for a conversion across several of the marketing touchpoints that preceded it, rather than assigning all of it to a single first or last interaction.
  • Attribution windowAn attribution window is the length of time after an ad click or impression during which a resulting install or conversion is still credited to that ad interaction.
  • Fingerprint attributionFingerprint attribution matches an install to a click by building a signature from device and network characteristics such as IP address, screen dimensions, OS version and locale, rather than from an identifier either party consented to share.