Install Attribution Setup for Mobile Apps
Ad budget spread across five channels: Google UAC, Meta Ads, TikTok, Telegram, ASA. App gets installed, users purchase—but marketing doesn't know which channel brought paying customers or which drains money. Without properly configured install attribution, this is the standard situation.
How Attribution Works: MMP in the Middle
Mobile Measurement Partner (MMP) is an independent third party between ad networks and your app. The principle: when user clicks an ad, MMP records the click with campaign parameters. On app install, the SDK starts—MMP matches the device with previously recorded click and returns attribution to the source.
Key players: AppsFlyer, Adjust, Branch, Kochava. For US market AppsFlyer and Adjust are most common.
Matching mechanics after iOS 14.5 split:
- Deterministic (precise): via SKAdNetwork postbacks—when user granted ATT permission
- Probabilistic (probabilistic): by fingerprint (IP + User-Agent + click time)—without ATT permission, limited accuracy
On Android it's simpler: Google Play Referrer API gives precise attribution token without user permissions.
AppsFlyer Integration in Practice
iOS (Swift)
// AppDelegate.swift
import AppsFlyerLib
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "YOUR_DEV_KEY"
AppsFlyerLib.shared().appleAppID = "123456789"
AppsFlyerLib.shared().delegate = self
// Enable debug only in dev build
AppsFlyerLib.shared().isDebug = false
// Call start() after ATT request, not before
return true
}
// In SceneDelegate or after ATT response:
func applicationDidBecomeActive(_ application: UIApplication) {
AppsFlyerLib.shared().start()
}
Critical moment: start() cannot be called before user responds to ATT request. If called earlier—SDK sends event without consent flag, and Apple may block postback. Correct sequence: show ATT → await response → call start().
Android (Kotlin)
// In Application.onCreate()
AppsFlyerLib.getInstance().init("YOUR_DEV_KEY", object : AppsFlyerConversionListener {
override fun onConversionDataSuccess(data: Map<String, Any>) {
val campaign = data["campaign"] as? String
val mediaSource = data["media_source"] as? String
// media_source = "googleadwords_int" for Google UAC
Log.d("AF", "Attributed to: $mediaSource / $campaign")
}
override fun onConversionDataFail(error: String) {}
override fun onAppOpenAttribution(data: Map<String, Any>) {}
override fun onAttributionFailure(error: String) {}
}, this)
AppsFlyerLib.getInstance().start(this)
On Android important to add Google Play Referrer API as dependency—without it attribution through Google UAC will be probabilistic:
// build.gradle
implementation("com.android.installreferrer:installreferrer:2.2")
Deeplink Attribution: Where It Usually Breaks
OneLink / Universal Links / App Links enable attributing not just install but specific deeplink. User clicks link in Telegram, installs app—lands directly on right screen with proper attribution.
Common mistake: Universal Links stop working after app update if you didn't update apple-app-site-association file on server or changed Bundle ID without regenerating associated domains. iOS then falls back to HTTP redirect, attribution is lost.
Another problem—missing onAppOpenAttribution handler in "app already installed" scenario. onConversionDataSuccess fires only on first install. Subsequent deep link transitions need separate handler.
Postbacks and Verification
After MMP setup, configure postbacks in ad networks—otherwise Google UAC and Meta don't get conversion signal and can't optimize campaigns toward target action (in-app event instead of just install).
Verify attribution correctness:
- Use test device, add IDFA/GAID to MMP dashboard as test device
- Click test campaign link
- Install app
- Check MMP dashboard: attribution should appear in 1–2 minutes
What's Included
- Choose MMP matching budget and ad channels
- SDK integration on iOS and Android (or Flutter)
- Configure ATT flow for iOS
- Set up postbacks in Google, Meta, TikTok
- OneLink / Branch Links setup for deeplink attribution
- Testing via test devices and postback verification
Timeline
Basic MMP integration on both platforms: 3–5 days. With deeplink setup and all ad postbacks—up to 7 days. Cost calculated individually.







