---
title: "Adjust"
description: "Conecta Adjust con Adapty para un mejor seguimiento de suscripciones y análisis."
---

[Adjust](https://www.adjust.com/) es una de las principales plataformas MMP (Mobile Measurement Partner) que recopila y presenta datos de campañas de marketing para ayudar a las empresas a medir el rendimiento de sus campañas.

Adapty proporciona un conjunto completo de datos que te permite rastrear [eventos de suscripción](events) de los stores en un solo lugar. Con Adapty, puedes ver fácilmente el comportamiento de tus suscriptores, conocer sus preferencias y usar esa información para comunicarte con ellos de forma dirigida y efectiva. Esta integración te permite rastrear eventos de suscripción en Adjust y analizar con precisión cuántos ingresos generan tus campañas.

La integración entre Adapty y Adjust funciona de dos maneras principales.

1. **Adapty recibe datos de atribución de Adjust**  
   Una vez que hayas configurado la integración con Adjust, Adapty comenzará a recibir datos de atribución de Adjust. Puedes acceder a estos datos fácilmente en la página del perfil del usuario.

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

2. **Adapty envía eventos de suscripción a Adjust**  
   Adapty puede enviar todos los eventos de suscripción configurados en tu integración a Adjust. Como resultado, podrás rastrear estos eventos dentro del dashboard de Adjust. Esta integración es muy útil para evaluar la efectividad de tus campañas publicitarias.

## Configurar la integración \{#set-up-integration\}

### Conectar Adapty a Adjust \{#connect-adapty-to-adjust\}

1. Abre el Adapty Dashboard y ve a [Integrations > Adjust](https://app.adapty.io/integrations/adjust).

2. Activa el interruptor en la parte superior de la página.

3. Rellena los campos e introduce tus credenciales de acceso.

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

3. Si habilitaste la autorización OAuth en la plataforma de Adjust, es obligatorio proporcionar un **OAuth Token** durante el proceso de integración para tus apps de iOS y Android.
4. A continuación, proporciona los **app tokens** para tus apps de iOS y Android. Abre tu dashboard de Adjust y verás tus apps.

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

  :::note
  Puedes tener aplicaciones de Adjust distintas para iOS y Android, por eso en Adapty hay dos secciones independientes para ello. Si solo tienes una app de Adjust, simplemente introduce la misma información en ambas.
  :::

5. Selecciona tu app de la lista y copia el **App Token**. Pega el token en el campo correspondiente del dashboard de Adapty.

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

### Configurar eventos y etiquetas \{#configure-events-and-tags\}

Adjust funciona de manera algo diferente al resto de plataformas. Debes crear los eventos manualmente en el dashboard de Adjust, obtener los tokens de evento y copiarlos en los eventos correspondientes en Adapty.

El primer paso es encontrar los tokens de evento para todos los eventos que quieres que Adapty envíe. Para eso:

1. En el dashboard de Adjust, abre tu app y cambia a la pestaña **Events**.

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

1. Copia el token del evento y pégalo en Adapty. Debajo de las credenciales encontrarás tres grupos de eventos que puedes enviar desde Adapty a Adjust. Consulta la lista completa de eventos que ofrece Adapty [aquí](events).

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

Adapty enviará eventos de suscripción a Adjust mediante una integración servidor a servidor, lo que te permitirá ver todos los eventos de suscripción en tu dashboard de Adjust y vincularlos a tus campañas de adquisición.

:::important
Ten en cuenta lo siguiente:

- Adjust no admite eventos con más de 58 días de antigüedad. Si tienes un evento anterior a ese plazo, Adapty lo enviará a Adjust, pero la fecha y hora del evento se reemplazará por la marca de tiempo actual.
- Adjust no es compatible con IPv6. Si desactivas la recopilación de IP en el SDK desde **App settings** o al activar el SDK, puede que solo se envíe una IPv6 del backend y el seguimiento falle — mantén la recopilación de IP del SDK activada para asegurarte de que se use IPv4.

:::

### Conectar tu app a Adjust \{#connect-your-app-to-adjust\}

Tras completar los pasos anteriores, añade los dos métodos siguientes a tu app. Establecerán la comunicación entre tu app y Adjust:

1. **Para enviar datos de suscripción a Adjust**: pasa el ID de dispositivo de Adjust al método `setIntegrationIdentifier()` del SDK.
2. **Para recibir datos de atribución de Adjust**: actualiza los datos de atribución con el método `updateAttribution()` del SDK.

Para Adjust versión 5.0 o posterior, usa el siguiente ejemplo:

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

```swift showLineNumbers
class AdjustModuleImplementation {

func updateAdjustAdid() {
    Adjust.adid { adid in
        guard let adid else { return }
        Adapty.setIntegrationIdentifier(key: "adjust_device_id", value: adid)
    }
}
func updateAdjustAttribution() {
    Adjust.attribution { attribution in
        guard let attribution = attribution?.dictionary() else { 
            return
        }
        
        Adapty.updateAttribution(attribution, source: "adjust")
    }
}
```

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

```kotlin showLineNumbers
Adjust.getAdid { adid ->
    if (adid == null) return@getAdid

    Adapty.setIntegrationIdentifier("adjust_device_id", adid) { error ->
        if (error != null) {
            // handle the error
        }
    }
}

Adjust.getAttribution { attribution ->
    if (attribution == null) return@getAttribution

    Adapty.updateAttribution(attribution, "adjust") { error ->
        // handle the error
    }
}
```

</TabItem>
<TabItem value="java" label="Android (Java)" default>

```java showLineNumbers
Adjust.getAdid(adid -> {
    if (adid == null) return;

    Adapty.setIntegrationIdentifier("adjust_device_id", adid, error -> {
        if (error != null) {
            // handle the error
        }
    });
});

Adjust.getAttribution(attribution -> {
    if (attribution == null) return;

    Adapty.updateAttribution(attribution, "adjust", error -> {
        // handle the error
    });
});
```

</TabItem>
<TabItem value="rn" label="React Native (TS)" default>

```typescript showLineNumbers

var adjustConfig = new AdjustConfig(appToken, environment);

// Before submiting Adjust config...
adjustConfig.setAttributionCallbackListener(attribution => {
  // Make sure Adapty SDK is activated at this point
  // You may want to lock this thread awaiting of `activate`
  adapty.updateAttribution(attribution, "adjust");
});

// ...
Adjust.create(adjustConfig);

Adjust.getAdid((adid) => {
  if (adid)
    adapty.setIntegrationIdentifier("adjust_device_id", adid);
});
```

</TabItem>

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

```javascript showLineNumbers

try {
  final adid = await Adjust.getAdid();

  if (adid == null) {
    // handle the error
  }
  
  await Adapty().setIntegrationIdentifier(
    key: "adjust_device_id", 
    value: adid,
  );
    
  final attributionData = await Adjust.getAttribution();

  var attribution = Map<String, String>();

  if (attributionData.trackerToken != null) attribution['trackerToken'] = attributionData.trackerToken!;
  if (attributionData.trackerName != null) attribution['trackerName'] = attributionData.trackerName!;
  if (attributionData.network != null) attribution['network'] = attributionData.network!;
  if (attributionData.adgroup != null) attribution['adgroup'] = attributionData.adgroup!;
  if (attributionData.creative != null) attribution['creative'] = attributionData.creative!;
  if (attributionData.clickLabel != null) attribution['clickLabel'] = attributionData.clickLabel!;
  if (attributionData.costType != null) attribution['costType'] = attributionData.costType!;
  if (attributionData.costAmount != null) attribution['costAmount'] = attributionData.costAmount!.toString();
  if (attributionData.costCurrency != null) attribution['costCurrency'] = attributionData.costCurrency!;
  if (attributionData.fbInstallReferrer != null) attribution['fbInstallReferrer'] = attributionData.fbInstallReferrer!;

  await Adapty().updateAttribution(attribution, source: "adjust");
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
  // handle the error
}
```

</TabItem>

<TabItem value="unity" label="Unity" default>

```csharp showLineNumbers
// 1. To update ADID
Adjust.GetAdid((adid) => {
    if (adid == null) {
        // handle the error
        return;
    }

    Adapty.SetIntegrationIdentifier("adjust_device_id", adid, (error) => {
        if (error != null) {
            // handle the error
            return;
        }

    });
});

// 2. To update Attribution

// in your adjust configuration scope:
adjustConfig.AttributionChangedDelegate = AttributionChangedCallback;

public void AttributionChangedCallback(AdjustAttribution attributionData) {
    var attribution = new Dictionary<string, string>();

    if (attributionData.TrackerToken != null) attribution["trackerToken"] = attributionData.TrackerToken;
    if (attributionData.TrackerName != null) attribution["trackerName"] = attributionData.TrackerName;
    if (attributionData.Network != null) attribution["network"] = attributionData.Network;
    if (attributionData.Adgroup != null) attribution["adgroup"] = attributionData.Adgroup;
    if (attributionData.Creative != null) attribution["creative"] = attributionData.Creative;
    if (attributionData.ClickLabel != null) attribution["clickLabel"] = attributionData.ClickLabel;
    if (attributionData.CostType != null) attribution["costType"] = attributionData.CostType;
    if (attributionData.CostAmount != null) attribution["costAmount"] = attributionData.CostAmount.ToString();
    if (attributionData.CostCurrency != null) attribution["costCurrency"] = attributionData.CostCurrency;
    if (attributionData.FbInstallReferrer != null) attribution["fbInstallReferrer"] = attributionData.FbInstallReferrer;

    // you will probably need to install Newtonsoft.Json package, if not yet
    var attributionJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(attribution);

    Adapty.UpdateAttribution(attributionJsonString, "adjust", (error) => {
        if (error != null) {
            // handle the error
        }
    });
}
```

</TabItem>

</Tabs>

## Estructura del evento \{#event-structure\}

Adapty envía los eventos seleccionados a Adjust según la configuración de la sección **Events names** en la [**página de integración de Adjust**](https://app.adapty.io/integrations/adjust). Cada evento tiene la siguiente estructura:

```json
{
   "event_token": "EVENT_TOKEN_FROM_CONFIG",
   "app_token": "APP_TOKEN_FROM_CONFIG",
   "s2s": 1,
   "environment": "production",
   "created_at_unix": 1709294400,
   "currency": "USD",
   "revenue": 9.99,
   "customer_user_id": "user_12345",
   "external_device_id": "user_12345",
   "ip_address": "192.168.100.1",
   "user_agent": "Mozilla/5.0 (Linux; Android 14; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
   "android_id": "875646c2-4a56-4211-8931-168532479006",
   "gps_adid": "875646c2-4a56-4211-8931-168532479006",
   "callback_params": "{\"integration_event_id\":\"550e8400-e29b-41d4-a716-446655440000\",\"customer_user_id\":\"user_12345\",\"vendor_product_id\":\"com.example.app.yearly.premium\",\"transaction_id\":\"GPA.3312-4512-1100-55923\",\"original_transaction_id\":\"GPA.3312-4512-1100-55923\",\"store\":\"play_store\",\"store_country\":\"US\",\"price_usd\":9.99,\"proceeds_usd\":8.49,\"price_local\":9.99,\"proceeds_local\":8.49,\"net_revenue_usd\":8.49,\"net_revenue_local\":8.49,\"tax_amount_usd\":0.0,\"tax_amount_local\":0.0,\"consecutive_payments\":3,\"rate_after_first_year\":false}",
   "partner_params": "{\"integration_event_id\":\"550e8400-e29b-41d4-a716-446655440000\",\"customer_user_id\":\"user_12345\",\"vendor_product_id\":\"com.example.app.yearly.premium\",\"transaction_id\":\"GPA.3312-4512-1100-55923\",\"original_transaction_id\":\"GPA.3312-4512-1100-55923\",\"store\":\"play_store\",\"store_country\":\"US\",\"price_usd\":9.99,\"proceeds_usd\":8.49,\"price_local\":9.99,\"proceeds_local\":8.49,\"net_revenue_usd\":8.49,\"net_revenue_local\":8.49,\"tax_amount_usd\":0.0,\"tax_amount_local\":0.0,\"consecutive_payments\":3,\"rate_after_first_year\":false}"
}
```

Donde:

| Parámetro            | Tipo    | Descripción                                                                                                                                  |
|:---------------------|:--------|:---------------------------------------------------------------------------------------------------------------------------------------------|
| `app_token`          | String  | El App Token de Adjust de tu configuración de integración.                                                                                   |
| `event_token`        | String  | El Event Token de Adjust asociado al evento específico de Adapty.                                                                            |
| `s2s`                | Integer | Indicador de evento servidor a servidor.                                                                                                     |
| `environment`        | String  | `sandbox` o `production`.                                                                                                                    |
| `created_at_unix`    | Integer | Marca de tiempo del evento en segundos.                                                                                                      |
| `currency`           | String  | Código de moneda (p. ej., "USD") de la transacción. Se incluye solo cuando los ingresos superan 0,001, ya que Adjust requiere que tanto los ingresos como la moneda se envíen juntos. |
| `revenue`            | Float   | Importe de ingresos de la transacción. Solo se incluye cuando el valor supera 0,001. Ten en cuenta que los eventos de reembolso se envían sin propiedades de ingresos, ya que Adjust no admite valores de ingresos negativos. |
| `customer_user_id`   | String  | El Customer User ID del usuario.                                                                                                             |
| `external_device_id` | String  | Igual que `customer_user_id`.                                                                                                                |
| `ip_address`         | String  | Dirección IP del usuario (solo IPv4).                                                                                                        |
| `user_agent`         | String  | Cadena User Agent del dispositivo.                                                                                                           |
| `adid`               | String  | ID de dispositivo de Adjust (si se conoce).                                                                                                  |
| `android_id`         | String  | **Solo Android**. Google Advertising ID.                                                                                                     |
| `gps_adid`           | String  | **Solo Android**. Google Advertising ID.                                                                                                     |
| `idfa`               | String  | **Solo iOS**. ID para anunciantes.                                                                                                           |
| `idfv`               | String  | **Solo iOS**. ID para proveedores.                                                                                                           |
| `callback_params`    | String  | Cadena JSON con todos los [campos del evento](webhook-event-types-and-fields#for-most-event-types) disponibles. Solo se incluyen los campos con valor no nulo. |
| `partner_params`     | String  | Igual que `callback_params`.                                                                                                                 |

## Resolución de problemas \{#troubleshooting\}

### Discrepancia en los ingresos \{#revenue-discrepancy\}

Si hay una discrepancia en los ingresos entre Adapty y Adjust, es posible que no todos tus usuarios estén usando la versión de la app que incluye el SDK de Adapty. Para garantizar la consistencia de los datos, puedes obligar a tus usuarios a actualizar a una versión de la app que incluya el SDK de Adapty.