# Google Play 구독 추적

<Aside type="caution" icon="setting" title="개발자 지원 필요">
이 통합을 설정하려면 개발팀의 도움이 필요합니다. 이 가이드를 개발팀과 공유해 주세요.
</Aside>

## 통합 개요

[실시간 개발자 알림(RTDN)](https://developer.android.com/google/play/billing/rtdn-reference)은 구독 상태가 변경될 때마다 실시간 메시지를 보내는 Google Play의 서버 간 서비스입니다.

Google Play RTDN을 Pushwoosh에 연결하면 자체 백엔드 인프라를 구축하지 않고도 구매, 갱신, 취소, 결제 문제, 만료, 환불 등 전체 구독 수명 주기에 대응할 수 있습니다. 사용자의 Google Play 계정에서 구독 상태가 변경될 때마다 Google은 Pushwoosh에 알림을 보내고, Pushwoosh는 사용자 프로필에서 일치하는 [`PW_Subscription*`](#tracked-events) 이벤트를 발생시킵니다.

<Aside type="note">
이 통합은 **Android 구독**(Google Play RTDN)을 지원합니다. iOS 구독을 추적하려면 [App Store 구독 추적](/ko/product/integrations/app-store-subscription-tracking/)을 참조하세요.
</Aside>

### 통합 유형

**소스:** 실시간 개발자 알림은 Google Play에서 Pushwoosh로 전송됩니다.

### 추적된 이벤트

Pushwoosh는 지원되는 모든 Google Play 알림을 통합된 `PW_Subscription*` 이벤트 세트에 매핑하므로 구독 수명 주기의 모든 단계에서 캠페인을 트리거할 수 있습니다.

| 이벤트 | 발생 시점 |
| ----- | ---------- |
| `PW_SubscriptionStart` | 사용자가 처음으로 구독을 구매할 때. |
| `PW_SubscriptionRenew` | 새로운 청구 기간에 대해 구독이 자동 갱신될 때. |
| `PW_SubscriptionCancel` | 사용자가 자동 갱신을 해제할 때. 구독은 만료될 때까지 활성 상태로 유지됩니다. |
| `PW_SubscriptionResume` | 사용자가 구독이 만료되기 전에 다시 시작할 때. |
| `PW_SubscriptionBillingIssue` | 갱신 결제가 실패하고 구독이 유예 기간에 들어갈 때. |
| `PW_SubscriptionRecovered` | 이전에 실패한 갱신이 성공하고 구독이 다시 활성화될 때. |
| `PW_SubscriptionExpired` | 구독이 완전히 만료되어 더 이상 활성 상태가 아닐 때. |
| `PW_SubscriptionRefund` | Google Play가 구독을 취소할 때 (예: 환불 후). |

모든 이벤트는 동일한 속성을 가집니다:

- **productID:** 구독의 Google Play 제품 식별자입니다.
- **expiresAt:** 현재 유료 기간이 종료되는 시점을 초 단위의 Unix 타임스탬프로 나타냅니다. Google에서 제공하는 경우 포함됩니다.

<details>

<summary>이벤트가 실시간 개발자 알림에 매핑되는 방식</summary>

통합을 확인하는 개발자를 위해 각 Pushwoosh 이벤트는 다음 RTDN `notificationType` 값에 해당합니다:

| Pushwoosh 이벤트 | RTDN `notificationType` |
| --------------- | ----------------------- |
| `PW_SubscriptionStart` | `SUBSCRIPTION_PURCHASED` (4) |
| `PW_SubscriptionRenew` | `SUBSCRIPTION_RENEWED` (2) |
| `PW_SubscriptionCancel` | `SUBSCRIPTION_CANCELED` (3) |
| `PW_SubscriptionResume` | `SUBSCRIPTION_RESTARTED` (7) |
| `PW_SubscriptionBillingIssue` | `SUBSCRIPTION_IN_GRACE_PERIOD` (6) |
| `PW_SubscriptionRecovered` | `SUBSCRIPTION_RECOVERED` (1) |
| `PW_SubscriptionExpired` | `SUBSCRIPTION_EXPIRED` (13) |
| `PW_SubscriptionRefund` | `SUBSCRIPTION_REVOKED` (12) |

보류, 가격 변경, 연기, 일시 중지와 같은 다른 알림 유형은 확인되지만 이벤트를 게시하지는 않습니다.

</details>

### 작동 방식

Google Play 알림에는 Pushwoosh 식별자가 포함되어 있지 않습니다. 구매 토큰과 앱의 `packageName`만 포함됩니다. 따라서 앱은 각 구매에 Pushwoosh가 필요로 하는 식별자로 태그를 지정하고, Pushwoosh는 알림이 도착할 때마다 구매에서 해당 식별자를 다시 읽습니다.

1. 사용자의 Google Play 계정에서 구독 상태가 변경됩니다 (구매, 갱신, 취소 등).
2. Google Play는 Pushwoosh의 공유 주제에 RTDN 메시지를 게시합니다.
3. Pushwoosh는 구매의 `obfuscatedAccountId`를 읽습니다. 이 값은 구매 시 앱에서 `<AppCode>:<hwid>`로 설정한 값입니다.
4. Pushwoosh는 HWID가 일치하는 기기를 확인하고, 해당 기기에 연결된 사용자를 찾아 해당 사용자에 대해 일치하는 `PW_Subscription*` 이벤트를 게시합니다.

<Aside type="caution" title="중요">
Google Play 구매와 Pushwoosh 사용자 간의 매칭은 `obfuscatedAccountId`에 의존합니다. 앱이 구매 시 이 값을 설정하지 않으면 Pushwoosh는 알림을 수신하지만 **이벤트는 게시되지 않습니다**. 이 값은 구매 시 설정되며 기존 구독에 대해 **소급 적용할 수 없습니다**. [계정 식별자 설정 방법](#set-the-account-identifier-at-purchase)을 참조하세요.
</Aside>

### 사용 사례

**이탈 구독자 되찾기:** 자동 갱신을 비활성화해도 즉시 접근이 종료되지는 않습니다. 구독은 유료 기간이 끝날 때까지 활성 상태로 유지되며, 이 기간이 사용자를 다시 되찾을 수 있는 기회입니다. `PW_SubscriptionCancel` 이벤트 발생 시, [Customer Journey](/ko/product/customer-journey/pushwoosh-journey-overview/)를 시작하여 유지 푸시를 보내거나, 잃게 될 기능에 대한 [이메일](/ko/product/messaging-channels/emails/)을 보내거나, 접근 권한이 만료되기 전에 갱신 할인이 포함된 [인앱 메시지](/ko/product/messaging-channels/in-apps/)를 보낼 수 있습니다.

**신규 구독자 온보딩:** `PW_SubscriptionStart` 이벤트 발생 시 환영 시리즈를 트리거하여 사용자가 요금제에서 조기에 가치를 얻도록 돕고 갱신을 위한 발판을 마련합니다.

**실패한 결제 복구:** `PW_SubscriptionBillingIssue` 이벤트가 발생하면 갱신 결제가 실패하고 구독이 유예 기간에 들어간 것입니다. 사용자가 접근 권한을 잃기 전에 결제 방법을 업데이트하도록 유도하고, 문제가 해결되면 `PW_SubscriptionRecovered`로 후속 조치를 취하여 확인합니다.

**만료된 사용자 재참여:** 완전히 이탈한 구독자를 대상으로 `PW_SubscriptionExpired` 이벤트 발생 시 재방문 고객 혜택이 포함된 재활성화 캠페인을 시작합니다.

## 통합 설정

시작하기 전에 [FCM이 구성된](/ko/developer/pushwoosh-sdk/android-sdk/firebase-integration/integrate-pushwoosh-android-sdk/) Pushwoosh 앱(푸시에 이미 필요), 구독이 있는 Google Play 앱, Play Console 관리자 접근 권한이 있는지 확인하세요.

### 구매 시 계정 식별자 설정

Pushwoosh는 기기의 **HWID**와 **Application Code**를 조합하여 올바른 사용자를 식별합니다. Pushwoosh Android SDK는 이 값을 이미 `<AppCode>:<hwid>` 형식으로 반환하는 헬퍼 함수인 `getSubscriptionAccountId()`를 제공합니다. Google Play 결제 흐름을 시작할 때 이 값을 `BillingFlowParams.setObfuscatedAccountId()`에 전달하세요.

<Tabs>
<TabItem label="Kotlin">
```kotlin
val billingParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    // Pushwoosh 계정 식별자 "<AppCode>:<hwid>"로 구매에 태그 지정
    .setObfuscatedAccountId(Pushwoosh.getInstance().subscriptionAccountId)
    .build()

billingClient.launchBillingFlow(activity, billingParams)
```
</TabItem>
<TabItem label="Java">
```java
BillingFlowParams billingParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        // Pushwoosh 계정 식별자 "<AppCode>:<hwid>"로 구매에 태그 지정
        .setObfuscatedAccountId(Pushwoosh.getInstance().getSubscriptionAccountId())
        .build();

billingClient.launchBillingFlow(activity, billingParams);
```
</TabItem>
</Tabs>

<Aside type="note">
SDK가 초기화된 후 `getSubscriptionAccountId()`를 호출하세요. Application Code 또는 HWID를 아직 사용할 수 없는 경우 빈 문자열을 반환합니다. Google은 난독화된 계정 ID를 64자로 제한합니다. Pushwoosh `<AppCode>:<hwid>` 값은 해당 제한 내에 있습니다.
</Aside>

<Aside type="caution">
앱이 Pushwoosh HWID를 사용자 지정 값으로 재정의하는 경우, `getSubscriptionAccountId()`는 이를 자동으로 반영합니다. 식별자를 수동으로 만들지 마세요. 항상 헬퍼 함수를 사용하여 값이 Pushwoosh에 있는 기기의 HWID와 일치하도록 하세요. 그렇지 않으면 이벤트를 귀속시킬 수 없습니다.
</Aside>

### 실시간 개발자 알림을 Pushwoosh로 지정

1. [Google Play Console](https://play.google.com/console/)에서 **수익 창출 → 수익 창출 설정**으로 이동합니다.
2. **실시간 개발자 알림**을 찾아 **주제 이름**을 다음으로 설정합니다:

```
projects/pw-playstore-subscriptions/topics/play-rtdn
```

3. **저장**을 클릭합니다. 게시 권한은 이미 Google의 알림 서비스에 부여되었으므로 여기에서 구성할 다른 것은 없습니다.

### Pushwoosh의 서비스 계정에 권한 부여

1. Google Play Console에서 **사용자 및 권한 → 새 사용자 초대**로 이동합니다.
2. Pushwoosh 서비스 계정 이메일을 입력합니다:

```
play-api@pw-playstore-subscriptions.iam.gserviceaccount.com
```

3. **앱 권한**에서 앱을 추가하고 **재무 데이터, 주문 및 취소 설문조사 응답 보기**(읽기 전용 앱 정보 권한 포함)를 부여합니다.
4. **저장**을 클릭합니다. 서비스 계정은 초대를 수락할 필요가 없습니다. 접근 권한은 즉시 활성화됩니다.

### Pushwoosh에서 이벤트 확인

Pushwoosh는 각 `PW_Subscription*` 이벤트가 처음 발생할 때 `productID` 및 `expiresAt` 속성과 함께 프로젝트에 등록합니다. 테스트 후 **Audience → Events**를 열어 이벤트가 나타나는지 확인하세요. 그러면 세분화, 통계 및 Customer Journeys에 사용할 준비가 된 것입니다.

### 캠페인 구축

예를 들어 이탈 고객 되찾기를 위한 `PW_SubscriptionCancel` 또는 온보딩을 위한 `PW_SubscriptionStart`와 같은 모든 `PW_Subscription*` 이벤트에 대해 [트리거 기반 진입](/ko/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/)이 있는 [Customer Journey](/ko/product/customer-journey/pushwoosh-journey-overview/)를 만들고 보내려는 메시지를 추가하세요.

## 테스트

통합을 종단 간 확인하려면:

1. Google Play Console에서 **수익 창출 설정**을 열고 **테스트 알림 보내기**를 클릭합니다. 성공이 보고되어야 하며, 이는 주제가 올바르게 연결되었음을 확인합니다.
2. 위에서 설명한 대로 계정 식별자를 설정하여 구독 구매를 합니다(이때 `PW_SubscriptionStart`가 발생). 그런 다음 **Play 스토어 → 구독 → 취소**에서 취소합니다(이때 `PW_SubscriptionCancel`이 발생).
3. Pushwoosh 제어판에서 사용자 프로필을 열고 [이벤트 기록](/ko/product/audience-data-and-segmentation/user-explorer/#events-history-tab)으로 이동합니다.
4. 잠시 후 이벤트가 나타나는지 확인합니다.