> ## 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 계정
  * [Tags](./add-user-data-tags), [Users](./users) 및 OneSignal [Subscriptions](./subscriptions) 이해

***

## 설정

### OneSignal을 RevenueCat에 연결

1. RevenueCat 대시보드에서 프로젝트 설정으로 이동하고 Integrations 메뉴에서 'OneSignal'을 선택합니다.
2. OneSignal 앱 ID와 OneSignal API 키를 추가합니다. 자세한 내용은 [Keys and IDs](./keys-and-ids)를 참조하세요.
3. RevenueCat이 사용해야 하는 태그 이름을 입력하거나 기본 태그 이름을 선택합니다.

### RevenueCat에 OneSignal ID 전달

RevenueCat은 OneSignal 사용자 ID(OneSignal ID)를 사용하여 RevenueCat 사용자 세부 정보를 기반으로 OneSignal의 사용자 태그를 업데이트합니다.

<Warning>
  안정적인 식별자를 위해 OneSignal에서 External ID를 설정해야 합니다. 세션 중에 변경되면 OneSignal ID도 변경되어 RevenueCat 연결이 끊어질 수 있습니다.
</Warning>

OneSignal ID를 RevenueCat에 전달하려면 다음을 수행해야 합니다:

<Steps>
  <Step title="OneSignal에서 External ID 설정">
    OneSignal에서 External ID를 메인 사용자 ID로 설정합니다. SDK `login` 메서드를 사용하여 수행할 수 있습니다.

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

  <Step title="OneSignal ID 가져오기">
    OneSignal ID를 가져오려면 사용자 상태 옵저버 메서드를 사용하는 것이 좋지만 getter 메서드도 제공합니다:

    * 사용자 상태 옵저버:
      * [Mobile SDK `addObserver` 사용자 상태](./mobile-sdk-reference#addobserver-user-state)
      * [Web SDK `addObserver` 사용자 상태](./web-sdk-reference#addeventlistener-user-state)
    * Getter 메서드:
      * [Mobile SDK `getOneSignalId` 메서드](./mobile-sdk-reference#getonesignalid)
      * [Web SDK `OneSignalId` 속성](./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에 매핑된 사용자는 태그가 자동으로 업데이트됩니다.

#### 통합 테스트

<Steps>
  <Step title="샌드박스 구매 수행">
    앱을 설치하는 새 사용자를 시뮬레이션하고 앱 플로우를 거쳐 샌드박스 구매를 완료합니다.

    <Warning>
      OneSignal ID가 RevenueCat에 설정되어 있는지 확인하세요.
    </Warning>
  </Step>

  <Step title="필수 장치 데이터가 수집되었는지 확인">
    RevenueCat에서 방금 구매한 테스트 사용자의 Customer View로 이동합니다. 모든 필수 데이터가 사용자의 속성으로 나열되어 있는지 확인하세요.
  </Step>

  <Step title="OneSignal 이벤트가 성공적으로 전달되었는지 확인">
    Customer View에 있는 동안 Customer History에서 테스트 구매 이벤트를 클릭하고 OneSignal 통합 이벤트가 존재하고 성공적으로 전달되었는지 확인하세요.
  </Step>

  <Step title="OneSignal 태그가 업데이트되었는지 확인">
    OneSignal에서 **Audience > Users**로 이동하고 OneSignal ID를 검색합니다. RevenueCat에 의해 업데이트된 태그를 볼 수 있어야 합니다.
  </Step>
</Steps>

<Check>
  통합이 완료되었습니다! 이제 사용자가 구매하거나 구독 상태를 업데이트할 때 OneSignal의 태그가 자동으로 업데이트됩니다.
</Check>

***

## RevenueCat 이벤트 태그

RevenueCat의 모든 자동 갱신 구독 이벤트에 대해 다음 태그가 OneSignal의 사용자에 추가되거나 업데이트됩니다. RevenueCat 대시보드에서 태그를 비워두면 특정 태그에 대한 값을 보내지 않도록 선택할 수 있습니다.

| Tag                          | 설명                                                                                                                            |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `app_user_id`                | 이벤트를 트리거한 RevenueCat 앱 사용자 ID                                                                                                 |
| `period_type`                | 구매 또는 갱신의 최신 기간 유형. 다음 중 하나: `TRIAL` (무료 평가판), `INTRO` (소개 가격), `NORMAL` (표준 구독)                                              |
| `purchased_at`               | 최신 구독 구매 또는 갱신의 Epoch 시간(초)                                                                                                   |
| `expiration_at`              | 최신 구독 만료 날짜의 Epoch 시간(초)                                                                                                      |
| `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 Entitlement 식별자의 쉼표로 구분된 문자열                                                                           |
| `active_subscription`        | 값은 모든 구매/갱신 이벤트에서 `true`로, `EXPIRATION`에서 `false`로 설정됩니다.                                                                     |
| `subscription_status`        | 아래 구독 상태 속성 참조                                                                                                                |
| `grace_period_expiration_at` | 청구 문제가 발생하면 유예 기간 만료 날짜를 보냅니다.                                                                                                |

<Note>
  * 자동 갱신 구독만 해당
  * RevenueCat은 자동 갱신 구독 이벤트에 대한 응답으로만 OneSignal의 데이터 태그를 업데이트합니다.
</Note>

### RevenueCat 이벤트 예시

제공된 JSON 예시는 [RevenueCat Events](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` 태그

RevenueCat이 OneSignal에 이벤트를 보낼 때마다 `subscription_status` 태그가 적용 가능한 변경 사항과 함께 다음 값 중 하나를 사용하여 추가되거나 업데이트됩니다:

| Status               | 설명                                                          |
| :------------------- | :---------------------------------------------------------- |
| active               | 고객은 다음 갱신 날짜에 갱신하도록 설정된 활성 유료 구독을 보유하고 있습니다.                |
| intro                | 고객은 유료 소개 제안을 통해 활성 유료 구독을 보유하고 있습니다.                       |
| cancelled            | 고객은 다음 갱신 날짜에 만료되도록 설정된 유료 구독을 보유하고 있습니다.                   |
| grace\_period        | 고객은 갱신에 실패한 후 유예 기간에 들어간 유료 구독을 보유하고 있습니다.                  |
| trial                | 고객은 평가 기간 종료 시 유료로 전환하도록 설정된 평가 기간에 있습니다.                   |
| cancelled\_trial     | 고객은 평가 기간 종료 시 만료되도록 설정된 평가 기간에 있습니다.                       |
| grace\_period\_trial | 고객은 평가 기간에 있었으며 갱신에 실패한 후 유예 기간에 들어갔습니다.                    |
| expired              | 고객의 구독이 만료되었습니다.                                            |
| promotional          | 고객은 RevenueCat을 통해 자격에 액세스할 수 있습니다.                         |
| expired\_promotional | 고객은 이전에 만료된 RevenueCat Granted Entitlement를 통해 자격에 액세스했습니다. |
| paused               | 고객은 일시 중지된 유료 구독을 보유하고 있으며 향후 날짜에 재개되도록 설정되어 있습니다.          |

여러 활성 구독이 있는 고객의 경우 이 속성은 가장 최근 이벤트가 발생한 구독의 상태만 나타냅니다.

***

## FAQ

### 통합이 작동하는지 어떻게 알 수 있나요?

OneSignal에서 **Audience > Users**로 이동하고 OneSignal ID를 검색합니다. RevenueCat에 의해 업데이트된 태그를 볼 수 있어야 합니다.

**Audience > Segments**로 이동하여 RevenueCat을 통해 설정한 태그를 필터링하는 세그먼트를 만들 수도 있습니다.

### 몇 개의 태그를 설정할 수 있나요?

OneSignal에서 설정할 수 있는 태그 수에는 제한이 없지만 각 사용자가 특정 시점에 보유할 수 있는 태그 수에는 제한이 있습니다.

자세한 내용은 [가격 페이지](https://onesignal.com/pricing)를 참조하세요.

***
