Attribution
Attribution montre ce que ton budget publicitaire achète : le spend et le ROAS en face de tes revenus, les postbacks SKAdNetwork d'Apple sur ton propre endpoint, et tes événements de conversion renvoyés aux régies.
Le module s'appuie sur Appwin Core et Analytics : les conversions passent par les événements du SDK, tout le reste se règle dans le dashboard. Ses trois briques - comptes pub connectés, endpoint de postback, événements de conversion - sont indépendantes : chacune fonctionne sans les autres.
Installation
- 1
Installe le SDK et initialise Analytics
Attribution ne s'installe pas à part : il réutilise les événements d'Analytics. Le Quickstart génère l'installation d'Appwin Core et d'Analytics pour chaque plateforme. Vérifie qu'
initialize()d'Analytics répondreadyavant de suivre des conversions. - 2
Déclare l'endpoint de postback (iOS)
Ajoute deux clés à ton
Info.plistpour qu'iOS envoie ses postbacks d'attribution sur l'endpoint d'appwin :<!-- SKAdNetwork (toutes les versions d'iOS supportées) --> <key>NSAdvertisingAttributionReportEndpoint</key> <string>https://appwin.io</string> <!-- AdAttributionKit (iOS 17.4+) --> <key>AttributionCopyEndpoint</key> <string>https://appwin.io</string>Tu obtiens la colonne SKAN observé : les installs qu'Apple lui-même a attribuées à tes pubs. Ce sont des clés de build lues par iOS ; aucun SDK ne peut les poser à l'exécution. Les postbacks arrivent 24 à 144 h après l'install (ne les compare jamais jour à jour avec les chiffres des régies), et iOS normalise l'endpoint au domaine enregistrable : toute valeur en
*.appwin.iolivre surappwin.io.
Connecter les comptes publicitaires
Attribution → Intégrations → Connecter (TikTok, Meta). OAuth en lecture seule, zéro code : appwin n'écrit jamais sur un compte publicitaire. Tu obtiens le spend quotidien par réseau, campagne, ad group et ad avec les vignettes des créas, la table de campagnes cross-réseaux, et le ROAS croisé avec tes revenus.
Ces chiffres sont du Reported by network (ce que les plateformes revendiquent) : appwin ne les mélange jamais silencieusement avec ce qu'il observe lui-même.
Suivre les conversions
Prérequis : SDK installé, Analytics initialisé. Toute l'étape tourne sur quatre noms d'événements :
| Événement | Quand le déclencher | Props |
|---|---|---|
app_install | Jamais - le SDK l'émet | - |
start_trial | Un essai gratuit démarre | - |
purchase | Le store confirme un paiement | { value, currency } |
subscribe | Optionnel : un abonnement s'active (vs vente one-shot) | { value, currency } |
Déclenche-les là où ton pipeline d'achat confirme la transaction, après le oui
du store, jamais sur les restaurations. Sur purchase, le montant voyage en
value (nombre) et currency (ISO 4217) ; toute autre prop reste à la maison.
Avec RevenueCat
let result = try await Purchases.shared.purchase(package: package)
guard !result.userCancelled else { return }
let product = package.storeProduct
let isTrial = result.customerInfo.entitlements.active.values
.contains { $0.periodType == .trial }
if isTrial {
AppwinAnalytics.track("start_trial")
} else {
AppwinAnalytics.track("purchase", props: [
"value": Double(truncating: product.price as NSNumber),
"currency": product.currencyCode ?? "USD",
])
}
Ton webhook RevenueCat (produit Revenue) et ces appels sont complémentaires :
le webhook alimente les analytics de revenu côté serveur, track() s'exécute sur
l'appareil - ce dont les conversion values et l'activation ont besoin.
Avec une autre stack d'achat
Même motif : un track dans le callback de succès.
// StoreKit 2, sans SDK d'achat
let result = try await product.purchase()
if case .success(let verification) = result,
case .verified(let transaction) = verification {
AppwinAnalytics.track("purchase", props: [
"value": Double(truncating: product.price as NSNumber),
"currency": product.priceFormatStyle.currencyCode,
])
await transaction.finish()
}
// Adapty
let result = try await Adapty.makePurchase(product: product)
if !result.isPurchaseCancelled {
AppwinAnalytics.track("purchase", props: [
"value": Double(truncating: product.price as NSNumber),
"currency": product.currencyCode ?? "USD",
])
}
Qonversion, Glassfy, Play Billing en direct : idée identique.
Sans rien coder de plus, tu obtiens :
- Conversion values (iOS) - appwin gère la conversion value SKAdNetwork depuis tes événements. Schéma dans le dashboard ; défauts : essai = 32, achat = 63.
- Sources d'install (Android) - le Play Install Referrer de chaque install, dans la vue d'ensemble.
- Activation réseaux - tes événements renvoyés à Meta (côté serveur) et TikTok (adapter embarqué), gatés par le consentement.
Activer l'activation réseaux
Le consentement d'abord : l'activation est opt-in. Relaie le choix de l'utilisateur en un appel, typiquement branché sur la popup ATT côté iOS.
let authorized = await AppwinCore.requestTrackingAuthorization()
AppwinCore.setAdvertisingConsent(authorized ? .granted : .denied)
Déclare NSUserTrackingUsageDescription dans ton Info.plist. Déjà une CMP ?
Garde-la, relaie juste son verdict publicitaire.
Le consentement décide si les événements partent vers les régies ; l'ATT décide seulement si l'identifiant publicitaire les enrichit. Un ATT refusé active quand même, avec une qualité de match moindre.
Puis câble chaque réseau :
| Réseau | Dans leur console | Dans appwin |
|---|---|---|
| Meta | Events Manager → votre dataset → Conversions API → générer un token system-user | Attribution → Intégrations → Activation des signaux → Connecter Meta : coller dataset ID + token |
| TikTok | Events Manager → copier le TikTok App ID + l'access token | Ajouter le package AppwinTikTokEvents (iOS) / io.appwin:appwin-tiktok-events (Android) - sa présence EST l'intégration - puis coller les deux dans Connecter TikTok |
Enfin, recopie ton schéma de conversion value (dashboard, Attribution → SKAN) dans la console de chaque réseau pour qu'ils décodent les postbacks de la même façon. Avec le schéma par défaut, c'est deux lignes : 32 = essai démarré (coarse : medium), 63 = achat (coarse : high).
Règles et limites
- La source par install sur iOS n'existe pour personne : SKAN répond en agrégé, et c'est le principe. Appwin n'est pas un MMP certifié - il s'appuie sur les rails ouverts auxquels tout développeur a droit.
- Le référent Play dit ce que l'annonceur a mis dans le lien du store ; les campagnes non taguées apparaissent en « other ».
- La qualité de match dépend de ce que les utilisateurs consentent à partager. Le dashboard sépare toujours le Reported by network de l'Observed by appwin.