Deeplinkly

Glossary/Attribution mechanics

Multi-touch attribution

Definition

Multi-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.

Single-touch attribution is a rule that says one touchpoint caused everything and the rest caused nothing. Multi-touch replaces that with a different rule — a weighting — which is more honest about reality and no more provably correct. The value is not that MTA finds the truth; it is that it stops one channel from absorbing credit for work several channels did.

The five models, applied to the same journey

Suppose a user sees a display ad, clicks a search ad two days later, taps an influencer link on day five, and installs after an email on day six. Four touchpoints, one install, $1 of credit to distribute. Every model below is answering the same question with a different assumption baked in.

The same four-touch journey scored by each standard model. Credit sums to 1.00 in every row.
ModelDisplay (d0)Search (d2)Influencer (d5)Email (d6)Assumption
Last touch0.000.000.001.00Only the closing touch matters
First touch1.000.000.000.00Only discovery matters
Linear0.250.250.250.25Every touch is equal
Time decay (3-day half-life)0.090.150.330.43Recency correlates with influence
Position based (40/20/40)0.400.100.100.40Discovery and close matter most

Notice that display goes from 0% to 100% of the credit without a single data point changing. That is the point to internalise before choosing a model: you are picking a story about how demand is created, and the numbers follow. Anyone comparing channel ROAS across two teams using different models is comparing nothing.

Data-driven attribution is a sixth model, not an escape from modelling

Google and Meta both offer algorithmic weightings fitted to your own conversion paths. They are usually better than a fixed rule, but they are fitted on the touchpoints that platform can see, which means the platform's own inventory is the best-observed part of the journey. Treat the output as a strong opinion, not as ground truth.

Why MTA is structurally harder on mobile than on web

MTA needs a stable identity across every touchpoint. On the web, a first-party cookie or a logged-in ID usually provides one. On mobile, the journey crosses a browser, an app store and an app binary, and no identifier survives all three by default.

What actually persists across the mobile install journey.
Boundary crossedWhat survivesWhat is lost
Web page → click on your linkEverything you put in the URLNothing yet
Click → App Store / Play StoreAndroid: the install referrer. iOS: nothingiOS loses all URL parameters here
Store → first app openReferrer on Android; a clipboard or IP+UA guess on iOSAny browser cookie
First open → later sessionsYour own user ID, once setPre-login touchpoints unless stitched
Any ad network's own graphTheir logged-in identityVisibility to you — you get their conclusion only

The practical consequence is that mobile MTA is honest only for the touchpoints you tagged yourself. Everything a self-attributing network reports arrives already attributed, as a claim rather than a touch, and cannot be re-weighted by your model. That is not a bug in your pipeline — it is the deal those networks offer.

On iOS the gap is wider still. SKAdNetwork reports an aggregate winner per campaign, with no journey attached, so there is nothing to distribute. MTA and SKAN are not two views of one dataset; they cannot be combined into one number, and any tool claiming otherwise is modelling, not measuring.

Building it yourself

If every touch is logged to your own tables with a shared identity, the models above are one query each. The version below implements time decay, which is the model most teams settle on because it degrades gracefully when a journey has one touch or twenty.

Time-decay multi-touch credit with a 7-day half-life
-- Weight each touch by how recent it was, then normalise
-- so every conversion distributes exactly 1.0 of credit.
WITH touches_in_window AS (
  SELECT
    c.conversion_id,
    c.converted_at,
    t.channel,
    t.touched_at,
    POWER(
      0.5,
      DATE_DIFF(DATE(c.converted_at), DATE(t.touched_at), DAY) / 7.0
    ) AS raw_weight
  FROM conversions c
  JOIN touches t
    ON t.user_id = c.user_id
   AND t.touched_at <= c.converted_at
   AND t.touched_at > c.converted_at - INTERVAL 30 DAY
),
normalised AS (
  SELECT
    conversion_id,
    channel,
    raw_weight / SUM(raw_weight) OVER (PARTITION BY conversion_id) AS credit
  FROM touches_in_window
)
SELECT
  channel,
  ROUND(SUM(credit), 1)         AS attributed_conversions,
  COUNT(DISTINCT conversion_id) AS journeys_touched
FROM normalised
GROUP BY channel
ORDER BY attributed_conversions DESC;

The journeys_touched column matters as much as the credit column. A channel that appears in 40% of journeys but earns 8% of credit is doing real work that a last-touch report would show as zero — and a channel that earns credit only in journeys it also closed is a channel your model cannot yet distinguish from a coincidence.

When to use MTA and when not to

  • Use it when you own most touchpoints, have a stable user ID, and want to stop last-touch starving upper-funnel channels.
  • Use it for directional budget shifts between channels you tag yourself.
  • Do not use it as the arbiter between two self-attributing networks; neither will accept your weighting.
  • Do not use it on iOS install data, where SKAN gives you no journey to weight.
  • Do not use it instead of incrementality testing. MTA distributes observed credit; only a holdout tells you what would have happened anyway.

The mature position is to run MTA and incrementality together and expect them to disagree. MTA tells you how credit should be shared among the touches that happened; a geo holdout tells you which touches needed to happen at all. When a channel scores well on the first and badly on the second, the second is the one to believe.

UTM builder

A multi-touch model can only weight touchpoints it can see, and a touchpoint is only visible if its link carried consistent campaign parameters. This builds correctly-encoded URLs with a live preview, so channel and campaign values stay uniform enough to group on later.

Open the utm builder

Frequently asked questions

What is multi-touch attribution?
It is a way of distributing the credit for a conversion across several touchpoints in the user journey instead of giving all of it to the first or last one. A weighting rule such as linear, time decay or position based decides how much each touch receives, and the weights are chosen by the analyst rather than derived from the data itself.
Which multi-touch attribution model is best?
There is no model that is correct in an absolute sense, because each encodes a different assumption about how demand is created. Time decay is the most common default for apps because it handles journeys of any length gracefully and does not require choosing which positions are special. Whichever you pick, apply it consistently and state it on every report.
Why is multi-touch attribution hard on mobile?
Because no identifier survives the whole journey. The path crosses a browser, an app store and an app binary, and on iOS all URL parameters are lost at the store boundary. You can only weight touchpoints you observed, so anything a self-attributing network or SKAdNetwork reports arrives pre-attributed and cannot be re-weighted by your model.
Can I use multi-touch attribution with SKAdNetwork?
Not meaningfully. SKAdNetwork returns an aggregated winner per campaign with no journey attached and a deliberate delay, so there is no sequence of touches to distribute credit across. Report SKAN results in their own column and run multi-touch analysis only on the first-party touchpoints you tagged and logged yourself.
What is the difference between multi-touch attribution and incrementality testing?
Multi-touch attribution divides credit among touchpoints that actually preceded a conversion, which assumes the conversion needed them. Incrementality testing withholds a channel from a randomised group and measures what changes, which is the only method that separates conversions a channel caused from conversions it merely witnessed. They answer different questions and are worth running together.

Related terms

  • 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.
  • View-through attributionView-through attribution credits an install or conversion to an ad impression the user saw but never clicked, provided the conversion happens inside a view window that is usually much shorter than the click window.
  • 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.
  • Self-attributing networkA self-attributing network is an advertising platform that performs attribution on its own servers and reports the installs it claims to have caused, rather than passing a click identifier for a third party to match.