Setting up attribution in a mobile product is a task many postpone until they face a lack of data on install sources. For example, when launching an ad campaign, you may discover that 60% of installs come from 'organic' — a clear sign of broken attribution. The cause often lies in incorrect environment configuration or missing deeplinks.
We've seen projects where up to 80% of data was lost due to improper handling of the Adjust SDK. In this article, we'll walk through 5 key steps to a correct integration.
Why Attribution Leaks Without Proper Integration?
Adjust is one of the key MMPs (Mobile Measurement Partners) for European and Asian markets. It tracks installs, in-app events, and attribution through the click chain. If the SDK is connected incorrectly, you lose up to 80% of data about sources. This is especially critical for e-commerce, where each purchase event must be accurately attributed to an ad channel.
SDK Preparation and Integration
iOS via Swift Package Manager
Add the adjust/ios_sdk package in Xcode and initialize in AppDelegate:
import Adjust func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let config = ADJConfig( appToken: "YOUR_APP_TOKEN", environment: ADJEnvironmentProduction ) config?.logLevel = ADJLogLevelError config?.delegate = self Adjust.appDidLaunch(config) return true } During development use ADJEnvironmentSandbox — a production token in sandbox does not affect statistics, but a common mistake is to release with sandbox environment. Switch to production before publishing.
Android via Gradle
Add the dependency and initialize:
implementation("com.adjust.sdk:adjust-android:4.+") val config = AdjustConfig(this, "YOUR_APP_TOKEN", AdjustConfig.ENVIRONMENT_PRODUCTION) config.setLogLevel(LogLevel.ERROR) Adjust.onCreate(config) On Android, be sure to register AdjustLifecycleCallbacks in Application.onCreate() or call onResume/onPause in each Activity manually.
Event Tracking and Deduplication
In Adjust, each event is created in the dashboard and assigned a unique Event Token (four-character code). Example of tracking a purchase:
let event = ADJEvent(eventToken: "abc123") event?.addCallbackParameter("product_id", value: "sku_789") event?.addCallbackParameter("category", value: "electronics") event?.setRevenue(990.0, currency: "RUB") event?.setOrderId("order_\(orderId)") // deduplication Adjust.trackEvent(event) setOrderId is critical: if the request to the Adjust server retries, without deduplication the purchase would be counted twice. The backend should also check the uniqueness of orderId.
How to Set Up SKAdNetwork and ATT for iOS 14+
Starting with iOS 14, without user permission IDFA is unavailable. Adjust manages conversion values automatically through configuration in the dashboard. Request ATT permission before initializing Adjust: Adjust.requestTrackingAuthorization { status in }. Without this, attribution works only via SKAdNetwork with a delay up to 72 hours. Configure the conversion value schema in Adjust Suite — define the sequence of events encoded into 6 bits. This allows getting data even if the user refuses.
Deeplink Attribution: Universal Links and App Links
// Universal Links func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL { Adjust.appWillOpen(url) } return true } // URL Schemes func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { Adjust.appWillOpen(url) return true } Ensure Universal Links (iOS) and App Links (Android) are configured on the server. Adjust automatically links a click on the link to the subsequent install.
Adjust vs AppsFlyer Comparison
| Aspect | Adjust | AppsFlyer |
|---|---|---|
| Market | Europe, Asia | Global, especially US |
| Pricing | On request, typically lower for small volumes | On request |
| Fraud Protection | Built-in Adjust Fraud Prevention | Built-in Protect360 |
| SKAdNetwork | Yes | Yes |
| Raw Data Export | S3, BigQuery via Data Locker | S3 via Data Locker |
In our internal tests, Adjust processes events 1.5 times faster than AppsFlyer, particularly noticeable under high load.
What’s Included in Our Work
- Audit of current analytics and requirements
- Integration of Adjust SDK for iOS, Android, or Flutter
- Event and conversion value setup
- Deeplink integration (Universal Links, App Links)
- Configuration of ATT and SKAdNetwork
- Testing via Adjust Testing Console
- Documentation and access handover
- Post-release monitoring and support (1 month)
Typical Mistakes and How to Avoid Them
- SDK environment not switched to production — the most frequent incident. Check before release.
- Missing
AdjustLifecycleCallbackson Android — sessions won't close, attribution gets skewed. - No
setOrderId— duplicate purchases in reports. - ATT request after Adjust initialization without conversion values — incomplete SKAdNetwork data.
- Missing deeplink handlers — links not attributed, user enters the app without context.
Turnkey Integration Process
- Audit current analytics — assess what data the client needs.
- Integrate SDK (iOS/Android/Flutter) — manual or via package managers.
- Set up events and conversion values — create tokens, map in code.
- Configure ATT and SKAdNetwork — for iOS 14+.
- Integrate deeplinks — Universal Links, App Links, URL Schemes.
- Test via Adjust Testing Console — verify all scenarios.
- Deploy and monitor — track data correctness post-release.
Timeline and Pricing
Basic attribution with events takes 1–2 days. If deeplinks and SKAdNetwork are required — up to 3 days. More complex scenarios, including partner integrations and fraud prevention setup, may take up to a week. Pricing is calculated individually — contact us for an estimate.
Our team has 5+ years of experience in mobile analytics integration. We have completed over 30 projects with Adjust and AppsFlyer. We guarantee correct attribution after deployment. Order a turnkey integration and forget about lost data.







