---
title: "Recevoir les données d'attribution dans votre application"
description: "Accédez aux données d'attribution de campagne dans votre application après qu'Adapty a associé une installation à une campagne."
---

Lorsqu'Adapty associe une installation à une campagne, il renvoie les données d'attribution à votre application via le callback `onInstallationDetailsSuccess`. Utilisez ces données pour personnaliser l'expérience utilisateur en fonction du canal ou de la campagne qui a généré l'installation.

Les données d'attribution sont renvoyées sous forme d'objet `attribution` imbriqué dans le champ `payload`. Il contient les champs suivants :

| Champ | Description |
|---|---|
| `channel` | Canal d'acquisition (ex. `facebook`, `tiktok`, `google`, `organic`) |
| `campaign_id` | Identifiant de la campagne |
| `campaign_name` | Nom de la campagne |
| `adset_id` | Identifiant du groupe d'annonces |
| `adset_name` | Nom du groupe d'annonces |
| `ad_id` | Identifiant de l'annonce / du visuel |
| `ad_name` | Nom de l'annonce / du visuel |

Tous les champs sont optionnels. Pour les installations organiques ou lorsque l'attribution n'a pas pu être déterminée, le champ `payload` ne contient pas l'objet `attribution`.

Pour lire les données d'attribution dans votre application :

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

```swift showLineNumbers
Adapty.delegate = self

nonisolated func onInstallationDetailsSuccess(_ details: AdaptyInstallationDetails) {
    guard
        let payloadDict = details.payload?.dictionary,
        let attribution = payloadDict["attribution"] as? [String: Any]
    else { return }

    let channel = attribution["channel"] as? String
    let campaignName = attribution["campaign_name"] as? String
    let adName = attribution["ad_name"] as? String

    print("Channel: \(channel ?? "organic")")
}
```

</TabItem>

<TabItem value="android" label="Kotlin">

```kotlin showLineNumbers
Adapty.setOnInstallationDetailsListener(object : OnInstallationDetailsListener {
    override fun onInstallationDetailsSuccess(details: AdaptyInstallationDetails) {
        val payloadStr = details.payload ?: return
        runCatching {
            val payload = JSONObject(payloadStr)
            val attribution = payload.optJSONObject("attribution") ?: return

            val channel = attribution.optString("channel")
            val campaignName = attribution.optString("campaign_name")
            val adName = attribution.optString("ad_name")

            println("Channel: $channel")
        }.onFailure(Throwable::printStackTrace)
    }
})
```

</TabItem>

<TabItem value="rn" label="React Native">

```typescript showLineNumbers
adapty.addEventListener('onInstallationDetailsSuccess', details => {
    try {
        if (!details.payload) return;
        const payload = JSON.parse(details.payload);
        const attribution = payload.attribution;
        if (!attribution) return;

        const channel = attribution.channel;
        const campaignName = attribution.campaign_name;
        const adName = attribution.ad_name;

        console.log('Channel:', channel ?? 'organic');
    } catch (error) {
        console.error('Error parsing payload:', error);
    }
});
```

</TabItem>

<TabItem value="flutter" label="Flutter">

```dart showLineNumbers
Adapty().onUpdateInstallationDetailsSuccessStream.listen((details) {
  final payloadStr = details.payload;
  if (payloadStr == null) return;

  final payload = json.decode(payloadStr) as Map<String, dynamic>;
  final attribution = payload['attribution'] as Map<String, dynamic>?;
  if (attribution == null) return;

  final channel = attribution['channel'] as String?;
  final campaignName = attribution['campaign_name'] as String?;
  final adName = attribution['ad_name'] as String?;

  print('Channel: ${channel ?? 'organic'}');
});
```

</TabItem>

</Tabs>