AppsFlyer: Complete Guide for Mobile Attribution and Deep Linking
Mobile Marketing

AppsFlyer: Complete Guide for Mobile Attribution and Deep Linking

Master mobile attribution with AppsFlyer: OneLink, Deep Link vs Deferred Deep Link, mass link generation, React Native/Swift/Android integration. VOID 2025 guide.

🇫🇷 This article is currently available in French. English translation in progress.

Note: This article is available in French with full technical details and code examples.

Read the full French version →

AppsFlyer est la plateforme leader mondiale d'attribution mobile et de marketing analytics, utilisée par plus de 12 000 marques (Nike, Uber, HBO...). Elle permet de tracer l'origine de chaque installation d'app, mesurer le ROI des campagnes, et créer des expériences utilisateur fluides via le deep linking.

Chez VOID, nous intégrons AppsFlyer sur des projets bancaires, e-commerce et médias pour optimiser l'acquisition mobile et réduire le coût par installation (CPI) de 30-50%.

Pourquoi utiliser AppsFlyer ?

1. Attribution multi-touch précise

AppsFlyer identifie quelle campagne (Facebook Ads, Google UAC, influenceur, email...) a généré une installation, même dans un parcours complexe avec plusieurs points de contact.

  • Last-click attribution : crĂ©dit au dernier point de contact
  • Multi-touch attribution : pondĂ©ration entre plusieurs canaux
  • View-through attribution : comptabiliser les impressions pub (pas seulement les clics)
  • Probabilistic + Deterministic matching : 98% de prĂ©cision (vs. 60-70% pour Google Analytics)

2. Protection contre la fraude publicitaire

AppsFlyer détecte et bloque automatiquement :

  • Install hijacking : fausses attributions par des rĂ©seaux malveillants
  • Click flooding : clics robots massifs pour voler l'attribution
  • SDK spoofing : installations simulĂ©es sans rĂ©elle installation
  • Device farms : fermes de tĂ©lĂ©phones gĂ©nĂ©rant de fausses conversions

Impact : Économie moyenne de 15-25% du budget pub mobile (source : AppsFlyer Fraud Report 2024).

3. Deep linking intelligent

Amener l'utilisateur exactement oĂą vous voulez dans l'app, depuis n'importe quelle source (email, SMS, pub, QR code, site web).

  • Deep Link : ouvre l'app sur un Ă©cran spĂ©cifique (ex : page produit) si l'app est installĂ©e
  • Deferred Deep Link : redirige vers le store → installe l'app → ouvre l'Ă©cran ciblĂ© au 1er lancement
  • Web-to-App : bascule fluide du site mobile vers l'app (sans perdre le contexte)

4. Analytics temps réel et cohortes

  • Dashboard centralisĂ© (installations, revenus, ROI par canal)
  • Analyse de cohortes (retention J1, J7, J30 par source)
  • LTV (Lifetime Value) prĂ©dictif par segment
  • A/B testing de campagnes en temps rĂ©el

Concepts clés : OneLink, Short Link vs Long Link

OneLink : un lien unique pour iOS + Android + Web

OneLink est la technologie propriétaire AppsFlyer qui génère un lien universel fonctionnant sur tous les devices :

  • iOS : redirige vers l'App Store (ou ouvre l'app si installĂ©e)
  • Android : redirige vers le Google Play Store (ou ouvre l'app)
  • Desktop : affiche une landing page web avec QR code / boutons de tĂ©lĂ©chargement

Exemple de OneLink :

https://yourapp.onelink.me/AbCd/promo-noel

Fonctionnement intelligent :

  1. L'utilisateur clique sur le lien
  2. AppsFlyer détecte l'OS et l'état de l'app (installée ou non)
  3. Redirection intelligente :
    • App installĂ©e → ouverture directe avec deep link
    • App non installĂ©e → store → deferred deep link après installation
  4. Attribution automatique de l'installation/événement à la campagne source

Short Link vs Long Link

Long Link (paramètres visibles)

Format standard avec tous les paramètres en query string :

https://yourapp.onelink.me/AbCd?pid=facebook&c=black_friday&af_dp=yourapp://product/12345&af_web_dp=https://yoursite.com/product/12345

Paramètres standards :

  • pid : Media source (facebook, google, email...)
  • c : Campaign name (black_friday, summer_sale...)
  • af_adset : Ad set name
  • af_ad : Ad creative name
  • af_dp : Deep link (URI scheme de l'app)
  • af_web_dp : Fallback URL web si l'app n'est pas installĂ©e
  • af_sub1 Ă  af_sub5 : Paramètres custom (user_id, promo_code...)

âś… Avantages Long Link :

  • Paramètres lisibles (debug facile)
  • Modification manuelle possible (test rapide)
  • Pas de limite de crĂ©ation (gĂ©nĂ©ration cĂ´tĂ© client)

❌ Inconvénients :

  • URL longue et moche (mauvais pour SMS, rĂ©seaux sociaux)
  • Paramètres exposĂ©s (risque de manipulation)
  • Moins de clics (URL non brandĂ©e)

Short Link (URL raccourcie brandée)

Format court, brandé, masquant les paramètres :

https://yourapp.onelink.me/AbCd/bf2024

Derrière cette URL courte, AppsFlyer stocke tous les paramètres (pid, campaign, deep link, custom params...).

âś… Avantages Short Link :

  • URL courte : idĂ©al pour SMS (160 caractères), Twitter, QR codes
  • BrandĂ©e : yourapp.onelink.me (confiance utilisateur)
  • Paramètres cachĂ©s : pas de manipulation possible
  • Suivi des clics : analytics dĂ©taillĂ©s par lien
  • Modifiable après crĂ©ation : changer la destination sans changer l'URL

❌ Inconvénients :

  • NĂ©cessite crĂ©ation via API ou dashboard AppsFlyer
  • Quota limitĂ© selon votre plan (ex : 10 000 liens/mois sur plan Growth)

Quand utiliser Short vs Long Link ?

Cas d'usage Short Link Long Link
SMS marketing ✅ Obligatoire ❌ Trop long
QR codes ✅ URL courte = QR simple ⚠️ QR complexe
Réseaux sociaux ✅ Esthétique ❌ URL moche
Email ✅ Préférable ✅ Acceptable
Pub display/video ✅ Tracking précis ✅ Les deux OK
Deep link dynamique ⚠️ Nécessite API ✅ Génération côté client
Debug / Test ❌ Paramètres cachés ✅ Paramètres visibles

Recommandation VOID : Utilisez Short Links pour toute communication externe (marketing, CRM), et Long Links pour la génération dynamique côté app/site (profils utilisateur, partage social in-app).

Générer des liens en masse

Méthode 1 : OneLink API (recommandé pour production)

AppsFlyer expose une API REST pour créer des Short Links programmatiquement.

Endpoint : Create Short Link

POST https://api2.appsflyer.com/v2.0/app/{app_id}/onelink
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json

{
  "onelink_id": "AbCd",
  "data": {
    "pid": "email",
    "c": "newsletter_janvier_2025",
    "af_dp": "yourapp://product/12345",
    "af_sub1": "user_7890"
  },
  "brand_domain": "yourapp.onelink.me"
}

Réponse :

{
  "short_link": "https://yourapp.onelink.me/AbCd/jan2025xyz",
  "onelink_id": "AbCd",
  "ttl": null
}

Script Node.js : génération de 10 000 liens

const axios = require('axios');
const csv = require('csv-parser');
const fs = require('fs');

const APPSFLYER_API = 'https://api2.appsflyer.com/v2.0/app';
const APP_ID = 'com.yourapp.mobile'; // Bundle ID iOS ou package Android
const ONELINK_ID = 'AbCd';
const API_TOKEN = 'YOUR_API_TOKEN'; // Généré dans AppsFlyer dashboard

async function createShortLink(params) {
  try {
    const response = await axios.post(
      `${APPSFLYER_API}/${APP_ID}/onelink`,
      {
        onelink_id: ONELINK_ID,
        data: params,
        brand_domain: 'yourapp.onelink.me'
      },
      {
        headers: {
          'Authorization': `Bearer ${API_TOKEN}`,
          'Content-Type': 'application/json'
        }
      }
    );
    return response.data.short_link;
  } catch (error) {
    console.error('Erreur création lien:', error.response?.data);
    return null;
  }
}

async function generateBulkLinks() {
  const links = [];
  
  // Lecture CSV avec 10 000 lignes (user_id, product_id, campaign)
  fs.createReadStream('users.csv')
    .pipe(csv())
    .on('data', async (row) => {
      const shortLink = await createShortLink({
        pid: 'crm',
        c: row.campaign,
        af_dp: `yourapp://product/${row.product_id}`,
        af_sub1: row.user_id,
        af_sub2: row.segment
      });
      
      if (shortLink) {
        links.push({ user_id: row.user_id, link: shortLink });
        console.log(`✅ Lien créé pour user ${row.user_id}: ${shortLink}`);
      }
      
      // Rate limiting : 100 requĂŞtes/min
      await new Promise(resolve => setTimeout(resolve, 600));
    })
    .on('end', () => {
      // Export CSV final
      const output = links.map(l => `${l.user_id},${l.link}`).join('\n');
      fs.writeFileSync('links_generated.csv', output);
      console.log(`🎉 ${links.length} liens générés !`);
    });
}

generateBulkLinks();

Optimisations pour génération massive :

  • Batch requests : regrouper 100 liens par requĂŞte (si supportĂ© par votre plan)
  • Workers parallèles : utiliser 5-10 workers Node.js simultanĂ©s
  • Redis cache : stocker les liens dĂ©jĂ  gĂ©nĂ©rĂ©s (Ă©viter duplicatas)
  • Retry logic : relancer automatiquement en cas d'erreur 5xx

Méthode 2 : Long Links générés côté client (illimité)

Pour des besoins dynamiques (ex : bouton "Partager ce produit" dans l'app), générez des Long Links côté client sans appeler l'API AppsFlyer.

// React Native : génération de Long Link
function generateDeepLink(productId, userId) {
  const baseUrl = 'https://yourapp.onelink.me/AbCd';
  const params = new URLSearchParams({
    pid: 'user_referral',
    c: 'in_app_share',
    af_dp: `yourapp://product/${productId}`,
    af_web_dp: `https://yoursite.com/product/${productId}`,
    af_sub1: userId,
    af_sub2: new Date().toISOString()
  });
  
  return `${baseUrl}?${params.toString()}`;
}

// Utilisation
const shareLink = generateDeepLink('12345', 'user_7890');
// https://yourapp.onelink.me/AbCd?pid=user_referral&c=in_app_share&af_dp=yourapp://product/12345&af_sub1=user_7890...

✅ Avantage : génération instantanée, illimitée, offline-first.

❌ Inconvénient : URL longue (mais fonctionnelle pour partage programmatique).

Deep Link vs Deferred Deep Link

Deep Link (app déjà installée)

Scénario : L'utilisateur clique sur un lien marketing alors que l'app est déjà installée.

Flux :

  1. Clic sur https://yourapp.onelink.me/AbCd/promo-noel
  2. AppsFlyer détecte que l'app est installée
  3. Ouverture immédiate de l'app via URI scheme ou Universal Link (iOS) / App Link (Android)
  4. L'app reçoit les paramètres : { deep_link_value: "promo-noel", campaign: "email_noel" }
  5. Navigation vers l'écran ciblé (ex : page promo Noël)

Implémentation (pseudo-code) :

// L'app intercepte le deep link au démarrage
onDeepLinkReceived((data) => {
  if (data.deep_link_value === 'promo-noel') {
    navigation.navigate('PromoScreen', { campaign: data.campaign });
  } else if (data.deep_link_value.startsWith('product/')) {
    const productId = data.deep_link_value.split('/')[1];
    navigation.navigate('ProductScreen', { id: productId });
  }
});

Deferred Deep Link (app non installée)

Scénario : L'utilisateur clique sur un lien marketing, l'app n'est pas installée.

Flux :

  1. Clic sur https://yourapp.onelink.me/AbCd/promo-noel
  2. AppsFlyer détecte que l'app n'est pas installée
  3. Redirection vers l'App Store / Play Store
  4. AppsFlyer stocke les paramètres du lien (device fingerprint + IDFA/GAID)
  5. L'utilisateur installe l'app
  6. Au 1er lancement, le SDK AppsFlyer récupère les paramètres stockés
  7. L'app navigue automatiquement vers l'écran ciblé (promo Noël)

Magie du Deferred Deep Link : L'utilisateur voit la promo Noël immédiatement après avoir ouvert l'app pour la 1ère fois, sans avoir à chercher.

Impact business :

  • +40% de conversion (vs. landing sur home gĂ©nĂ©rique)
  • -60% de taux d'abandon onboarding
  • +25% de retention J1 (expĂ©rience personnalisĂ©e dès le dĂ©part)

Différences techniques

Critère Deep Link Deferred Deep Link
App installée ? ✅ Oui ❌ Non
Redirection store ? ❌ Non ✅ Oui
Moment d'exécution Immédiat (au clic) Différé (au 1er lancement)
Matching Direct (URI scheme) Probabiliste (fingerprint) ou IDFA/GAID
Précision 100% 95-98% (peut échouer si changement de réseau)
Délai <1s Dépend du temps d'installation

Implémentation : React Native

Étape 1 : Installation du SDK

# NPM
npm install react-native-appsflyer --save

# Yarn
yarn add react-native-appsflyer

# Link automatique (React Native 0.60+)
cd ios && pod install && cd ..

Étape 2 : Configuration iOS (Info.plist)

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>yourapp</string>
    </array>
  </dict>
</array>

<!-- Universal Links (iOS 9+) -->
<key>com.apple.developer.associated-domains</key>
<array>
  <string>applinks:yourapp.onelink.me</string>
</array>

Étape 3 : Configuration Android (AndroidManifest.xml)

<activity android:name=".MainActivity">
  <!-- URI Scheme -->
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="yourapp" />
  </intent-filter>

  <!-- App Links (Android 6+) -->
  <intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="yourapp.onelink.me" />
  </intent-filter>
</activity>

Étape 4 : Initialisation du SDK (App.tsx)

import React, { useEffect } from 'react';
import appsFlyer from 'react-native-appsflyer';

const App = () => {
  useEffect(() => {
    // Configuration AppsFlyer
    appsFlyer.initSdk(
      {
        devKey: 'YOUR_DEV_KEY', // Clé API AppsFlyer
        isDebug: __DEV__, // Logs en mode dev
        appId: '123456789', // iOS App ID (6 chiffres de l'App Store)
        onInstallConversionDataListener: true, // Deferred Deep Link
        onDeepLinkListener: true, // Deep Link classique
        timeToWaitForATTUserAuthorization: 10, // iOS 14+ ATT prompt
      },
      (result) => {
        console.log('âś… AppsFlyer initialized:', result);
      },
      (error) => {
        console.error('❌ AppsFlyer init error:', error);
      }
    );

    // Listener pour Deferred Deep Link (1er lancement)
    appsFlyer.onInstallConversionData((data) => {
      console.log('📦 Install Conversion Data:', data);
      
      if (data?.data?.is_first_launch === true) {
        const deepLinkValue = data.data.deep_link_value;
        const campaign = data.data.campaign;
        
        console.log(`🎯 Deferred Deep Link: ${deepLinkValue}`);
        
        // Navigation vers l'écran ciblé
        if (deepLinkValue === 'promo-noel') {
          navigation.navigate('PromoScreen', { campaign });
        } else if (deepLinkValue?.startsWith('product/')) {
          const productId = deepLinkValue.split('/')[1];
          navigation.navigate('ProductScreen', { id: productId });
        }
      }
    });

    // Listener pour Deep Link (app déjà installée)
    appsFlyer.onDeepLink((data) => {
      console.log('đź”— Deep Link:', data);
      
      if (data?.deepLinkStatus === 'FOUND') {
        const deepLinkValue = data.data.deep_link_value;
        
        // MĂŞme logique de navigation
        if (deepLinkValue === 'promo-noel') {
          navigation.navigate('PromoScreen');
        } else if (deepLinkValue?.startsWith('product/')) {
          const productId = deepLinkValue.split('/')[1];
          navigation.navigate('ProductScreen', { id: productId });
        }
      }
    });
  }, []);

  return ;
};

export default App;

Étape 5 : Tracking d'événements custom

import appsFlyer from 'react-native-appsflyer';

// Event : Achat complété
appsFlyer.logEvent('af_purchase', {
  af_revenue: 49.99,
  af_currency: 'EUR',
  af_order_id: 'ORDER_12345',
  af_content_id: 'PRODUCT_67890',
  af_quantity: 2,
  custom_param: 'black_friday'
});

// Event : Ajout au panier
appsFlyer.logEvent('af_add_to_cart', {
  af_content_id: 'PRODUCT_67890',
  af_price: 24.99,
  af_currency: 'EUR'
});

// Event custom métier
appsFlyer.logEvent('user_completed_onboarding', {
  user_segment: 'premium',
  source: 'facebook_ad'
});

Implémentation : iOS natif (Swift)

Étape 1 : Installation via CocoaPods

# Podfile
pod 'AppsFlyerFramework'

# Terminal
pod install

Étape 2 : Configuration AppDelegate.swift

import UIKit
import AppsFlyerLib

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        
        // Configuration AppsFlyer
        AppsFlyerLib.shared().appsFlyerDevKey = "YOUR_DEV_KEY"
        AppsFlyerLib.shared().appleAppID = "123456789"
        AppsFlyerLib.shared().isDebug = true
        AppsFlyerLib.shared().delegate = self
        
        // Deep Link Delegate
        AppsFlyerLib.shared().deepLinkDelegate = self
        
        return true
    }
    
    // Universal Links (iOS 9+)
    func application(
        _ application: UIApplication,
        continue userActivity: NSUserActivity,
        restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
    ) -> Bool {
        AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
        return true
    }
    
    // URI Scheme
    func application(
        _ app: UIApplication,
        open url: URL,
        options: [UIApplication.OpenURLOptionsKey : Any] = [:]
    ) -> Bool {
        AppsFlyerLib.shared().handleOpen(url, options: options)
        return true
    }
}

// MARK: - AppsFlyerLibDelegate
extension AppDelegate: AppsFlyerLibDelegate {
    
    // Deferred Deep Link (1er lancement)
    func onConversionDataSuccess(_ conversionInfo: [AnyHashable : Any]) {
        print("📦 Conversion Data: \(conversionInfo)")
        
        if let status = conversionInfo["af_status"] as? String,
           status == "Non-organic" {
            
            if let isFirstLaunch = conversionInfo["is_first_launch"] as? Bool,
               isFirstLaunch {
                
                // Deep Link Value
                if let deepLinkValue = conversionInfo["deep_link_value"] as? String {
                    print("🎯 Deferred Deep Link: \(deepLinkValue)")
                    handleDeepLink(deepLinkValue)
                }
            }
        }
    }
    
    func onConversionDataFail(_ error: Error) {
        print("❌ Conversion Data Error: \(error)")
    }
}

// MARK: - DeepLinkDelegate
extension AppDelegate: DeepLinkDelegate {
    
    // Deep Link (app déjà installée)
    func didResolveDeepLink(_ result: DeepLinkResult) {
        switch result.status {
        case .found:
            guard let deepLinkValue = result.deepLink?.deeplinkValue else { return }
            print("đź”— Deep Link: \(deepLinkValue)")
            handleDeepLink(deepLinkValue)
            
        case .notFound:
            print("⚠️ Deep Link not found")
            
        @unknown default:
            print("âť“ Unknown Deep Link status")
        }
    }
    
    // Logique commune de navigation
    private func handleDeepLink(_ deepLinkValue: String) {
        if deepLinkValue == "promo-noel" {
            // Navigation vers PromoViewController
            let promoVC = PromoViewController()
            window?.rootViewController?.present(promoVC, animated: true)
            
        } else if deepLinkValue.starts(with: "product/") {
            let productId = deepLinkValue.replacingOccurrences(of: "product/", with: "")
            let productVC = ProductViewController(productId: productId)
            window?.rootViewController?.present(productVC, animated: true)
        }
    }
}

Étape 3 : Tracking d'événements

// Achat
AppsFlyerLib.shared().logEvent(
    AFEventPurchase,
    withValues: [
        AFEventParamRevenue: 49.99,
        AFEventParamCurrency: "EUR",
        AFEventParamOrderId: "ORDER_12345",
        AFEventParamContentId: "PRODUCT_67890"
    ]
)

// Event custom
AppsFlyerLib.shared().logEvent(
    "user_completed_onboarding",
    withValues: [
        "user_segment": "premium",
        "source": "facebook_ad"
    ]
)

Implémentation : Android natif (Kotlin)

Étape 1 : Installation (build.gradle)

// App-level build.gradle
dependencies {
    implementation 'com.appsflyer:af-android-sdk:6.12.2'
}

Étape 2 : Configuration (MainApplication.kt)

import com.appsflyer.AppsFlyerLib
import com.appsflyer.AppsFlyerConversionListener
import com.appsflyer.deeplink.DeepLinkListener

class MainApplication : Application() {
    
    override fun onCreate() {
        super.onCreate()
        
        // Configuration AppsFlyer
        AppsFlyerLib.getInstance().apply {
            init("YOUR_DEV_KEY", conversionListener, this@MainApplication)
            setDebugLog(BuildConfig.DEBUG)
            start(this@MainApplication)
        }
        
        // Deep Link Listener
        AppsFlyerLib.getInstance().subscribeForDeepLink(deepLinkListener)
    }
    
    // Deferred Deep Link
    private val conversionListener = object : AppsFlyerConversionListener {
        override fun onConversionDataSuccess(conversionData: Map?) {
            Log.d("AppsFlyer", "Conversion Data: $conversionData")
            
            conversionData?.let { data ->
                if (data["is_first_launch"] as? Boolean == true) {
                    val deepLinkValue = data["deep_link_value"] as? String
                    deepLinkValue?.let { handleDeepLink(it) }
                }
            }
        }
        
        override fun onConversionDataFail(error: String?) {
            Log.e("AppsFlyer", "Conversion Error: $error")
        }
        
        override fun onAppOpenAttribution(data: Map?) {}
        override fun onAttributionFailure(error: String?) {}
    }
    
    // Deep Link
    private val deepLinkListener = DeepLinkListener { deepLinkResult ->
        when (deepLinkResult.status) {
            DeepLinkResult.Status.FOUND -> {
                val deepLinkValue = deepLinkResult.deepLink?.getStringValue("deep_link_value")
                deepLinkValue?.let { handleDeepLink(it) }
            }
            else -> Log.w("AppsFlyer", "Deep Link not found")
        }
    }
    
    private fun handleDeepLink(deepLinkValue: String) {
        val intent = when {
            deepLinkValue == "promo-noel" -> 
                Intent(this, PromoActivity::class.java)
            deepLinkValue.startsWith("product/") -> 
                Intent(this, ProductActivity::class.java).apply {
                    putExtra("product_id", deepLinkValue.replace("product/", ""))
                }
            else -> null
        }
        
        intent?.let {
            it.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            startActivity(it)
        }
    }
}

Étape 3 : Tracking d'événements

// Achat
val eventValues = mapOf(
    AFInAppEventParameterName.REVENUE to 49.99,
    AFInAppEventParameterName.CURRENCY to "EUR",
    AFInAppEventParameterName.ORDER_ID to "ORDER_12345",
    AFInAppEventParameterName.CONTENT_ID to "PRODUCT_67890"
)
AppsFlyerLib.getInstance().logEvent(
    applicationContext,
    AFInAppEventType.PURCHASE,
    eventValues
)

// Event custom
AppsFlyerLib.getInstance().logEvent(
    applicationContext,
    "user_completed_onboarding",
    mapOf(
        "user_segment" to "premium",
        "source" to "facebook_ad"
    )
)

Best practices AppsFlyer (retour d'expérience VOID)

1. Toujours tester les Deep Links avant production

AppsFlyer propose un outil de test intégré au dashboard :

  • OneLink Validator : gĂ©nère un QR code de test
  • Scannez avec votre device de test
  • VĂ©rifiez que l'app s'ouvre sur le bon Ă©cran
  • Consultez les logs en temps rĂ©el dans le dashboard

2. Utiliser des paramètres custom pour le contexte utilisateur

Exploitez af_sub1 à af_sub5 pour personnaliser l'expérience :

  • af_sub1 : user_id (pour retrouver le compte)
  • af_sub2 : promo_code (appliquer une rĂ©duction)
  • af_sub3 : referrer_id (programme de parrainage)
  • af_sub4 : landing_screen (forcer une destination spĂ©cifique)
  • af_sub5 : timestamp (debug)

3. Implémenter un fallback gracieux

// Si le deep link échoue, afficher la home
function handleDeepLink(deepLinkValue) {
  try {
    if (deepLinkValue === 'promo-noel') {
      navigation.navigate('PromoScreen');
    } else if (deepLinkValue?.startsWith('product/')) {
      const productId = deepLinkValue.split('/')[1];
      navigation.navigate('ProductScreen', { id: productId });
    } else {
      // Fallback : home
      navigation.navigate('HomeScreen');
    }
  } catch (error) {
    console.error('Deep Link error:', error);
    navigation.navigate('HomeScreen'); // Toujours une destination par défaut
  }
}

4. Monitorer les événements critiques

Configurez des alertes AppsFlyer pour :

  • Baisse soudaine d'installations (>20% vs. moyenne 7 jours)
  • Hausse de fraude dĂ©tectĂ©e (>5% du trafic)
  • CPI dĂ©passant le seuil budget (ex : >5€/install)
  • Taux de deep link failure >10%

5. RGPD / CCPA : demander le consentement

// Désactiver le tracking si l'utilisateur refuse
if (userConsentDeclined) {
  AppsFlyerLib.shared().isStopped = true; // iOS
  AppsFlyerLib.getInstance().stop(true, context); // Android
}

Alternatives Ă  AppsFlyer

Plateforme Forces Faiblesses Prix
AppsFlyer Leader, fraud protection, deep linking avancé Cher pour startups $$$
Adjust Interface simple, bon support Moins de features fraud $$
Branch Deep linking gratuit, facile Attribution moins précise $ (freemium)
Kochava Bon rapport qualité/prix UI datée $$
Singular ROI focus, marketing automation Moins connu $$

Recommandation VOID : AppsFlyer pour projets enterprise (banques, assurances, grandes marques), Branch pour startups avec budget limité.

Conclusion : AppsFlyer, indispensable pour l'acquisition mobile

AppsFlyer est devenu incontournable pour toute stratégie mobile sérieuse :

  • âś… Attribution prĂ©cise : 98% de matching (vs. 60-70% Google Analytics)
  • âś… Protection fraud : Ă©conomie 15-25% du budget pub
  • âś… Deep linking : +40% de conversion onboarding
  • âś… Analytics temps rĂ©el : LTV, cohortes, ROI par canal
  • âś… IntĂ©gration universelle : React Native, iOS, Android, Unity, Flutter...

Chez VOID, nous intégrons AppsFlyer depuis 2018 sur des apps à 1M+ utilisateurs. Notre expertise couvre :

  • đź”§ Setup technique : SDK, deep linking, Universal Links/App Links
  • 📊 StratĂ©gie d'attribution : multi-touch, view-through, modèles custom
  • 🚀 Campagnes optimisĂ©es : A/B testing, cohort analysis, LTV prediction
  • 🛡️ Fraud management : règles custom, blacklists, monitoring temps rĂ©el

Besoin d'aide sur AppsFlyer ?

VOID vous accompagne sur :

  • âś… Audit de votre setup actuel (deep links, Ă©vĂ©nements, fraud)
  • âś… ImplĂ©mentation SDK React Native / iOS / Android
  • âś… GĂ©nĂ©ration de liens en masse (API, scripts, automatisation)
  • âś… Formation Ă©quipes (marketing, tech, product)
  • âś… Optimisation ROI (rĂ©duire CPI, maximiser LTV)

« Avec AppsFlyer, nous avons réduit notre CPI de 42% en 3 mois en identifiant les canaux réellement performants et en bloquant 18% de fraude. »

— Directeur Marketing Digital (client VOID)

Tags:

AppsFlyerAttributionDeep LinkingReact NativeiOSAndroidMobile Analytics

Need Expert Support?

VOID accompanies you in your digital transformation projects in Morocco and Africa.