Integrating Singular analytics into a mobile application
Singular positioned as Marketing Analytics Platform — broader than just MMP. Besides install attribution, platform aggregates expenses from ad accounts (Meta Ads, Google Ads, TikTok, Apple Search Ads) and calculates ROAS directly in dashboard without manual data export. For teams managing UA across multiple channels simultaneously, this significantly reduces manual report work.
iOS SDK connection
// SPM: https://github.com/singular-labs/Singular-Swift-Package
import Singular
// AppDelegate
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = SingularConfig(apiKey: "API_KEY", andSecret: "API_SECRET")
config?.skAdNetworkEnabled = true
config?.waitForTrackingAuthorizationWithTimeoutInterval = 300 // 5 minutes for ATT request
Singular.start(config)
return true
}
waitForTrackingAuthorizationWithTimeoutInterval — important parameter. If SDK starts before user answers ATT request, SKAdNetwork conversion values end up tied to anonymous session. 300 seconds gives enough time to show custom pre-prompt and system ATT dialog.
Android SDK connection
implementation("com.singular.sdk:singular_sdk:12.+")
val config = SingularConfig("API_KEY", "API_SECRET")
.withSessionTimeoutInSec(60)
.withFCMDeviceToken(fcmToken) // for push attribution
Singular.init(this, config)
withFCMDeviceToken allows attributing installs through push campaigns — user received push, installed app, Singular sees the connection.
Events and conversions
Singular uses standard events that automatically map to Meta, Google, TikTok formats:
// Purchase
Singular.revenue("USD", amount: 9.99, productSKU: "premium_monthly",
productName: "Premium Subscription", productCategory: "Subscription",
quantity: 1, receipt: receiptData)
// Custom event
Singular.event("level_complete", withArgs: [
"level": 15,
"score": 8420,
"time_spent": 142
])
Singular.revenue with receipt — purchase verification on Singular side. With verification enabled, fake purchases (from fraud) filtered before reaching statistics.
Deeplink attribution
// Universal Links
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let url = userActivity.webpageURL {
Singular.continueUserActivity(userActivity) { deeplink, error in
// deeplink contains parsed parameters
if let path = deeplink?.passthrough {
NavigationRouter.shared.handleDeeplink(path)
}
}
}
return true
}
Singular supports own Singular Links — shortened links with click tracking, similar to Branch Links. Created in dashboard, used in ad placements.
Integration of ad account expenses
This is what most MMPs don't have on basic plan. In Singular → Integrations connect ad accounts via OAuth or API keys. After this, dashboard shows breakdown:
| Channel | Installs | Cost | Revenue | ROAS |
|---|---|---|---|---|
| Meta Ads | 1 240 | $3 100 | $4 960 | 1.60x |
| Apple Search Ads | 890 | $2 450 | $5 340 | 2.18x |
| TikTok | 560 | $1 800 | $1 960 | 1.09x |
Data updates daily. For accurate ROAS need to pass all revenue events through Singular SDK.
Typical integration problems
SKAdNetwork conversion values not updating. Singular manages conversion schema through dashboard (Conversion Studio). If schema configured after first installs — for them conversion values can't change, data will be incomplete. Schema needs finalization before campaign launch.
Event duplication with Firebase. If project already has Firebase Analytics, ensure same events don't go twice — Singular doesn't deduplicate Firebase data automatically.
What's included in the work
- SDK connection (iOS SPM / Android Gradle / Flutter / React Native)
- SKAdNetwork and Conversion Studio setup
- ATT flow configuration with correct timeout
- Events and revenue implementation with receipt verification
- Deeplink handling setup (Universal Links / App Links)
- Ad account integration for expense import
- Testing through Singular SDK Console
Timeline
Basic attribution with events: 1–2 days. Full integration with deeplink and ad channel setup: 3–5 days. Cost calculated individually.







