# Отслеживание подписок Google Play

<Aside type="caution" icon="setting" title="Требуется помощь разработчика">
Для настройки этой интеграции вам понадобится помощь вашей команды разработчиков. Пожалуйста, поделитесь с ними этим руководством.
</Aside>

## Обзор интеграции

[Real-Time Developer Notifications (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](/ru/product/integrations/app-store-subscription-tracking/).
</Aside>

### Тип интеграции

**Источник:** Real-Time Developer Notifications отправляются из 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>Как события сопоставляются с Real-Time Developer Notifications</summary>

Для разработчиков, проверяющих интеграцию, каждое событие Pushwoosh соответствует этим значениям `notificationType` RTDN:

| Событие 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 публикует сообщение RTDN в общую тему Pushwoosh.
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](/ru/product/customer-journey/pushwoosh-journey-overview/) с push-уведомлением для удержания, [email-сообщением](/ru/product/messaging-channels/emails/) о функциях, которые они потеряют, или [in-app сообщением](/ru/product/messaging-channels/in-apps/) со скидкой на продление до истечения доступа.

**Онбординг новых подписчиков:** Запустите приветственную серию по событию `PW_SubscriptionStart`, чтобы помочь пользователям быстрее оценить преимущества своего тарифа и подготовить почву для продления.

**Спасение неудачных платежей:** Когда срабатывает событие `PW_SubscriptionBillingIssue`, это означает, что платеж за продление не прошел, и подписка находится в льготном периоде. Предложите пользователю обновить способ оплаты до того, как он потеряет доступ, и отправьте подтверждение с помощью `PW_SubscriptionRecovered` после решения проблемы.

**Повторное вовлечение ушедших пользователей:** Запустите кампанию по реактивации по событию `PW_SubscriptionExpired` с предложением для вернувшихся подписчиков, которые полностью отказались от подписки.

## Настройка интеграции

Прежде чем начать, убедитесь, что у вас есть приложение Pushwoosh с [настроенным FCM](/ru/developer/pushwoosh-sdk/android-sdk/firebase-integration/integrate-pushwoosh-android-sdk/) (уже требуется для push-уведомлений), приложение Google Play с подпиской и доступ администратора к Play Console.

### Установка идентификатора аккаунта при покупке

Pushwoosh идентифицирует нужного пользователя по **HWID** устройства в сочетании с вашим **Application Code**. Pushwoosh Android SDK предоставляет вспомогательный метод, `getSubscriptionAccountId()`, который возвращает это значение уже в формате `<AppCode>:<hwid>`. Передайте его в `BillingFlowParams.setObfuscatedAccountId()` при запуске процесса оплаты Google Play.

<Tabs>
<TabItem label="Kotlin">
```kotlin
val billingParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    // Tag the purchase with the Pushwoosh account identifier "<AppCode>:<hwid>"
    .setObfuscatedAccountId(Pushwoosh.getInstance().subscriptionAccountId)
    .build()

billingClient.launchBillingFlow(activity, billingParams)
```
</TabItem>
<TabItem label="Java">
```java
BillingFlowParams billingParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        // Tag the purchase with the Pushwoosh account identifier "<AppCode>:<hwid>"
        .setObfuscatedAccountId(Pushwoosh.getInstance().getSubscriptionAccountId())
        .build();

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

<Aside type="note">
Вызывайте `getSubscriptionAccountId()` после инициализации SDK. Он вернет пустую строку, если Application Code или HWID еще не доступны. Google ограничивает длину obfuscated account id 64 символами. Значение Pushwoosh `<AppCode>:<hwid>` не превышает этот лимит.
</Aside>

<Aside type="caution">
Если ваше приложение переопределяет HWID Pushwoosh пользовательским значением, `getSubscriptionAccountId()` автоматически это отразит. Не создавайте идентификатор вручную. Всегда используйте вспомогательный метод, чтобы значение соответствовало HWID устройства в Pushwoosh, иначе событие не сможет быть атрибутировано.
</Aside>

### Направление Real-Time Developer Notifications в 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. Введите email сервисного аккаунта Pushwoosh:

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

3. В разделе **Разрешения для приложений** добавьте свое приложение и предоставьте разрешение **Просмотр финансовых данных, заказов и ответов на опрос об отмене подписки** (а также разрешение на просмотр информации о приложении).
4. Нажмите **Сохранить**. Сервисному аккаунту не нужно принимать приглашение. Доступ активируется немедленно.

### Подтверждение событий в Pushwoosh

Pushwoosh регистрирует каждое событие `PW_Subscription*` в вашем проекте при его первом появлении с атрибутами `productID` и `expiresAt`. После теста откройте **Аудитория → События**, чтобы убедиться, что события появились. После этого они будут готовы для сегментации, статистики и Customer Journeys.

### Создание кампании

Создайте [Customer Journey](/ru/product/customer-journey/pushwoosh-journey-overview/) с [входом на основе триггера](/ru/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/) по любому событию `PW_Subscription*`, например, `PW_SubscriptionCancel` для возврата пользователей или `PW_SubscriptionStart` для онбординга, и добавьте сообщения, которые вы хотите отправить.

## Тестирование

Чтобы проверить интеграцию от начала до конца:

1. В Google Play Console откройте **Настройка монетизации** и нажмите **Отправить тестовое уведомление**. Должно появиться сообщение об успехе, подтверждающее, что тема настроена правильно.
2. Совершите покупку подписки с установленным, как описано выше, идентификатором аккаунта (это вызовет событие `PW_SubscriptionStart`), затем отмените ее в **Play Store → Подписки → Отменить** (это вызовет событие `PW_SubscriptionCancel`).
3. В Pushwoosh Control Panel откройте профиль пользователя и перейдите в [историю событий](/ru/product/audience-data-and-segmentation/user-explorer/#events-history-tab).
4. Убедитесь, что события появятся через несколько мгновений.