---
title: "Recibir datos de atribución en tu app"
description: "Accede a los datos de atribución de campaña en tu app después de que Adapty asocie una instalación a una campaña."
---

Cuando Adapty asocia una instalación a una campaña, devuelve los datos de atribución a tu app a través del callback `onInstallationDetailsSuccess`. Usa estos datos para personalizar la experiencia del usuario según el canal o la campaña que generó la instalación.

Los datos de atribución se devuelven como un objeto `attribution` anidado dentro del campo `payload`. Contiene los siguientes campos:

| Campo | Descripción |
|---|---|
| `channel` | Canal de adquisición (p. ej. `facebook`, `tiktok`, `google`, `organic`) |
| `campaign_id` | Identificador de la campaña |
| `campaign_name` | Nombre de la campaña |
| `adset_id` | Identificador del conjunto de anuncios / grupo de anuncios |
| `adset_name` | Nombre del conjunto de anuncios / grupo de anuncios |
| `ad_id` | Identificador del anuncio / creatividad |
| `ad_name` | Nombre del anuncio / creatividad |

Todos los campos son opcionales. Para instalaciones orgánicas o cuando no se pudo determinar la atribución, el campo `payload` no incluye el objeto `attribution`.

Para leer los datos de atribución en tu app:

<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>