> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# RevenueCat

> 从 RevenueCat 同步应用内购买和订阅数据到 OneSignal 以实现个性化消息传递。

## 概述

RevenueCat 帮助您跟踪跨平台的应用内购买和订阅生命周期。通过 OneSignal，您可以使用这些数据根据用户的订阅状态发送个性化消息。

此集成会自动使用用户的最新订阅信息更新 OneSignal 中的用户标签。

### 主要优势

通过 RevenueCat-OneSignal 集成，您可以：

* 向免费试用或刚刚订阅的用户发送入门消息。
* 通过调查或折扣重新吸引流失的用户。
* 为购买、计费问题或续费发送事务消息。

通过在 OneSignal 中提供准确的订阅数据，您的活动将更加智能和有效。

***

## 要求

* [RevenueCat 账户](https://www.revenuecat.com/docs/welcome/overview)
  * RevenueCat [*Purchases SDK*](https://www.revenuecat.com/docs/getting-started/quickstart)
  * 了解 [RevenueCat-OneSignal 集成](https://www.revenuecat.com/docs/integrations/third-party-integrations/onesignal)
* 已集成 [SDK](./developers) 的 OneSignal 账户
  * 了解[数据标签](./add-user-data-tags)、[用户](./users)和 OneSignal [订阅](./subscriptions)

***

## 设置

### 将 OneSignal 连接到 RevenueCat

1. 在您的 RevenueCat 仪表板中，导航至您的项目设置并从集成菜单中选择“OneSignal”。
2. 添加您的 OneSignal 应用 ID 和 OneSignal API 密钥。更多信息请参阅[密钥和 ID](./keys-and-ids)。
3. 输入 RevenueCat 应使用的标签名称，或选择默认标签名称。

### 将 OneSignal ID 传递给 RevenueCat

RevenueCat 使用 OneSignal 用户 ID（OneSignal ID）根据用户的 RevenueCat 用户详细信息在 OneSignal 中更新用户标签。

<Warning>
  在 OneSignal 中设置外部 ID 对于稳定的标识符是必需的。如果在会话中途更改，OneSignal ID 也可能会发生变化，从而中断 RevenueCat 连接。
</Warning>

要将 OneSignal ID 传递给 RevenueCat，您应该：

<Steps>
  <Step title="在 OneSignal 中设置外部 ID">
    在 OneSignal 中将外部 ID 设置为您的主要用户 ID。这可以通过 SDK `login` 方法完成。

    * [Mobile SDK `login` method](./mobile-sdk-reference#login-external-id)
    * [Web SDK `login` method](./web-sdk-reference#login-external-id)
  </Step>

  <Step title="获取 OneSignal ID">
    我们推荐使用用户状态观察者方法来获取 OneSignal ID，但我们也提供 getter 方法：

    * User state observers:
      * [Mobile SDK `addObserver` user state](./mobile-sdk-reference#addobserver-user-state)
      * [Web SDK `addObserver` user state](./web-sdk-reference#addeventlistener-user-state)
    * Getter methods:
      * [Mobile SDK `getOneSignalId` method](./mobile-sdk-reference#getonesignalid)
      * [Web SDK `OneSignalId` property](./web-sdk-reference#onesignal-user-onesignalid)
  </Step>

  <Step title="将 OneSignal ID 传递给 RevenueCat">
    将 OneSignal ID 传递给 RevenueCat。

    * RevenueCat 属性：`$onesignalUserId`
    * RevenueCat 帮助方法：`setOneSignalUserID()`（推荐）
  </Step>
</Steps>

### 将 RevenueCat 事件发送到 OneSignal

将 OneSignal ID 映射到 RevenueCat 的用户将自动更新其标签。

#### Testing the integration

<Steps>
  <Step title="进行沙箱购买">
    模拟新用户安装您的应用程序，并通过您的应用流程完成沙箱购买。

    <Warning>
      确保在 RevenueCat 中设置了 OneSignal ID。
    </Warning>
  </Step>

  <Step title="检查是否收集了所需的设备数据">
    在 RevenueCat 中，导航至刚刚进行购买的测试用户的客户视图。确保所有必需的数据都作为用户属性列出。
  </Step>

  <Step title="检查 OneSignal 事件是否成功传递">
    仍在客户视图中时，点击客户历史中的测试购买事件，并确保 OneSignal 集成事件存在并已成功投递。
  </Step>

  <Step title="检查 OneSignal 标签是否已更新">
    在 OneSignal 中，导航至 **Audience > Users** 并搜索 OneSignal ID。您应该能看到由 RevenueCat 更新的标签。
  </Step>
</Steps>

<Check>
  集成完成！您现在应该能看到 OneSignal 中的标签会随着用户进行购买或更新其订阅状态而自动更新。
</Check>

***

## RevenueCat 事件标签

对于 RevenueCat 中的每个自动续订订阅事件，以下标签将在 OneSignal 中的用户上添加或更新。通过在 RevenueCat 仪表板中留空标签，您可以选择不为特定标签发送任何值。

| 标签                           | 描述                                                                                                              |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `app_user_id`                | 触发事件的 RevenueCat 应用用户 ID                                                                                        |
| `period_type`                | 购买或续订的最新期间类型。可以是：`TRIAL`（免费试用）、`INTRO`（介绍定价）、`NORMAL`（标准订阅）                                                     |
| `purchased_at`               | 最新订阅购买或续订的纪元时间（以秒为单位）                                                                                           |
| `expiration_at`              | 最新订阅到期日期的纪元时间（以秒为单位）                                                                                            |
| `store`                      | `APP_STORE`、`PLAY_STORE` 或 `STRIPE` 之一                                                                          |
| `environment`                | `SANDBOX` 或 `PRODUCTION` 之一                                                                                     |
| `last_event_type`            | 来自用户的最新事件类型。可以是：`INITIAL_PURCHASE`、`TRIAL_STARTED`、`TRIAL_CONVERTED`、`TRIAL_CANCELLED`、`RENEWAL`、`CANCELLATION` |
| `product_id`                 | 用户已购买或续订的最新订阅产品标识符                                                                                              |
| `entitlement_ids`            | 用户解锁的 RevenueCat 权限标识符的逗号分隔字符串                                                                                  |
| `active_subscription`        | 在任何购买/续订事件上，此值将设置为 `true`，在 `EXPIRATION` 上设置为 `false`                                                           |
| `subscription_status`        | 请参阅下面的订阅状态属性                                                                                                    |
| `grace_period_expiration_at` | 如果发生计费问题，我们将发送宽限期到期日期。                                                                                          |

<Note>
  * 仅限自动续订订阅
  * RevenueCat 仅响应自动续订订阅事件在 OneSignal 中更新数据标签。
</Note>

### RevenueCat 事件示例

提供的 JSON 示例显示了基于 [RevenueCat 事件](https://www.revenuecat.com/docs/integrations/third-party-integrations/onesignal#events)发送到 OneSignal 的标签。

事件保存为 `last_event_type` 标签。

<Tabs>
  <Tab title="initial_purchase">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "NORMAL",
            "purchased_at": 1600016247,
            "expiration_at": 1602608247,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "initial_purchase",
            "last_event_at": 1600016250,
            "product_id": "monthly_sub",
            "entitlement_ids": "Pro"
        }
    }
    ```
  </Tab>

  <Tab title="trial_started">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "TRIAL",
            "purchased_at": 1600031584,
            "expiration_at": 1600290784,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "trial_started",
            "last_event_at": 1600031586,
            "product_id": "three_month_sub_trial",
            "entitlement_ids": "Pro"
        }
    }
    ```
  </Tab>

  <Tab title="trial_converted">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "NORMAL",
            "purchased_at": 1602136340,
            "expiration_at": 1602741140,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "trial_converted",
            "last_event_at": 1602114850,
            "product_id": "weekly_sub_trial",
            "entitlement_ids": null
        }
    }
    ```
  </Tab>

  <Tab title="trial_cancelled">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "TRIAL",
            "purchased_at": 1602051920,
            "expiration_at": 1602311120,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "trial_cancelled",
            "last_event_at": 1602129368,
            "product_id": "weekly_sub_trial",
            "entitlement_ids": null
        }
    }
    ```
  </Tab>

  <Tab title="renewal">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "NORMAL",
            "purchased_at": 1602125078,
            "expiration_at": 1604807078,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "renewal",
            "last_event_at": 1602122793,
            "product_id": "monthly_sub",
            "entitlement_ids": "Pro"
        }
    }
    ```
  </Tab>

  <Tab title="cancellation">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "NORMAL",
            "purchased_at": 1602086660,
            "expiration_at": 1602691460,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "cancellation",
            "last_event_at": 1602118600,
            "product_id": "weekly_sub",
            "entitlement_ids": null
        }
    }
    ```
  </Tab>

  <Tab title="uncancellation">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "TRIAL",
            "purchased_at": 1663445025,
            "expiration_at": 1664049825,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "uncancellation",
            "last_event_at": 1663969096,
            "product_id": "annual_sub",
            "entitlement_ids": "Premium"
        }
    }
    ```
  </Tab>

  <Tab title="non_subscription_purchase">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "purchased_at": 1602086660,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "non_renewing_purchase",
            "last_event_at": 1602118600,
            "product_id": "one_time_purchase_product",
            "entitlement_ids": null
        }
    }
    ```
  </Tab>

  <Tab title="subscription_paused">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "NORMAL",
            "purchased_at": 1602086660,
            "expiration_at": 1602691460,
            "store": "PLAY_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "subscription_paused",
            "last_event_at": 1602118600,
            "product_id": "weekly_sub",
            "auto_resume_at": 1602119600,
            "entitlement_ids": null
        }
    }
    ```
  </Tab>

  <Tab title="expiration">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "period_type": "NORMAL",
            "purchased_at": 1652374230,
            "expiration_at": 1652979030,
            "last_event_type": "expiration",
            "last_event_at": 1652988735
        }
    }
    ```
  </Tab>

  <Tab title="billing_issue">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "TRIAL",
            "purchased_at": 1652383957,
            "expiration_at": 1654371157,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "billing_issue",
            "last_event_at": 1652988776,
            "product_id": "annual_sub",
            "entitlement_ids": "Premium"
        }
    }
    ```
  </Tab>

  <Tab title="product_change">
    ```json theme={null}
    {
        "app_id": "12345678-1234-1234-1234-123456789012",
        "tags": {
            "app_user_id": "$RCAnonymousID:87c6049c58069238dce29853916d624c",
            "period_type": "NORMAL",
            "purchased_at": 1602086660,
            "expiration_at": 1602691460,
            "store": "APP_STORE",
            "environment": "PRODUCTION",
            "last_event_type": "product_change",
            "last_event_at": 1602118600,
            "product_id": "weekly_sub",
            "new_product_id": "monthly_sub",
            "entitlement_ids": null
        }
    }
    ```
  </Tab>
</Tabs>

### `subscription_status` tag

每当 RevenueCat 向 OneSignal 发送事件时，`subscription_status` 标签会使用以下值之一添加或更新任何适用的更改：

| 状态                   | 描述                                     |
| :------------------- | :------------------------------------- |
| active               | 客户拥有活跃的付费订阅，该订阅将在下一个续订日期续订。            |
| intro                | 客户通过付费介绍优惠拥有活跃的付费订阅。                   |
| cancelled            | 客户拥有付费订阅，该订阅将在下一个续订日期到期。               |
| grace\_period        | 客户拥有付费订阅，该订阅在续订失败后进入了宽限期。              |
| trial                | 客户处于试用期，试用期结束时将转为付费。                   |
| cancelled\_trial     | 客户处于试用期，试用期结束时将到期。                     |
| grace\_period\_trial | 客户原本处于试用期，现在在续订失败后进入了宽限期。              |
| expired              | 客户的订阅已到期。                              |
| promotional          | 客户通过 RevenueCat 拥有某项权限的访问权             |
| expired\_promotional | 客户之前通过 RevenueCat 授予权限拥有某项权限的访问权，现已到期。 |
| paused               | 客户拥有已暂停的付费订阅，订阅将在未来某个日期恢复。             |

对于拥有多个活跃订阅的客户，此属性将仅表示发生最近事件的订阅状态。

***

## 常见问题

### 如何知道集成是否正常工作？

在 OneSignal 中，导航至 **Audience > Users** 并搜索 OneSignal ID。您应该能看到由 RevenueCat 更新的标签。

您还可以转到 **Audience > Segments** 并创建一个细分，用于筛选您通过 RevenueCat 设置的标签。

### 我可以设置多少个标签？

OneSignal 中可以设置的标签数量没有限制，但对于每个用户在特定时间可以拥有的标签数量有限制。

更多信息请参阅我们的[价格页面](https://onesignal.com/pricing)。

***
