Attribution: where your installs come from

Connect your ad accounts, see your spend and your ROAS next to your revenue, receive Apple's SKAdNetwork postbacks on your own endpoint, and send your conversion events back to the networks so their delivery algorithms learn. Appwin is not a certified MMP - it builds on the open rails every developer is entitled to, and it is honest about what each one can and cannot say.

The staircase matters: each step gives value on its own, and none requires the previous one to be redone.


Step 1 - no SDK: spend, campaigns and ROAS

Connect your TikTok and Meta ad accounts in Attribution → Integrations (OAuth, read-only - appwin never writes to an ad account). You get:

  • daily spend per network, campaign, ad group and ad, with creative thumbnails;
  • the campaigns table, an ads-manager view across networks;
  • ROAS, crossed with your revenue from the Finance product.

Numbers shown here are Reported by network - what the platforms claim. Appwin never silently mixes them with what it observes itself.

Step 2 - one line in your Info.plist: SKAN postbacks

Apple sends a copy of every winning SKAdNetwork postback to the endpoint the app declares. One key, no SDK:

xml
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://appwin.io</string>

The campaigns page then shows SKAN observed by appwin - installs Apple attributed to your ads, independent of any network's claims, broken down by milestone once step 3 manages your conversion values. Postbacks arrive 24 to 144 hours after the install, by design: never compare them day-to-day with the networks' own numbers.

Step 3 - with the SDK: conversion values, sources, activation

With the SDK installed and Analytics initialized, three things start working by themselves:

  • Conversion values (iOS): appwin becomes the single manager of the SKAdNetwork conversion value. The schema lives in your dashboard (by default: trial started = 32, purchase = 63) and your track() calls drive it - nothing to code.
  • Install sources (Android): the Play Install Referrer of each install is captured once and shows up in the overview - which campaigns, which UTM sources, how much organic.
  • Signal activation: your conversion events are sent back to the networks (server-side for Meta, embedded adapter for TikTok) so their algorithms optimize on real conversions. This step is consent-gated - see below.

Advertising activation is opt-in. Your app relays the user's choice through a single call - typically wired to the ATT prompt on iOS:

swift
let authorized = await AppwinCore.requestTrackingAuthorization()
AppwinCore.setAdvertisingConsent(authorized ? .granted : .denied)

Declare the ATT purpose string in your Info.plist (NSUserTrackingUsageDescription). If you already run a CMP, keep it: just relay its advertising verdict into setAdvertisingConsent.

:::tabs-end

The rule of thumb: consent decides whether events flow to the networks at all; ATT only decides whether the advertising identifier enriches them. A refused ATT still activates, at a lower match quality.

Wiring Meta (Conversions API)

In Meta Events Manager: create (or pick) a dataset for your app, then generate a system-user access token from the dataset's settings, Conversions API section. Paste both in Attribution → Integrations → Signal activation → Connect Meta. The connection is verified immediately; events flow within minutes and appear in Meta's own Test Events tool.

Wiring TikTok (App Events)

Add the optional AppwinTikTokEvents package (iOS) / io.appwin:appwin-tiktok-events module (Android) to your app - no code, its presence is the integration. Then, in TikTok Events Manager, copy your app's TikTok App ID and access token, and paste them in Attribution → Integrations → Signal activation → Connect TikTok. The adapter only runs for consenting users, and its SKAN handling is disabled - appwin stays the single conversion-value manager.

Replicate the conversion value schema

The conversion value is just a number: each network decodes its postbacks with the mapping declared on their side. Copy your schema (dashboard, Attribution → SKAN) into Meta Events Manager and TikTok's equivalent - with the default schema that is two rows: 32 = trial started (coarse: medium), 63 = purchase (coarse: high).


Honest limits

  • Per-install source on iOS does not exist for anyone without Apple's consent rails: SKAN answers in aggregate, and that is the point.
  • The Play referrer says what the advertiser put in the store link. Untagged campaigns show as "other".
  • Match quality at the networks depends on the identifiers users consent to share. The dashboard always separates Reported by network from Observed by appwin; the MMM is the layer of truth above both.