Mobile app attribution: every method, and what each one can’t see
Every mobile attribution method is a camera pointed at the same event — an install — from a different angle. None of them sees the whole scene. The teams that get attribution wrong usually aren’t using a bad method; they’re using one method and believing it’s the scene.
Here is the full set, what each one actually measures, and the blind spot each one carries. The blind spots are the point: they tell you which methods you need next to each other.
Deterministic last-click (the MMP backbone)
The method: a click on an ad carries an identifier through to the store and the install; your mobile measurement partner matches the two and books the install to the clicked ad. When the chain is intact — a tracked link, a same-device journey, a cooperative network — the match is exact, install-level, and fast. This is the backbone of Adjust and AppsFlyer, and for the channels it can see, it’s the sharpest camera in the set.
The blind spot: it only sees clicks it can instrument. A podcast read, a TikTok video watched but not clicked, a friend’s recommendation, a creator mention — none of these produce a tracked click, so the installs they drive get booked as “organic.” Last-click doesn’t report dark channels as uncertain; it reports them as nothing, which reads as certainty. The dashboard looks complete precisely where it’s most wrong.
SKAdNetwork and AdAttributionKit (Apple’s lane)
The method: Apple’s SKAdNetwork framework — and AdAttributionKit, its successor — attributes installs to ad networks without identifying the user — the network gets a delayed postback with coarse, privacy-thresholded conversion data. It’s the system of record for iOS paid UA whether you like it or not, and on its own terms it’s trustworthy: the postback came from Apple, not from a network grading its own homework.
The blind spot: granularity and coverage. Postbacks are network-level, delayed, and subject to crowd-anonymity thresholds that null out small campaigns. And the framework only covers ads in participating networks — it has nothing to say about every non-paid, non-network way a person finds an app, which is most of the ways. SKAN tells you which network drove paid installs; it cannot tell you what share of your growth paid networks drove at all.
Probabilistic matching
The method: when no identifier survives the journey, infer the match from circumstantial signals — timing, device characteristics, network context. It fills gaps deterministic matching leaves on iOS.
The blind spot: it’s an inference, and the platform owner has been narrowing the inputs for years. Accuracy decays as signals get coarser, you can’t tell which matches were right, and building a measurement stack on a method the platform actively discourages is a structural risk, not just a technical one. Treat probabilistic numbers as estimates with an unknown error bar — and treat the error bar as the product.
Media mix modeling
The method: top-down statistics. Take long histories of spend and outcomes across channels, model the relationship, and estimate each channel’s contribution — no user-level data required, immune to tracking loss, capable of covering offline and dark channels in aggregate. (Meta’s Robyn and Google’s Meridian are the open-source reference implementations if you want to see the machinery.)
The blind spot: resolution and latency. MMM needs months of history and real spend variance to separate channels, refreshes on a planning cadence rather than an operating one, and produces channel-level coefficients, never install-level answers. It also inherits its priors — a channel your model never saw spend on is a channel it can’t credit. MMM answers “what should next quarter’s mix be,” not “what drove yesterday’s installs.”
Incrementality testing
The method: the causal gold standard. Hold out a region or audience, vary spend deliberately, measure the lift. When the test is clean, it answers the only question that ultimately matters — would these installs have happened anyway?
The blind spot: cost and cadence. Each test measures one channel, takes weeks, burns real budget in the holdout, and needs enough volume for the lift to clear the noise floor. You can’t incrementality-test your way through a twelve-channel mix every month. It’s a periodic calibration instrument, not a continuous measurement system.
Self-reported attribution
The method: ask the person. A one-question “how did you hear about us” survey near first open, with closed options, randomized order, and a prominent skip. The answer is deterministic at the install level — not a model, not an inference — and it’s the only method on this list with native coverage of the channels everything above marks dark: podcasts, creators, word of mouth, communities.
The blind spot: it’s a sample with human error bars. Not everyone answers, memory is imperfect, and the responders aren’t a perfectly random draw — which is why response design and non-responder modeling aren’t optional extras but the method itself. Run carelessly (forced completion, fixed option order, open text), it produces confident garbage. Run carefully, it’s the cheapest install-level signal in the stack and the only one that hears about your dark channels from the people they actually reached.
The point is the disagreements
| Method | Resolution | Covers dark channels | Causal | Cadence |
|---|---|---|---|---|
| Last-click (MMP) | Install-level | No | No | Real-time |
| SKAN / AAK | Network-level | No | No | Delayed |
| Probabilistic | Install-level (inferred) | No | No | Real-time |
| MMM | Channel-level | In aggregate | Partially | Quarterly |
| Incrementality | Channel-level | Per test | Yes | Per test |
| Self-reported | Install-level | Yes | No | Real-time |
No single row is sufficient, and the rows don’t redundantly confirm each other — they check each other. Last-click is sharp where SKAN is coarse; MMM sees the aggregate last-click can’t; incrementality audits whichever channel you can afford to test; self-reported attribution is the install-level witness for everything the click-based rows book as organic. When two methods disagree, that disagreement is not a data quality problem. It’s the signal — it tells you which camera was pointed at the part of the scene the other one missed. Triangulation isn’t averaging three numbers into one; it’s knowing which number to trust for which question.
The practical failure isn’t picking the wrong method. It’s running last-click plus SKAN — two cameras that share the same blind spot — and concluding the dark channels don’t drive installs because nothing in the dashboard says they do.
Caliper is in early access — we're onboarding our first cohort.
Get access