Attribution
How Lander ties opens and installs to the links that caused them, how sure it is each time, and what it never collects.
Attribution answers one question: which link brought this person into the app? Lander answers it for every open and every install, and always says how sure it is. It never presents a guess as a fact.
What gets recorded
| Event | When | Recorded by |
|---|---|---|
| Click | A tap reaches the edge, for example because the app is not installed | The edge, after the redirect |
| Open | The app is opened by a Lander link and the SDK resolves it | The API, when the SDK resolves the link |
| Install | The app launches for the first time with the SDK | The API, on the SDK's first launch report |
| Custom event | You call Lander.trackEvent, for example for a signup or purchase | The SDK's offline queue |
Each open and install gets an attribution: the link (if any), a confidence and a method. You do not need to track opens or installs yourself.
Opens from verified Universal Links and App Links usually never pass through the edge, because the OS opens the app directly. That is why the SDK reports them, and why your open count can be higher than your click count.
Confidence
| Confidence | Meaning |
|---|---|
deterministic | Lander knows. An exact identifier tied the open or install to the link: the URL that opened the app, a single use token, or your own sign in. |
probabilistic | Lander guessed from coarse signals, because you allowed it. Usually right, sometimes wrong. Only for iOS deferred links of projects that opted in. |
unattributed | Lander could not tie the install to a link, so no deferred link is delivered. The install is still counted. |
In the SDK this is link.confidence, a LanderConfidence enum.
Method
The method says how the link was found.
| Method | Confidence | What happened |
|---|---|---|
universal_link | deterministic | The app was opened by a link on iOS |
app_link | deterministic | The app was opened by a link on Android |
install_referrer | deterministic | An Android install carried a token through the Play Install Referrer |
landing_page | deterministic | The person tapped "open it" on the iOS Continue in app page |
authenticated_handoff | deterministic | Your server bound the link to a user, and the app claimed it after sign in |
probabilistic_match | probabilistic | An iOS first launch matched recent taps by OS version and country, or by network |
An install with no link is recorded as unattributed. If a deterministic link turns up later for that install (a Continue in app tap or a handoff made before the install), the install is upgraded to that link.
Read more about each flow in Deferred deep linking.
Conversions
To tie your own events to a link, pass the link ID along:
await Lander.trackEvent(
'purchase',
properties: {'amount': 49.99, 'currency': 'USD'},
linkId: link?.linkId, // the link that opened the app, if any
);Events are stored on the device first and sent in batches, so they survive offline periods and app restarts, and each one is counted once even if it is sent twice. See Events.
Where you see it
The Analytics page and each link's detail page show an Attribution confidence card: how many opens and installs were deterministic, probabilistic or unattributed in the selected period, so you can see how much of your attribution rests on a guess. See Analytics.
Bot traffic is excluded. Crawlers, link preview fetchers, scripts, headless browsers and monitors still get redirected, but their clicks are flagged and left out of your numbers.
Privacy
Lander is built to attribute without tracking people.
- A random install ID. The SDK creates a random UUID on first launch. It is excluded from backups, so it is never restored onto another device, and it disappears when the app is uninstalled.
- No fingerprinting. No device model, screen size, fonts, advertising IDs (IDFA or GAID) or pasteboard reads.
- Minimal clicks. A click keeps the platform, the country and the referring host, never the IP address, the full user agent or the full referrer.
- Opt in for anything probabilistic. Probabilistic matching is off by default and compares only OS major version, country and tap time. IP matching is a second opt in and stores only a keyed hash of the network, for at most 7 hours.
- Hashed user IDs. Handoffs store a salted hash of the user ID you send, never the ID.
The SDK sends the install ID, platform, app version, OS version, SDK version, the URLs that opened the app, the events you track, the Play Install Referrer on an Android first launch, and the user ID you pass to claimHandoff. The Flutter SDK pages cover the privacy manifest for iOS.