Dans un monde où l’acquisition mobile devient de plus en plus compétitive , savoir d’où viennent vos utilisateurs, quelle campagne les a convertis, et quel est leur comportement post-installation est essentiel.
C’est exactement là qu’entrent en jeu les solutions d’attribution mobile comme Adjust et AppsFlyer. Ces outils permettent de lier chaque installation à une source précise : une pub Facebook, une campagne Google UAC, un lien de parrainage, ou même un QR code offline. Ils mesurent aussi les conversions post-install (ex : inscription, achat) pour calculer le ROAS (Return On Ad Spend) et optimiser vos campagnes.
Sans eux, vos campagnes fonctionnent… mais vous êtes aveugle sur leur performance réelle. Mais avant de profiter de ces insights, il faut intégrer correctement leur SDK dans votre app mobile. Et c’est souvent là que les problèmes commencent : docs techniques peu claires, différences entre plateformes, gestion du consentement RGPD/ATT, erreurs d’initialisation, etc.
C’est pourquoi ce tutoriel a été conçu : pour vous guider étape par étape, que vous utilisiez React Native, Android natif, ou iOS (Swift).
Dans cet article, vous apprendrez :
Les prérequis essentiels avant d’installer Adjust ou AppsFlyer
Comment installer le SDK dans votre environnement mobile
Comment tester que l’attribution fonctionne
Les pièges à éviter et les bonnes pratiques (événements personnalisés, tracking RGPD-friendly, deferred deep linking, etc.)
🎯 Objectif : que vous puissiez suivre et analyser chaque installation et conversion dans votre app, en toute sérénité.
Avant même d’écrire une ligne de code, il est essentiel de s’assurer que vous avez tout ce qu’il faut pour intégrer le SDK proprement, sans vous retrouver bloqué à mi-parcours. Beaucoup de développeurs ou de product managers négligent cette étape et finissent par devoir recommencer, reconfigurer ou — pire — débugger à l’aveugle pendant des heures. Voici la checklist des prérequis indispensables pour partir sur de bonnes bases.
Ça semble évident, mais on le voit souvent en mission : certaines équipes commencent l’intégration SDK sans avoir encore créé de compte sur la plateforme d’attribution. Or, sans accès à l’interface (dashboard), vous ne pourrez pas :
Générer le token d’application
Configurer les sources d’acquisition (Meta, TikTok, Google, etc.)
Définir vos événements personnalisés
Tester l’attribution en mode test ou debug
Créez un compte (gratuit) sur adjust.com ou appsflyer.com, puis créez une nouvelle app dans le tableau de bord. Vous obtiendrez ainsi un App Token (Adjust) ou une Dev Key (AppsFlyer), nécessaires pour initialiser le SDK dans votre code.
Vous (ou votre équipe tech) devez avoir un accès complet au projet mobile pour pouvoir :
Ajouter le SDK (via npm, CocoaPods, Gradle…)
Modifier les fichiers natifs (AndroidManifest.xml, Info.plist…)
Intégrer les événements personnalisés (ex : purchase_completed
, signup_success
)
Gérer les autorisations spécifiques (ex : ATT sur iOS)
Si votre app est en React Native, Flutter, ou tout autre framework hybride, vous aurez aussi besoin d’intervenir sur la partie native (android/
, ios/
), donc prévoyez les droits d’édition et les accès au bon repo Git.
Même si l’app n’est pas encore publiée, vous devez avoir :
Un Bundle ID (iOS) ou Package name (Android) défini
Un App Store ID (AppsFlyer) ou au moins un placeholder pour tester les redirections
Une version de test installable (APK, IPA ou version sur TestFlight/Play Console)
Pourquoi c’est important ? Parce que l’attribution mobile fonctionne à partir de l’interaction avec les stores (clic sur une pub → redirection store → install). Sans cette configuration, impossible de tester ou simuler des installations valides.
Avant de mettre le SDK en prod, vous devez tester dans un environnement contrôlé :
App de staging ou développement avec des events de test
Appareils physiques ou émulateurs avec accès aux logs (adb logcat, Xcode console…)
Accès à l’interface Adjust ou AppsFlyer pour vérifier les installations test et les events reçus
Outils de proxy réseau comme Charles Proxy ou Proxyman pour voir les requêtes envoyées
💡 Conseil : Activez toujours le mode debug lors de vos premiers tests, pour voir immédiatement si les événements sont bien reçus côté plateforme.
Le SDK Adjust est compatible avec toutes les principales technologies mobiles : Android natif (Java/Kotlin), iOS (Swift/Objective-C), React Native, Flutter, Unity… Mais pour cet article, on se concentre sur les trois plus courantes : React Native, Android natif et iOS Swift. Voici comment intégrer Adjust proprement, en partant de zéro.
Adjust fournit un package officiel pour React Native, qui encapsule les SDK natifs Android et iOS. Voici les étapes :
npm install @adjust/react-native-sdk npx pod-install
💡 Si vous utilisez Expo, attention : cette librairie nécessite une ejection (Bare Workflow).
Dans le fichier App.js
ou dans un useEffect
de votre composant principal :
import { Adjust, AdjustConfig, AdjustEnvironment } from '@adjust/react-native-sdk'; useEffect(() => { const config = new AdjustConfig('VOTRE_APP_TOKEN', AdjustEnvironment.Sandbox); // Remplacer Sandbox par Production plus tard Adjust.create(config); }, []);
Le APP_TOKEN
est récupérable dans le tableau de bord Adjust.
Utilisez Sandbox
pour tester, puis passez en Production
après validation.
import { AdjustEvent } from '@adjust/react-native-sdk'; const event = new AdjustEvent('eventTokenAchat'); event.addCallbackParameter('revenue', '19.99'); Adjust.trackEvent(event);
✅ Astuce : créez vos événements dans le dashboard Adjust avant de les tracker dans le code. Chaque event a un token unique.
build.gradle
dependencies { implementation 'com.adjust.sdk:adjust-android:4.33.3' }
Application.java
(ou MainApplication.kt
)String appToken = "VOTRE_APP_TOKEN"; String environment = AdjustConfig.ENVIRONMENT_SANDBOX; AdjustConfig config = new AdjustConfig(this, appToken, environment); Adjust.onCreate(config);
Et dans le onResume()
de l’activité principale :
@Override protected void onResume() { super.onResume(); Adjust.onResume(); }
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" /> <application> <!-- Init Adjust SDK --> <activity android:name="com.adjust.sdk.AdjustActivityLifecycleCallbacks" /> </application>
Dans le Podfile
:
pod 'Adjust'
Puis :
pod install
AppDelegate.swift
import Adjust func applicationDidFinishLaunching(_ application: UIApplication) { let appToken = "VOTRE_APP_TOKEN" let environment = ADJEnvironmentSandbox let adjustConfig = ADJConfig(appToken: appToken, environment: environment) Adjust.appDidLaunch(adjustConfig) }
Si vous ciblez iOS 14.5+, vous devez demander le consentement utilisateur :
import AppTrackingTransparency import AdSupport if #available(iOS 14, *) { ATTrackingManager.requestTrackingAuthorization { status in // Lancer Adjust après le consentement } }
✅ Tips communs :
Utilisez un device physique pour les tests d’attribution (simulateurs ne sont pas fiables pour ça).
Activez le test mode dans votre tableau de bord Adjust pour valider les premiers events.
Vérifiez chaque événement dans l’interface Adjust > Test Console.
AppsFlyer est l’une des plateformes d’attribution mobile les plus puissantes… mais aussi l’une des plus sensibles à une intégration correcte. Il est impératif de bien suivre les étapes recommandées pour que l’attribution fonctionne, notamment avec les dernières contraintes Apple (ATT) et Google (Play Install Referrer).
AppsFlyer fournit un SDK officiel React Native, basé sur les SDK natifs iOS et Android.
npm install react-native-appsflyer npx pod-install
💡 Cette lib ne fonctionne que sur app ejected, donc Expo Go n’est pas compatible.
Dans App.js
ou un composant de haut niveau :
import appsFlyer from 'react-native-appsflyer'; const options = { devKey: 'VOTRE_DEV_KEY', isDebug: true, appId: 'ID_APP_STORE_IOS', // requis pour iOS }; appsFlyer.initSdk( options, (result) => console.log('AppsFlyer init OK :', result), (error) => console.error('Erreur SDK AppsFlyer :', error) );
appsFlyer.logEvent('purchase_completed', { af_revenue: '29.99', af_currency: 'EUR', });
🎯 Tous les noms d’événements af_*
sont standardisés par AppsFlyer pour les analytics.
build.gradle
dependencies { implementation 'com.appsflyer:af-android-sdk:6.+' }
Application.java
import com.appsflyer.AppsFlyerLib; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AppsFlyerLib.getInstance().init("VOTRE_DEV_KEY", null, this); AppsFlyerLib.getInstance().start(this); } }
INTERNET
et l'option INSTALL_REFERRER
<uses-permission android:name="android.permission.INTERNET" /> <receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver>
📌 Cette étape est cruciale pour récupérer les infos de l’installation via Google Play.
Dans le Podfile
:
pod 'AppsFlyerFramework'
Puis installez :
pod install
AppDelegate.swift
import AppsFlyerLib func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { AppsFlyerLib.shared().appsFlyerDevKey = "VOTRE_DEV_KEY" AppsFlyerLib.shared().appleAppID = "ID_APP_STORE" AppsFlyerLib.shared().delegate = self AppsFlyerLib.shared().isDebug = true AppsFlyerLib.shared().start() return true }
Pour iOS 14.5+, demandez le consentement :
import AppTrackingTransparency if #available(iOS 14, *) { ATTrackingManager.requestTrackingAuthorization { status in // Lancez AppsFlyer après l’autorisation } }
Utilisez un device physique (pas un simulateur) avec une app installée hors debug (release).
Activez le mode debug dans les options d’initialisation pour voir les logs.
Vérifiez dans le dashboard AppsFlyer > Test Devices que l’événement remonte bien.
Simulez un clic d’attribution avec un lien AppsFlyer personnalisé, puis réinstallez l’app et vérifiez si l’installation est bien attribuée.
Une fois le SDK Adjust ou AppsFlyer intégré dans votre app, vous ne pouvez pas vous contenter de voir “aucune erreur” dans la console. Il est crucial de tester activement que le tracking fonctionne, que les événements sont bien déclenchés, et que l’attribution est correctement enregistrée dans l’interface web de votre outil. Voici comment procéder.
But : vérifier que les événements (install
, signup_completed
, purchase
, etc.) sont bien envoyés depuis l’app et reçus par la plateforme.
Adjust : vous pouvez voir les logs directement dans la console Xcode ou Android Logcat.
➤ Lors de l’initialisation, utilisez AdjustEnvironment.Sandbox
pour activer les logs détaillés.
AppsFlyer : passez isDebug: true
dans l’objet d’initialisation. Vous verrez les requêtes réseau dans la console.
Utilisez un outil comme :
Charles Proxy (Mac/Windows)
Proxyman (Mac uniquement)
Android Studio Logcat
Xcode Console
Filtrez sur les domaines :
*.adjust.com
(pour Adjust)
*.appsflyer.com
(pour AppsFlyer)
Vérifiez que :
les événements sont envoyés après les actions utilisateur
les paramètres (ex : af_revenue
, currency
, event_token
) sont bien présents
il n’y a pas d’erreurs réseau ou de 403/500
Il ne suffit pas que les événements partent : il faut que la plateforme les relie à une campagne publicitaire ou un lien tracké.
Dans Adjust ou AppsFlyer, créez un lien d’attribution personnalisé :
Choisissez une source (ex : Facebook, email, test_referral)
Activez les redirections vers App Store / Play Store
Copiez le lien
Ouvrez le lien sur un navigateur mobile (via SMS, email ou QR code)
Laissez-vous rediriger vers le store
Installez ou réinstallez l’app
Ouvrez l’app
Sur Adjust : onglet “Test Console” ou “Raw Data”
Sur AppsFlyer : onglet “Overview” > “Test Devices”
Vous devriez voir l’installation enregistrée, avec :
Le bon device ID
La bonne source d’attribution
Les événements post-install déclenchés (signup, achat…)
ATT (iOS) : l’attribution ne fonctionne pas sans le consentement de l’utilisateur (iOS 14.5+)
INSTALL_REFERRER (Android) : doit être bien configuré pour recevoir la referrer string
Network issues : si vous bloquez certains domaines en local (VPN, firewall), l’attribution peut échouer
Sandbox vs Production : ne mélangez pas les environnements, vous risquez de ne rien voir dans le bon dashboard
💡 Conseil final : notez les ID de vos appareils de test (IDFA, GAID, IDFV) dans les plateformes Adjust / AppsFlyer pour les suivre plus facilement dans les logs.
Une intégration technique qui fonctionne ne suffit pas : pour que le tracking serve réellement votre business, il doit être propre, structuré, déclenché au bon moment, et respectueux de la vie privée des utilisateurs. Voici les meilleures pratiques à appliquer dès aujourd’hui.
Le timing est fondamental. Ne déclenchez jamais un événement dès qu’un utilisateur clique, mais après validation réelle (confirmation API, écran de succès, etc.).
purchase_completed
→ après validation du paiement serveur
signup_completed
→ après enregistrement du compte en base de données
add_to_cart
→ seulement après que le panier ait été mis à jour
💡 Pourquoi ? Parce que déclencher trop tôt crée des faux positifs, fausse vos taux de conversion et rend vos données inutilisables pour optimiser vos campagnes.
Avec le RGPD en Europe et App Tracking Transparency sur iOS, vous ne pouvez plus tracker n’importe quoi, n’importe quand. Voici ce qu’il faut respecter :
Obtenir un consentement explicite avant d’envoyer quoi que ce soit à AppsFlyer/Adjust
Stocker ce consentement (CMP mobile comme OneTrust, Didomi…)
Masquer les données personnelles (email, nom, etc.)
Utiliser ATTrackingManager.requestTrackingAuthorization
Ne pas initialiser le SDK avant d’avoir obtenu l’accord
Afficher une explication claire à l’utilisateur avant le prompt Apple
💡 AppsFlyer et Adjust offrent des options pour désactiver automatiquement le tracking tant que le consentement n’est pas donné. Activez-les.
Un autre piège courant : envoyer 10 événements pour chaque action utilisateur, ou y ajouter trop de paramètres.
appsFlyer.logEvent('signup_click', { time: '15:32', userEmail: 'john@example.com', IP: '192.168.1.1', city: 'Paris', timezone: 'GMT+1' });
➡️ Cela viole potentiellement la vie privée, et alourdit inutilement les payloads.
appsFlyer.logEvent('signup_completed', { signup_method: 'email', source: 'facebook_ads', af_revenue: 0 });
Conservez 3 à 5 paramètres max par événement, avec un nommage clair et standardisé.
Ne laissez pas vos events sans cohérence entre code et interface plateforme. Créez une table de mapping entre :
Le nom de l’événement côté code (purchase_completed
)
Le token / ID de l’événement dans le dashboard (Adjust ou AppsFlyer)
Les paramètres attendus (af_revenue
, af_currency
, etc.)
💡 C’est indispensable si vous souhaitez connecter l’attribution à d’autres outils (CRM, reporting, retargeting dynamique, etc.)
Vous utilisez des liens de partage, de parrainage, ou d’emailing ? Il est probable que vous deviez gérer du deferred deep linking — autrement dit : rediriger un utilisateur vers une page précise même s’il installe d’abord l’app.
Les SDK Adjust et AppsFlyer permettent de :
Créer des smart links
Lire le contenu du lien après installation
Rediriger automatiquement l’utilisateur vers une page dans l’app
💡 Exemple : un utilisateur clique sur une offre “-20% sur le jean bleu”, installe l’app, puis arrive directement sur la page produit correspondante → expérience UX optimisée, conversion boostée.