Integrating Adjust analytics into a mobile application
Adjust — MMP (Mobile Measurement Partner) with strong position in European and Asian markets. Like AppsFlyer, main task — install attribution and in-app events. Choice between Adjust and AppsFlyer often determined by advertising partners: some DSPs and networks prefer working through Adjust.
SDK connection
iOS via Swift Package Manager — package adjust/ios_sdk:
import Adjust
// AppDelegate
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
}
Important: ADJEnvironmentSandbox vs ADJEnvironmentProduction — in sandbox, traffic doesn't reach production statistics. Common mistake — release with Sandbox.
Android:
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 additionally need AdjustLifecycleCallbacks in Application.onCreate() or manual calls to onResume/onPause in each Activity.
Event tracking
In Adjust, each event created in the dashboard gets unique Event Token — four-character code (abc123). Code used when calling SDK:
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 — critically important for e-commerce: prevents duplicate purchase event on retries (e.g., from network request retry).
SKAdNetwork on iOS 14+
Adjust manages conversion values automatically through dashboard configuration. Encoding scheme determined in Adjust Suite — there you set which events and their sequence encode in 6 bits:
// ATT request should be before start() or right after
Adjust.requestTrackingAuthorization { status in
// status: ATTrackingManager.AuthorizationStatus
}
Without requestTrackingAuthorization on iOS 14.5+ IDFA inaccessible, and attribution will work only through SKAdNetwork (aggregately, with up to 72-hour delay).
Deeplink attribution
// 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
}
Adjust vs AppsFlyer: practical choice
| Aspect | Adjust | AppsFlyer |
|---|---|---|
| Market | Europe, Asia | Global, especially US |
| Price | On request, usually 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 |
What's included in the work
- SDK connection (iOS/Android/Flutter)
- Environment setup for debug/release builds
- Event token creation in dashboard + code integration
- ATT and SKAdNetwork configuration for iOS 14+
- Deeplink and Universal Links
- Testing through Adjust Testing Console
Timeline
Basic attribution with events: 1–2 days. With deeplink and SKAdNetwork: up to 3 days. Cost calculated individually.







