---
title: "AppsFlyer"
description: "Gelişmiş mobil attribution takibi için AppsFlyer'ı Adapty ile entegre edin."
---

[AppsFlyer](https://www.appsflyer.com/), mobil attribution ve pazarlama analitiği alanında önde gelen bir platformdur. Pazarlama kampanyalarından gelen verileri toplayan ve düzenleyen üçüncü taraf bir hizmettir. Bu sayede şirketler, kampanyalarının ne kadar başarılı olduğunu tek bir yerden görebilir.

Adapty, mağazalardan gelen [abonelik etkinliklerini](events) tek bir yerde takip etmenizi sağlayan eksiksiz bir veri seti sunar. Adapty ile abonelerinizin davranışlarını kolayca izleyebilir, tercihlerini öğrenebilir ve bu bilgileri hedefli ve etkili bir şekilde iletişim kurmak için kullanabilirsiniz. Bu entegrasyon sayesinde abonelik etkinliklerini AppsFlyer'da takip edebilir ve kampanyalarınızın tam olarak ne kadar gelir ürettiğini analiz edebilirsiniz.

Adapty ile AppsFlyer arasındaki entegrasyon iki ana şekilde çalışır.

1. **AppsFlyer'dan attribution verisi alma**  
   [Uygulama kodunuzda AppsFlyer attribution'ını Adapty'ye göndermeyi ayarladıktan](appsflyer#connect-your-app-to-appsflyer) sonra Adapty, AppsFlyer'dan attribution verisi almaya başlar. Bu verilere kullanıcının profil sayfasından kolayca ulaşabilirsiniz.

  <img src="/assets/shared/img/c2991f6-CleanShot_2023-08-04_at_16.29.202x.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

2. **AppsFlyer'a abonelik etkinlikleri gönderme**  
   Adapty, entegrasyonunuzda yapılandırılan tüm abonelik etkinliklerini AppsFlyer'a gönderebilir. Böylece bu etkinlikleri AppsFlyer kontrol panelinde takip edebilirsiniz. Bu entegrasyon, reklam kampanyalarınızın etkinliğini değerlendirmek için oldukça faydalıdır.

## Yapılandırmayı ayarlama \{#set-up-configuration\}

### Adapty'yi AppsFlyer'a bağlama \{#connect-adapty-to-appsflyer\}

AppsFlyer entegrasyonunu kurmak için:

1. Adapty Kontrol Paneli'nde [**Integrations** -> **AppsFlyer**](https://app.adapty.io/integrations/appsflyer) sayfasını açın.

2. Entegrasyonu etkinleştirmek için geçiş düğmesini açın.

3. Sonraki adımda kimlik bilgilerini girmeniz gerekiyor.  
   iOS için, [App Store Connect](https://appstoreconnect.apple.com/) üzerinde uygulamanızın sayfasını açın, **General** bölümündeki **App Information** sayfasına gidin ve ekranın sol alt kısmında yer alan **Apple ID**'yi kopyalayın.

  <img src="/assets/shared/img/43a5cc6-apple_id.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

3.2. Kopyaladığınız **Apple ID**'yi Adapty Kontrol Paneli'ndeki **iOS App ID** alanına yapıştırın.

  <img src="/assets/shared/img/61bff5a-appsflyer_iOS_app_id.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

:::warning

AppsFlyer API 2 kullanıyorsanız, eski sürüm yakında kullanımdan kaldırılacağı için API 3'e geçmeniz gerekiyor. Bunun için **AppsFlyer S2S API** listesinden **API 3**'ü seçin.

:::

5. iOS ve Android için [AppsFlyer sitesini](https://www.appsflyer.com/home) açın ve oturum açın.

6. Kontrol panelinin sağ üst köşesindeki **Your account name** -> **Security Center** seçeneğine tıklayın.

  <img src="/assets/shared/img/1c18c50-appsflyer_security_center.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

7. **Manage your account security** penceresinde **Manage your AppsFlyer API and S2S tokens** düğmesine tıklayın.

8. S2S token'ınız varsa 12. adıma geçin. Yoksa **New token** düğmesine tıklayın.

  <img src="/assets/shared/img/7934920-appsflyer_new_token.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

9. **New token** penceresinde token için bir isim girin. Bu isim yalnızca sizin referansınız için kullanılır.

10. **Choose type** listesinden **S2S**'i seçin.

11. Yeni token'ı kaydetmek için **Create new token** düğmesine tıklayın.

12. **Tokens** penceresinde S2S token'ını kopyalayın.

13. Adapty Kontrol Paneli'nde kopyaladığınız S2S anahtarını **Dev key for iOS** ve **Dev key for Android** alanlarına yapıştırın.

  <img src="/assets/shared/img/a7d1c31-appsflyer_dev_keys.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

14. Değişiklikleri kaydetmek için **Save** düğmesine tıklayın.

    :::info
    
    AppsFlyer'ın server2server entegrasyonu için Sandbox modu yoktur. Bu nedenle Sandbox Dev Key için AppsFlyer'da ayrı bir uygulama/hesap kullanmanız gerekir. Sandbox etkinliklerini aynı uygulamaya göndermek istiyorsanız production ve sandbox için aynı anahtarı kullanabilirsiniz.
    :::

Adapty, bazı etkinlikleri varsayılan olarak AppsFlyer'ın [standart etkinlikleriyle](https://support.appsflyer.com/hc/en-us/articles/115005544169-Rich-in-app-events-for-Android-and-iOS#event-types) eşleştirir. Bu yapılandırma sayesinde AppsFlyer, ek bir kurulum gerektirmeden etkinlikleri kullandığınız her reklam ağına iletebilir.

Önemli bir diğer nokta da AppsFlyer'ın 26 saatten eski etkinlikleri desteklememesidir. 26 saatten eski bir etkinliğiniz varsa, Adapty onu AppsFlyer'a gönderir; ancak etkinliğin tarih ve saati mevcut zaman damgasıyla değiştirilir.

### Etkinlikleri ve etiketleri yapılandırma \{#configure-events-and-tags\}

Kimlik bilgilerinin altında, Adapty'den AppsFlyer'a gönderebileceğiniz üç grup etkinlik bulunur. İhtiyacınız olanları açmanız yeterli. Adapty'nin sunduğu etkinliklerin tam listesine [buradan](events) ulaşabilirsiniz.

  <img src="/assets/shared/img/1b0c777-CleanShot_2023-08-11_at_14.56.362x.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

Adapty'nin sağladığı varsayılan etkinlik adlarını kullanmanızı öneririz. Ancak ihtiyacınıza göre etkinlik adlarını değiştirebilirsiniz.

Adapty, abonelik etkinliklerini server-to-server entegrasyonu aracılığıyla AppsFlyer'a gönderir. Bu sayede tüm abonelik etkinliklerini AppsFlyer kontrol panelinizde görüntüleyebilir ve bunları edinim kampanyalarınızla ilişkilendirebilirsiniz.

### Uygulamanızı AppsFlyer'a bağlama \{#connect-your-app-to-appsflyer\}

Yukarıdaki adımları tamamladıktan sonra, attribution verilerini kaydetmek için `updateAttribution` metodunu çağırın ve entegrasyon tanımlayıcısını ayarlamak için `Adapty.setIntegrationIdentifier()` kullanın.

:::warning
`networkUserId` parametresi zorunludur.
:::

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS (Swift)" default>

```swift showLineNumbers
class YourAppsFlyerLibDelegateImplementation {
    // Find your implementation of AppsFlyerLibDelegate 
    // and update onConversionDataSuccess method:
    func onConversionDataSuccess(_ conversionInfo: [AnyHashable : Any]) {
        let uid = AppsFlyerLib.shared().getAppsFlyerUID()
        Adapty.setIntegrationIdentifier(key: "appsflyer_id", value: uid)
        Adapty.updateAttribution(conversionInfo, source: "appsflyer")
    }
}
```
</TabItem>

<TabItem value="kotlin" label="Android (Kotlin)" default>

```kotlin showLineNumbers
val conversionListener: AppsFlyerConversionListener = object : AppsFlyerConversionListener {
    override fun onConversionDataSuccess(conversionData: Map<String, Any>) {
        val uid = AppsFlyerLib.getInstance().getAppsFlyerUID(context)
        Adapty.setIntegrationIdentifier("appsflyer_id", uid) { error ->
            if (error != null) {
                // handle the error
            }
        }
        Adapty.updateAttribution(conversionData, "appsflyer") { error ->
            if (error != null) {
                //handle the error
            }
        }
    }
}
```
</TabItem>
<TabItem value="rn" label="React Native (TS)" default>

```typescript showLineNumbers

appsFlyer.onInstallConversionData(installData => {
    appsFlyer.getAppsFlyerUID((error, networkUserId) => {
        if (error) {
            // handle the error
        }
        try {
            adapty.updateAttribution(installData, AttributionSource.AppsFlyer, networkUserId);
        } catch (error) {
            // handle the error
        }
    });
});

// ...
appsFlyer.initSdk(/*...*/);
```
</TabItem>
<TabItem value="flutter" label="Flutter (Dart)" default>

```javascript showLineNumbers

AppsflyerSdk appsflyerSdk = AppsflyerSdk(<YOUR_OPTIONS>);

appsflyerSdk.onInstallConversionData((data) async {
    try {
        final appsFlyerUID = await appsFlyerSdk.getAppsFlyerUID();
        
        await Adapty().setIntegrationIdentifier(
          key: "appsflyer_id", 
          value: appsFlyerUID,
        );
        
        await Adapty().updateAttribution(data, source: "appsflyer");
    } on AdaptyError catch (adaptyError) {
        // handle the error
    } catch (e) {
        // handle the error
    }
});

appsflyerSdk.initSdk(
    registerConversionDataCallback: true,
    registerOnAppOpenAttributionCallback: true,
    registerOnDeepLinkingCallback: true,
);
```
</TabItem>
<TabItem value="unity" label="Unity (C#)" default>

```csharp showLineNumbers
using AdaptySDK;
using AppsFlyerSDK;

// before SDK initialization
AppsFlyer.getConversionData(this.name);

// in your IAppsFlyerConversionData
void onConversionDataSuccess(string conversionData) {
    string appsFlyerId = AppsFlyer.getAppsFlyerId();
    
    Adapty.SetIntegrationIdentifier(
      "appsflyer_id", 
      appsFlyerId, 
      (error) => {
        // handle the error
    });
    
    Adapty.UpdateAttribution(
      conversionData, 
      "appsflyer",
      (error) => {
        // handle the error
    });
}
```
</TabItem>
</Tabs>

## Etkinlik yapısı \{#event-structure\}

Adapty, seçilen etkinlikleri JSON gövdesiyle POST isteği olarak AppsFlyer'a gönderir:
- API v2: `https://api2.appsflyer.com/inappevent/{app_id}`
- API v3: `https://api3.appsflyer.com/inappevent/{app_id}` (önerilen)

Her etkinlik şu yapıdadır:

```json
{
  "appsflyer_id": "1699887556000-6192770",
  "eventName": "subscription_renewed",
  "eventTime": "2024-03-01 12:00:00",
  "eventValue": "{\"af_content_id\":\"yearly.premium.6999\",\"af_order_id\":\"GPA.3383-4699-1373-07113\",\"store_country\":\"US\",\"profile_country\":\"US\",\"af_content_type\":\"in_app\",\"af_revenue\":\"9.9900\",\"af_currency\":\"USD\",\"af_quantity\":\"1\"}",
  "os": "17.0.1",
  "bundleIdentifier": "com.example.app",
  "customer_user_id": "user_12345",
  "eventCurrency": "USD",
  "ip": "192.168.100.1",
  "advertising_id": "00000000-0000-0000-0000-000000000000",
  "idfa": "00000000-0000-0000-0000-000000000000",
  "idfv": "00000000-0000-0000-0000-000000000000",
  "att": "3"
}
```

Parametreler:

| Parametre          | Tür    | Açıklama                                                                              |
|:-------------------|:-------|:--------------------------------------------------------------------------------------|
| `appsflyer_id`     | String | AppsFlyer ID (SDK aracılığıyla toplanır).                                             |
| `eventName`        | String | AppsFlyer etkinlik adı (Adapty etkinliğinden eşleştirilir).                           |
| `eventTime`        | String | Etkinliğin tarih ve saati (UTC, `YYYY-MM-DD HH:MM:SS` biçiminde).                    |
| `eventValue`       | String | Etkinlik ayrıntılarını içeren JSON dizesi (aşağıya bakın).                            |
| `os`               | String | İşletim sistemi sürümü.                                                               |
| `bundleIdentifier` | String | Uygulamanın bundle ID'si / paket adı.                                                 |
| `customer_user_id` | String | Kullanıcının Customer User ID'si.                                                     |
| `eventCurrency`    | String | Para birimi kodu (örn. "USD").                                                        |
| `ip`               | String | Kullanıcının IP adresi.                                                               |
| `advertising_id`   | String | **Yalnızca Android**. Google Advertising ID.                                          |
| `idfa`             | String | **Yalnızca iOS**. Reklamverenler için ID.                                             |
| `idfv`             | String | **Yalnızca iOS**. Satıcılar için ID.                                                  |
| `att`              | String | **Yalnızca iOS**. App Tracking Transparency durumu (örn. yetkili için "3").           |

`eventValue` parametresi, aşağıdaki alanları içeren JSON kodlu bir dizedir:

| Parametre         | Tür    | Açıklama                                                   |
|:------------------|:-------|:-----------------------------------------------------------|
| `af_content_id`   | String | Mağazadaki Ürün ID'si.                                     |
| `af_order_id`     | String | Orijinal işlem ID'si.                                      |
| `store_country`   | String | Mağaza kullanıcısının ülke kodu.                           |
| `profile_country` | String | Kullanıcının IP'sine göre belirlenen ülke kodu.            |
| `af_content_type` | String | Gelir varsa her zaman `in_app`.                            |
| `af_revenue`      | String | 4 ondalık basamak olarak biçimlendirilmiş gelir tutarı.    |
| `af_currency`     | String | Para birimi kodu.                                          |
| `af_quantity`     | String | Gelir varsa her zaman `1`.                                 |

## Sorun giderme \{#troubleshooting\}

### Gelir tutarsızlığı \{#revenue-discrepancy\}

Adapty ile AppsFlyer arasında gelir tutarsızlığı varsa, bunun nedeni muhtemelen tüm kullanıcılarınızın Adapty SDK'sına sahip uygulama sürümünü kullanmamasıdır. Veri tutarlılığını sağlamak için kullanıcılarınızı Adapty SDK'sını içeren sürüme güncellemeye zorlayabilirsiniz.

### Eksik entegrasyon verisi \{#missing-integration-data\}

Etkinlik gönderimi başarısız oluyorsa, bunun nedeni genellikle eksik entegrasyon verisidir. Sorunu çözmek için aşağıdakileri kontrol edin:
- Uygulamanızda AppsFlyer SDK'sı yüklü olmalıdır.
- `getAppsFlyerUID` metodunu çağırıyor olmalısınız.

### Kimlik doğrulama hatası \{#authentication-failure\}

Konsolda `Failed to authenticate` hatası alıyorsanız, bu durum AppsFlyer sürümü ile kimlik bilgisi sürümü uyumsuzluğundan kaynaklanıyor olabilir.

[Geçiş kılavuzuna](switch-from-appsflyer-s2s-api-2-to-3) bakın ya da kimlik bilgilerini [buradan](https://hq1.appsflyer.com/security-center/api-tokens) geçerli olanlarla değiştirin.