---
title: "Integración con Tenjin"
description: ""
---

Tenjin es una plataforma de atribución y analítica móvil para desarrolladores de apps y profesionales del marketing. Proporciona herramientas para medir y optimizar campañas de adquisición de usuarios, ofreciendo información detallada sobre el rendimiento de la app y el comportamiento de los usuarios. Con su enfoque transparente y flexible, Tenjin agrega datos de redes publicitarias y stores de apps, lo que permite a los equipos analizar el ROI, rastrear conversiones y monitorear métricas clave de rendimiento.

Al reenviar [eventos de suscripción](events) a Tenjin, puedes ver exactamente de dónde provienen las conversiones y qué campañas generan más valor en todos los canales, plataformas y dispositivos. En esencia, los dashboards de Tenjin ofrecen analítica avanzada para campañas de marketing.

Al reenviar la atribución de Tenjin a Adapty, enriqueces la analítica de Adapty con criterios de filtrado adicionales que puedes usar en el análisis de cohortes y conversiones.

Esta integración funciona de dos maneras principales:

1. **Recibir datos de atribución de Tenjin**
   Una vez integrado, Adapty recopila datos de atribución de Tenjin. Puedes acceder a esta información en la página del perfil del usuario en el Adapty Dashboard.
2. **Enviar eventos de suscripción a Tenjin**
   Adapty envía eventos de compra a Tenjin en tiempo real. Estos eventos ayudan a evaluar la efectividad de tus campañas publicitarias directamente en el dashboard de Tenjin.

| Característica de integración | Descripción                                                  |
| ----------------------------- | ------------------------------------------------------------ |
| Frecuencia                    | Tiempo real                                                  |
| Dirección de datos            | <p>Transmisión bidireccional:</p><ul><li> **Eventos de Adapty**: Del servidor de Adapty al servidor de Tenjin</li><li> **Atribución de Tenjin**: Del SDK de Tenjin al servidor de Adapty</li></ul> |
| Punto de integración de Adapty | <ul><li> SDKs de Tenjin y Adapty en el código de la app móvil</li><li> Servidor de Adapty</li></ul> |

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

### Conectar Adapty con Tenjin \{#connect-adapty-to-tenjin\}

1. Abre la página [**Integrations** -> **Tenjin**](https://app.adapty.io/integrations/tenjin) en el Adapty Dashboard.

2. Activa el interruptor para habilitar la integración.

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

3. Inicia sesión en el [Tenjin Dashboard](https://tenjin.com/).

4. Ve a **Configuration** -> **Apps** en el menú de navegación.

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

5. Selecciona la app para tu plataforma (iOS o Android) y navega a la pestaña **App and SDK**.

6. En la pestaña **App and SDK**, haz clic en **Copy** en la columna **SDK Key**. Si aún no tienes una SDK Key, haz clic en el botón **Generate SDK Key** para crear una.

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

7. Vuelve al Adapty Dashboard y pega la SDK Key copiada en el campo de la plataforma correspondiente:
   - Para apps iOS: pégala en el campo **iOS SDK Key** o **iOS Sandbox SDK Key**
   - Para apps Android: pégala en el campo **Android SDK Key** o **Android Sandbox SDK Key**

   :::info

   Tenjin no tiene un modo Sandbox específico para la integración server-to-server. Usa una app de Tenjin separada o la misma clave tanto para eventos de producción como de sandbox.
   :::

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

8. Si tienes apps en ambas plataformas, repite los pasos 5-7 para la otra plataforma.

9. (opcional) Ajusta la sección **How the revenue data should be sent** si es necesario. Para una explicación detallada de sus configuraciones, consulta la sección [Integration settings](configuration#integration-settings).

10. Haz clic en **Save** para finalizar la configuración.

Adapty comenzará a enviar eventos de compra a Tenjin y a recibir datos de atribución. Puedes ajustar el intercambio de eventos en la sección **Events names**.

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

Tenjin solo acepta eventos de compra y **Trial started**. En la sección **Events names**, selecciona qué eventos compartir con Tenjin según tus objetivos de seguimiento.

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

### Conectar tu app con Tenjin \{#connect-your-app-to-tenjin\}

Usa el método del SDK `Adapty.updateAttribution()` para obtener los datos de atribución de Tenjin y enviarlos a Adapty.

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

```swift showLineNumbers

func updateTenjinId() {
    guard let tenjinId = TenjinSDK.getAnalyticsInstallationId() else { return }

    do {
        try await Adapty.setIntegrationIdentifier(
            key: "tenjin_analytics_installation_id",
            value: tenjinId
        )
    } catch {
        // handle the error
    }
}

func updateTenjinAttribution() {
    let instance = TenjinSDK.getInstance("<YOUR_TENJIN_API_TOKEN>")
        
    instance?.getAttributionInfo { info, _ in
        guard let info else { return }

        Task {
            do {
                try await Adapty.updateAttribution(info, source: "tenjin")
            } catch {
                // handle the error
            }
        }
    }
}
```

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

```kotlin showLineNumbers
Adapty.setIntegrationIdentifier("tenjin_analytics_installation_id", tenjinSdk.analyticsInstallationId) { error ->
    if (error != null) {
        // handle the error
    }
}

tenjinSdk.getAttributionInfo { attribution ->
    if (attribution == null) return@getAttributionInfo

    Adapty.updateAttribution(attribution, "tenjin") { error ->
        if (error != null) {
            // handle the error
        }
    }
}
```

</TabItem>

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

```java showLineNumbers
Adapty.setIntegrationIdentifier("tenjin_analytics_installation_id", tenjinSdk.getAnalyticsInstallationId(), error -> {
    if (error != null) {
        // handle the error
    }
});

tenjinSdk.getAttributionInfo(attribution -> {
    if (attribution == null) return;

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

</TabItem>

<TabItem value="flutter" label="Flutter (Dart)" default>

```javascript showLineNumbers
try {
    final tenjinId = await TenjinSDK.instance.getAnalyticsInstallationId();
    
    if (tenjinId != null) {
        await Adapty().setIntegrationIdentifier(
            key: 'tenjin_analytics_installation_id', 
            value: tenjinId,
        );
    }

    final attribution = await TenjinSDK.instance.getAttributionInfo();
    if (attribution != null) {
        await Adapty().updateAttribution(attribution, source: 'tenjin');
    }
} catch (e) {
    // handle the error
}
```

</TabItem>
<TabItem value="unity" label="Unity (C#)" default>

```csharp showLineNumbers
using AdaptySDK;
using System.Linq;

BaseTenjin instance = Tenjin.getInstance("<SDK_KEY>");
var tenjinId = instance.GetAnalyticsInstallationId();

Adapty.SetIntegrationIdentifier(
    "tenjin_analytics_installation_id",
    tenjinId,
    (error) => {
        // handle the error
    });

instance.GetAttributionInfo((attribution) => {
    var dynamicAttribution = attribution.ToDictionary(
        kvp => kvp.Key,
        kvp => (dynamic)kvp.Value
    );
                
Adapty.UpdateAttribution(
    dynamicAttribution,
    "tenjin",
    (error) => {
        // handle the error
    });
});
```

</TabItem>

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

```typescript showLineNumbers

// ...
const posthog = usePostHog()

// ...
try {
  await adapty.setIntegrationIdentifier("tenjin_analytics_installation_id", await Tenjin.getAnalyticsInstallationId());
} catch (error) {
  // handle `AdaptyError`
}
```

</TabItem>
</Tabs>

## Estructura de los eventos \{#event-structure\}

Adapty envía los eventos seleccionados a Tenjin tal como se configuraron en la sección **Events names** de la [**página de integración con Tenjin**](https://app.adapty.io/integrations/tenjin). Cada evento tiene la siguiente estructura:

```json showLineNumbers title="Json"
{
  "price": 99.0,
  "locale": "en-US",
  "country": "ME",
  "postcut": "false",
  "currency": "USD",
  "platform": "ios",
  "quantity": 1,
  "bundle_id": "com.adapty.adaptydemoapp",
  "ip_address": "127.0.0.1",
  "os_version": "18.1.1",
  "product_id": "month.premium.99",
  "app_version": "3.2.0",
  "sdk_version": "server",
  "device_model": "iPhone 13 Mini",
  "advertising_id": "00000000-0000-0000-0000-000000000000",
  "os_version_release": "18.1.1",
  "developer_device_id": "00000000-0000-0000-0000-000000000000",
  "analytics_installation_id": "00000000-0000-0000-0000-000000000000"
}
```

Donde:

| **Parámetro**                 | **Tipo**         | **Descripción**                                              |
| ----------------------------- | ---------------- | ------------------------------------------------------------ |
| **price**                     | Float            | El precio unitario del artículo comprado en la unidad estándar de la moneda (por ejemplo, USD se reporta en dólares). |
| **locale**                    | String           | El locale del dispositivo. En Android: `Locale.getDefault().toString()`. En iOS: `[[NSLocale currentLocale] localeIdentifier]`. |
| **country**                   | String           | El código de país ISO del locale (por ejemplo, US para Estados Unidos). |
| **postcut**                   | String (Boolean) | Indica si la compra se envió después del recorte de la plataforma. 1 para verdadero, 0 para falso. |
| **currency**                  | String           | El código de moneda ISO (por ejemplo, USD para dólares estadounidenses). |
| **platform**                  | String           | La plataforma del dispositivo (por ejemplo, ios, android, windows, amazon). |
| **quantity**                  | Integer          | El número de unidades compradas.                             |
| **bundle_id**                 | String           | El identificador de bundle de la app (por ejemplo, `com.example.app`). |
| **ip_address**                | String (IPv4)    | La dirección IP del usuario. Se usa para determinar el país. |
| **os_version**                | String           | La versión del sistema operativo del dispositivo. En Android: `String.valueOf(Build.VERSION.SDK_INT)`. En iOS: `[[UIDevice currentDevice] systemVersion]`. |
| **product_id**                | String           | Identificador único del producto comprado.                   |
| **app_version**               | Float, Decimal   | La versión de la app. En Android: `context.getPackageManager().getPackageInfo()`. En iOS: `[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]`. |
| **sdk_version**               | String           | La versión del SDK en uso, siempre establecida en `server`.  |
| **device_model**              | String           | El modelo del dispositivo. En Android: `Build.MODEL`. En iOS: `sysctl("hw.machine")`. |
| **advertising_id**            | UUID             | El ID publicitario del dispositivo. Obligatorio en Android. En iOS puede estar vacío o ser todo ceros. |
| **os_version_release**        | String           | La versión de lanzamiento del sistema operativo. En Android: `String.valueOf(Build.VERSION.RELEASE)`. En iOS: `[[UIDevice currentDevice] systemVersion]`. |
| **developer_device_id**       | UUID             | El identificador del proveedor (solo iOS).                   |
| **analytics_installation_id** | UUID             | ID de instalación de analítica. Para más detalles, consulta la documentación en `https://docs.tenjin.com`. |