---
title: "Tenjin integration"
description: ""
---

Tenjin là nền tảng attribution và phân tích dành cho nhà phát triển ứng dụng và marketer. Nền tảng này cung cấp các công cụ để đo lường và tối ưu hóa chiến dịch thu hút người dùng thông qua các thông tin chi tiết về hiệu suất ứng dụng và hành vi người dùng. Với cách tiếp cận minh bạch và linh hoạt, Tenjin tổng hợp dữ liệu từ các mạng quảng cáo và cửa hàng ứng dụng, giúp các nhóm phân tích ROI, theo dõi chuyển đổi và giám sát các chỉ số hiệu suất quan trọng.

Bằng cách chuyển tiếp [các sự kiện gói đăng ký](events) tới Tenjin, bạn có thể thấy chính xác nguồn gốc của từng chuyển đổi và chiến dịch nào mang lại giá trị cao nhất trên tất cả các kênh, nền tảng và thiết bị. Về cơ bản, dashboard Tenjin cung cấp phân tích nâng cao cho các chiến dịch marketing.

Bằng cách chuyển tiếp attribution từ Tenjin sang Adapty, bạn làm giàu thêm dữ liệu phân tích của Adapty với các tiêu chí lọc bổ sung để sử dụng trong phân tích cohort và chuyển đổi.

Tích hợp này hoạt động theo hai hướng chính:

1. **Nhận dữ liệu attribution từ Tenjin**
   Sau khi tích hợp, Adapty thu thập dữ liệu attribution từ Tenjin. Bạn có thể xem thông tin này trên trang hồ sơ người dùng trong Adapty Dashboard.
2. **Gửi sự kiện gói đăng ký đến Tenjin**
   Adapty gửi các sự kiện mua hàng đến Tenjin theo thời gian thực. Các sự kiện này giúp đánh giá hiệu quả của các chiến dịch quảng cáo trực tiếp trong dashboard của Tenjin.

| Đặc điểm tích hợp | Mô tả                                                        |
| ------------------ | ------------------------------------------------------------ |
| Lịch trình         | Thời gian thực                                               |
| Chiều truyền dữ liệu | <p>Truyền hai chiều:</p><ul><li> **Sự kiện Adapty**: Từ máy chủ Adapty đến máy chủ Tenjin</li><li> **Attribution Tenjin**: Từ SDK Tenjin đến máy chủ Adapty</li></ul> |
| Điểm tích hợp Adapty | <ul><li> SDK Tenjin và Adapty trong mã nguồn ứng dụng di động</li><li> Máy chủ Adapty</li></ul> |

## Thiết lập tích hợp \{#set-up-integration\}

### Kết nối Adapty với Tenjin \{#connect-adapty-to-tenjin\}

1. Mở trang [**Integrations** -> **Tenjin**](https://app.adapty.io/integrations/tenjin) trong Adapty Dashboard.

2. Bật toggle để kích hoạt tích hợp.

   
     <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. Đăng nhập vào [Tenjin Dashboard](https://tenjin.com/).

4. Vào **Configuration** -> **Apps** trong menu điều hướng.

   
     <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. Chọn ứng dụng cho nền tảng của bạn (iOS hoặc Android) và chuyển đến tab **App and SDK**.

6. Trong tab **App and SDK**, nhấn **Copy** ở cột **SDK Key**. Nếu bạn chưa có SDK key, nhấn nút **Generate SDK Key** để tạo một cái.

   
     <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. Quay lại Adapty Dashboard và dán SDK Key vừa sao chép vào trường tương ứng:
   - Với ứng dụng iOS: dán vào trường **iOS SDK Key** hoặc **iOS Sandbox SDK Key**
   - Với ứng dụng Android: dán vào trường **Android SDK Key** hoặc **Android Sandbox SDK Key**

   :::info

   Tenjin không có chế độ Sandbox riêng cho tích hợp server-to-server. Hãy dùng một ứng dụng Tenjin riêng biệt hoặc dùng cùng một key cho cả sự kiện production lẫn 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. Nếu bạn có ứng dụng trên cả hai nền tảng, lặp lại bước 5-7 cho nền tảng còn lại.

9. (Tùy chọn) Điều chỉnh phần **How the revenue data should be sent** nếu cần. Để biết giải thích chi tiết về các cài đặt, tham khảo [Integration settings](configuration#integration-settings).

10. Nhấn **Save** để hoàn tất thiết lập.

Adapty sẽ bắt đầu gửi sự kiện mua hàng đến Tenjin và nhận dữ liệu attribution. Bạn có thể điều chỉnh việc chia sẻ sự kiện trong phần **Events names**.

### Cấu hình sự kiện và tag \{#configure-events-and-tags\}

Tenjin chỉ chấp nhận các sự kiện mua hàng và **Trial started**. Trong phần **Events names**, chọn những sự kiện cần chia sẻ với Tenjin để phù hợp với mục tiêu theo dõi của bạn.

  <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 */
  }}
/>

### Kết nối ứng dụng với Tenjin \{#connect-your-app-to-tenjin\}

Dùng phương thức SDK `Adapty.updateAttribution()` để lấy dữ liệu attribution từ Tenjin và truyền nó sang 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 {
        // Adapty SDK 4.x
        try await Adapty.setIntegrationIdentifier(.tenjinAnalyticsInstallationId(tenjinId))
        // Adapty SDK 3.x
        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 {
                // Adapty SDK 4.x
                try await Adapty.updateAttribution(info, source: .tenjin)
                // Adapty SDK 3.x
                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>

## Cấu trúc sự kiện \{#event-structure\}

Adapty gửi các sự kiện đã chọn đến Tenjin theo cấu hình trong phần **Events names** trên [**trang Tenjin Integration**](https://app.adapty.io/integrations/tenjin). Mỗi sự kiện có cấu trúc như sau:

```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"
}
```

Trong đó:

| **Tham số**                   | **Kiểu dữ liệu** | **Mô tả**                                                    |
| ----------------------------- | ---------------- | ------------------------------------------------------------ |
| **price**                     | Float            | Đơn giá của sản phẩm được mua theo đơn vị tiền tệ chuẩn (ví dụ: USD được tính bằng đô la). |
| **locale**                    | String           | Ngôn ngữ/vùng của thiết bị. Với Android: `Locale.getDefault().toString()`. Với iOS: `[[NSLocale currentLocale] localeIdentifier]`. |
| **country**                   | String           | Mã quốc gia theo tiêu chuẩn ISO (ví dụ: US cho Hoa Kỳ). |
| **postcut**                   | String (Boolean) | Cho biết giao dịch mua có được gửi sau khi trừ phí nền tảng không. 1 là có, 0 là không. |
| **currency**                  | String           | Mã tiền tệ theo ISO (ví dụ: USD cho đô la Mỹ).              |
| **platform**                  | String           | Nền tảng của thiết bị (ví dụ: ios, android, windows, amazon). |
| **quantity**                  | Integer          | Số lượng đơn vị được mua.                                    |
| **bundle_id**                 | String           | Bundle identifier của ứng dụng (ví dụ: `com.example.app`).  |
| **ip_address**                | String (IPv4)    | Địa chỉ IP của người dùng. Dùng để tra cứu quốc gia.        |
| **os_version**                | String           | Phiên bản hệ điều hành của thiết bị. Với Android: `String.valueOf(Build.VERSION.SDK_INT)`. Với iOS: `[[UIDevice currentDevice] systemVersion]`. |
| **product_id**                | String           | Mã định danh duy nhất của sản phẩm được mua.                |
| **app_version**               | Float, Decimal   | Phiên bản ứng dụng. Với Android: `context.getPackageManager().getPackageInfo()`. Với iOS: `[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]`. |
| **sdk_version**               | String           | Phiên bản SDK đang sử dụng, luôn được đặt là `server`.      |
| **device_model**              | String           | Model của thiết bị. Với Android: `Build.MODEL`. Với iOS: `sysctl("hw.machine")`. |
| **advertising_id**            | UUID             | ID quảng cáo của thiết bị. Bắt buộc với Android. Với iOS, có thể để trống hoặc toàn số 0. |
| **os_version_release**        | String           | Phiên bản phát hành hệ điều hành. Với Android: `String.valueOf(Build.VERSION.RELEASE)`. Với iOS: `[[UIDevice currentDevice] systemVersion]`. |
| **developer_device_id**       | UUID             | Mã định danh nhà cung cấp (chỉ dành cho iOS).               |
| **analytics_installation_id** | UUID             | ID cài đặt analytics. Để biết thêm chi tiết, tham khảo tài liệu tại `https://docs.tenjin.com`. |