We often encounter a situation: a team runs ad campaigns across four channels but can't figure out which one drives real installs and purchases. Costs are exported manually, data is scattered, and Apple's SKAdNetwork hides cohort statistics at the device level. Singular — Marketing Analytics Platform — solves this: it aggregates costs from Meta Ads, Google Ads, TikTok, and Apple Search Ads, automatically calculates ROAS, and provides a unified dashboard. Unlike typical MMPs, Singular processes data 3x faster and requires no manual cost entry. Our team with 5 years of experience has successfully integrated Singular into 50+ projects, with average deployment time of up to 5 days and payback within the first month of campaign.
Why Singular Instead of a Standard MMP?
Most MMPs (AppsFlyer, Adjust) focus only on install attribution. Singular works one level above: it imports cost data from ad accounts and calculates marginal profit without manual reports. The built-in Conversion Studio lets you manage SKAdNetwork conversion values from the dashboard instead of Xcode configuration files. For large advertisers, this approach cuts report preparation time by 3x. As per Singular's documentation, automatic cost import via OAuth eliminates manual entry errors.
SDK Integration
iOS
// 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 is a critical parameter. If the SDK starts before the user responds to ATT, conversion values are tied to an anonymous session. 300 seconds gives enough time for a pre-prompt and system dialog. We ensure the timeout is configured with your UX design in mind.
Android
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 attributes installs through push campaigns — user receives a push, installs the app, Singular links events. Our engineers verify push attribution correctness during testing.
Event and SKAdNetwork Setup
Singular provides 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 triggers purchase verification on Singular's side. Fake transactions are filtered out before entering statistics. For high ROAS accuracy, we recommend sending all revenue events, including subscriptions (a common mistake is sending only the first purchase).
How to Set Up SKAdNetwork from Scratch?
Singular manages conversion schema via the dashboard — Conversion Studio. Follow these steps:
- Open Conversion Studio in the Singular dashboard.
- Create a new schema, specifying the conversion window (6–24 hours).
- Define conversion values for key events (install, registration, purchase).
- Run a test campaign for calibration.
- Finalize the schema before launching mass campaigns.
Important: The schema must be finalized before launch — if changed after the first installs, data for those installs will remain incomplete. In our certified process, we always create the schema during the test campaign phase.
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
if let path = deeplink?.passthrough {
NavigationRouter.shared.handleDeeplink(path)
}
}
}
return true
}
Singular supports Singular Links — similar to Branch Links with click tracking. Created in the dashboard, passed to ads. We set up Universal Links (iOS) and App Links (Android) in 1 day.
Cost Integration from Ad Accounts
This is a key feature unavailable in basic MMPs. In Singular → Integrations, we connect Meta, Google, Apple Search Ads, and TikTok accounts via OAuth or API keys. The dashboard then shows a unified 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, it's essential to send all revenue events — otherwise figures will be understated.
Common Integration Issues
- SKAdNetwork conversion values not updating. Conversion Studio must be configured before launching campaigns — this is mandatory for data cleanliness. If the schema is created post-factum, conversions from the first cohort are lost.
- Duplicate events with Firebase. If Firebase Analytics is already in the project, identical events must not be sent twice — Singular cannot deduplicate automatically. We set up filters on Singular's side or disable duplicate events in Firebase.
Comparison: Singular vs. Standard MMP
| Criterion | Singular | Typical MMP |
|---|---|---|
| Cost import | Built-in OAuth | Only CSV or API with limits |
| SKAdNetwork | Conversion Studio | Manual Xcode config |
| ROAS report | Automatic | Requires export |
| Postback support | Yes, with relay | Limited |
Singular wins in setup time and report accuracy — in our projects, it saves analysts up to 10 hours per week.
What's Included
- SDK integration (iOS SPM / Android Gradle / Flutter / React Native)
- SKAdNetwork and Conversion Studio setup
- ATT flow configuration with correct timeout
- Event and revenue implementation with receipt verification
- Deeplink handler integration (Universal Links / App Links)
- Ad account connections for cost import
- Testing via Singular SDK Console
Timelines and Cost
Basic attribution with events — 1–2 days. Full integration with deeplinks and ad channel setup — 3–5 days. Cost is calculated individually. Request a current analytics audit — we'll advise on necessary improvements and integration time.
Contact us for a consultation — we'll assess your project and propose the optimal solution.







