Типы событий и поля вебхуков

Adapty отправляет вебхуки в ответ на события подписки. В этом разделе описаны типы событий и данные, содержащиеся в каждом вебхуке.

Типы событий вебхука

Вы можете отправлять в вебхук все типы событий или только выбранные. Ознакомьтесь с нашим руководством по потокам событий, чтобы понять, какие данные поступают и как выстроить бизнес-логику вокруг них. Ненужные типы событий можно отключить при настройке интеграции с вебхуком. Там же при необходимости можно заменить стандартные идентификаторы событий Adapty на собственные.

Event nameDescription
subscription_startedСрабатывает, когда пользователь активирует платную подписку без пробного периода, то есть с него сразу списывается оплата.
subscription_renewedПроисходит при продлении подписки и списании оплаты с пользователя. Это событие фиксируется начиная со второго платежа — как для пробных, так и для обычных подписок.
subscription_renewal_cancelledПользователь отключил автопродление подписки. Доступ к премиум-функциям сохраняется до конца оплаченного периода.
subscription_renewal_reactivatedСрабатывает, когда пользователь повторно включает автопродление подписки.
subscription_expiredСрабатывает, когда подписка полностью завершается после отмены. Например, если пользователь отменил подписку 12 декабря, но она активна до 31 декабря, событие фиксируется 31 декабря, когда подписка истекает.
subscription_pausedПроисходит, когда пользователь активирует паузу подписки (только Android).
subscription_deferredСрабатывает, когда покупка подписки откладывается, — пользователь может перенести платёж, сохраняя доступ к премиум-функциям. Функция доступна через Google Play Developer API и может использоваться для пробных периодов или в поддержку пользователей, испытывающих финансовые трудности.
non_subscription_purchaseЛюбая покупка без подписки: пожизненный доступ или расходуемые покупки, например внутриигровые монеты.
trial_startedСрабатывает, когда пользователь активирует пробную подписку.
trial_convertedПроисходит, когда пробный период заканчивается и с пользователя списывается первый платёж. Например, если пробный период действует до 14 января, но оплата проходит 7 января, событие фиксируется 7 января.
trial_renewal_cancelledПользователь отключил автопродление подписки в течение пробного периода. Доступ к премиум-функциям сохраняется до конца пробного периода, но оплата не будет списана и подписка не активируется.
trial_renewal_reactivatedПроисходит, когда пользователь повторно включает автопродление подписки в течение пробного периода.
trial_expiredСрабатывает, когда пробный период заканчивается без перехода в подписку.
entered_grace_periodПроисходит, когда попытка оплаты завершается неудачей и пользователь переходит в льготный период (если он включён). В течение этого времени доступ к премиум-функциям сохраняется.
billing_issue_detectedСрабатывает при возникновении проблемы с оплатой во время попытки списания (например, недостаточно средств на карте).
subscription_refundedСрабатывает при возврате средств за подписку (например, через службу поддержки Apple).
non_subscription_purchase_refundedСрабатывает при возврате средств за покупку без подписки.
access_level_updatedПроисходит при обновлении уровня доступа пользователя.

subscription_renewal_reactivated содержит предыдущий идентификатор продукта — тот, что был активен на момент отмены подписки, — даже если пользователь впоследствии повторно активировал её, купив другой продукт. Apple сохраняет один и тот же original_transaction_id на протяжении всей цепочки «отмена → повторная активация», поэтому событие отражает исходный продукт. Новый продукт появится в следующем событии subscription_renewed, когда начнётся выставление счёта за новый продукт.

Структура событий вебхука

Adapty будет отправлять только те события, которые вы выбрали в разделе Events names на странице Integrations -> Webhooks. События вебхука сериализуются в JSON. Тело POST-запроса к вашему серверу будет содержать сериализованное событие, обёрнутое в структуру, описанную ниже. Все события следуют одной структуре, но их поля различаются в зависимости от типа события, стора и вашей конкретной конфигурации. Атрибуты пользователя — это пользовательские атрибуты, которые вы настроили, поэтому они содержат именно то, что вы сконфигурировали. Поля данных атрибуции одинаковы для всех типов событий, однако список атрибуций зависит от того, какие источники атрибуции вы используете в своём мобильном приложении. Ниже приведён пример события:

{
  "profile_id": "00000000-0000-0000-0000-000000000000",
  "customer_user_id": "UserIdInYourSystem",
  "idfv": "00000000-0000-0000-0000-000000000000",
  "idfa": "00000000-0000-0000-0000-000000000000",
  "advertising_id": "00000000-0000-0000-0000-000000000000",
  "profile_install_datetime": "2000-01-31T00:00:00.000000+0000",
  "user_agent": "ExampleUserAgent/1.0 (Device; OS Version) Browser/Engine",
  "email": "[email protected]",
  "event_type": "subscription_started",
  "event_datetime": "2000-01-31T00:00:00.000000+0000",
  "event_properties": {
    "store": "play_store",
    "currency": "USD",
    "price_usd": 4.99,
    "profile_id": "00000000-0000-0000-0000-000000000000",
    "cohort_name": "All Users",
    "environment": "Production",
    "price_local": 4.99,
    "base_plan_id": "b1",
    "developer_id": "onboarding_placement",
    "ab_test_name": "onboarding_ab_test",
    "ab_test_revision": 1,
    "paywall_name": "UsedPaywall",
    "proceeds_usd": 4.2315,
    "variation_id": "00000000-0000-0000-0000-000000000000",
    "purchase_date": "2024-11-15T10:45:36.181000+0000",
    "store_country": "AR",
    "event_datetime": "2000-01-31T00:00:00.000000+0000",
    "proceeds_local": 4.2415,
    "tax_amount_usd": 0,
    "transaction_id": "0000000000000000",
    "net_revenue_usd": 4.2415,
    "profile_country": "AR",
    "paywall_revision": "1",
    "profile_event_id": "00000000-0000-0000-0000-000000000000",
    "tax_amount_local": 0,
    "net_revenue_local": 4.2415,
    "vendor_product_id": "onemonth_no_trial",
    "profile_ip_address": "10.10.1.1",
    "consecutive_payments": 1,
    "rate_after_first_year": false,
    "original_purchase_date": "2000-01-31T00:00:00.000000+0000",
    "original_transaction_id": "0000000000000000",
    "subscription_expires_at": "2000-01-31T00:00:00.000000+0000",
    "profile_has_access_level": true,
    "profile_total_revenue_usd": 4.99,
    "promotional_offer_id": null,
    "store_offer_category": null,
    "store_offer_discount_type": null
  },
  "event_api_version": 1,
  "profiles_sharing_access_level": [{"profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem"}],
   "attributions": {
    "appsflyer": {
      "ad_set": "Keywords 1.12",
      "status": "non_organic",
      "channel": "Google Ads",
      "ad_group": null,
      "campaign": "Social media influencers - Rest of the world",
      "creative": null,
      "created_at": "2000-01-31T00:00:00.000000+0000"
    }
  },
  "user_attributes": {"Favourite_color": "Violet", "Pet_name": "Fluffy"},
  "integration_ids": {"firebase_app_instance_id": "val1", "branch_id": "val2", "one_signal_player_id": "val3"},
  "play_store_purchase_token": {
    "product_id": "product_123",
    "purchase_token": "token_abc_123",
    "is_subscription": true
  }
}

Поля события

Параметры события одинаковы для всех типов событий.

ПолеТипОписание
advertising_idUUIDРекламный идентификатор (только Android).
attributionsJSONДанные атрибуции. Включается, если в настройках Webhook включён параметр Send Attribution.
customer_user_idStringID пользователя из вашего приложения (UUID, email или другой идентификатор), если вы задали его в коде приложения при идентификации пользователей. Если вы не идентифицируете пользователей в коде приложения или конкретный пользователь анонимен (не авторизован), это поле равно null.
emailStringEmail пользователя, если вы задали его с помощью метода updateProfile в SDK Adapty или при создании/обновлении профилей через серверный API. Если значение email не передаётся в SDK или метод API, это поле равно null.
event_api_versionIntegerВерсия API Adapty (текущая: 1).
event_datetimeISO 8601Временная метка события в формате ISO 8601 (например, 2020-07-10T15:00:00.000000+0000).
event_propertiesJSONСвойства события.
event_typeStringНазвание события в формате Adapty. Полный список см. в разделе Типы событий Webhook.
idfaUUIDРекламный идентификатор (только Apple). IDFA в профиле в дашборде Adapty. Может быть null, если недоступен из-за ограничений отслеживания, детского режима или настроек конфиденциальности.
idfvUUIDИдентификатор для вендоров (IDFV), уникальный для каждого разработчика. IDFV в профиле в дашборде Adapty.
integration_idsJSONID интеграций пользователя, если вы задали их с помощью метода setIntegrationIdentifier в SDK Adapty или при создании/обновлении профилей через серверный API. null, если недоступны или интеграции отключены.
play_store_purchase_tokenJSONТокен покупки в Play Store. Включается, если в настройках Webhook включён параметр Send Play Store purchase token.
profile_idUUIDID профиля, автоматически генерируемый Adapty для каждого профиля. Один Apple/Google ID может быть связан с разными ID профилей, если вы не идентифицируете пользователей или разрешаете покупки до авторизации. Подробнее о том, как Adapty работает с родительскими и дочерними профилями.
profile_install_datetimeISO 8601Временная метка установки в формате ISO 8601 (например, 2020-07-10T15:00:00.000000+0000).
profiles_sharing_access_levelJSONСписок пользователей, совместно использующих уровень доступа, за исключением текущего профиля. Если для вашего приложения включён общий доступ к уровням доступа, список содержит другие профили, привязанные к тому же Apple/Google ID.
Формат:
  • profile_id: (UUID) ID Adapty
  • customer_user_id: (String) Customer User ID, если указан
user_agentStringUser-agent браузера устройства.
user_attributesJSONПользовательские данные для обогащения профилей информацией, специфичной для приложения. Как правило, используются для отслеживания предпочтений пользователя (например, тема, язык) или поведенческих флагов (прохождение онбординга, использование функций).
Форматируются как пары ключ-значение, где ключи — строки, а значения — строки или числа (например, {"Favourite_color": "Violet", "Pet_name": "Fluffy"}).
Задать пользовательские атрибуты можно вручную в дашборде Adapty для отдельных профилей, программно с помощью метода updateProfile в SDK Adapty или через серверный API при создании/обновлении профилей.
Включается, если в настройках Webhook включён параметр Send User Attributes.

Значения пользовательских атрибутов в коде мобильного приложения могут быть заданы как float или string, однако атрибуты, полученные через серверный API или исторический импорт, могут приходить в других форматах. В таком случае булевые и целочисленные значения будут приведены к типу float.

Атрибуция

Чтобы отправлять данные атрибуции, включите опцию Send Attribution на странице Integrations -> Webhooks. Если вы включили отправку данных атрибуции и настроили интеграции атрибуции, приведённые ниже данные будут отправляться с каждым событием для каждого источника. Одни и те же данные атрибуции отправляются для всех типов событий.

{
  "attributions": {
    "appsflyer": {
      "ad_set": "sample_ad_set_123",
      "status": "non_organic",
      "channel": "sample_channel",
      "ad_group": "sample_ad_group_456",
      "campaign": "sample_ios_campaign",
      "creative": "sample_creative_789",
      "created_at": "2000-01-31T00:00:00.000000+0000",
      "network_user_id": "0000000000000-0000000"
    }
  }
}
Название поляТип поляОписание
ad_setStringРекламный набор атрибуции.
statusStringМожет быть organic, non_organic, или unknown.
channelStringНазвание маркетингового канала.
ad_groupStringГруппа объявлений атрибуции.
campaignStringНазвание маркетинговой кампании.
creativeStringКлючевое слово креатива атрибуции.
created_atISO 8601 dateДата и время создания записи атрибуции.
network_user_idStringID пользователя, присвоенный источником атрибуции.

Идентификаторы интеграций

Следующие идентификаторы интеграций используются в событиях:

  • adjust_device_id
  • airbridge_device_id
  • amplitude_device_id
  • amplitude_user_id
  • appmetrica_device_id
  • appmetrica_profile_id
  • appsflyer_id
  • branch_id
  • facebook_anonymous_id
  • firebase_app_instance_id
  • mixpanel_user_id
  • pushwoosh_hwid
  • one_signal_player_id
  • one_signal_subscription_id
  • tenjin_analytics_installation_id
  • posthog_distinct_user_id

Токен покупки Play Store

Это поле содержит все данные, необходимые для повторной валидации покупки. Оно отправляется только если в настройках интеграции Webhook включена опция Send Play Store purchase token.

ПолеТипОписание
product_idStringУникальный идентификатор продукта (SKU), купленного в Play Store.
purchase_tokenStringТокен, сгенерированный Google Play для уникальной идентификации транзакции покупки.
is_subscriptionBooleanУказывает, является ли купленный продукт подпиской (true) или разовой покупкой (false).

Свойства событий

Свойства событий могут различаться в зависимости от типа события и даже между событиями одного типа. Например, событие из App Store не будет содержать свойства, специфичные для Android, такие как base_plan_id. Событие Access Level Updated имеет уникальные свойства, поэтому мы выделили для него отдельный раздел. Аналогично вынесены в отдельный раздел дополнительные свойства событий с налогами и выручкой — они относятся только к определённым типам событий.

Для большинства типов событий

Свойства событий для большинства типов событий одинаковы (за исключением события Access Level Updated, которое описано в отдельном разделе). Ниже представлена подробная таблица свойств с указанием, к каким конкретным событиям они относятся.

ПолеТипОписание
ab_test_nameStringНазвание A/B-теста Adapty, из которого пришла транзакция.
ab_test_revisionIntegerРевизия A/B-теста, из которого пришла транзакция.
base_plan_idStringID базового плана в Google Play Store или ID цены в Stripe.
cancellation_reasonString

Возможные причины отмены: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, cancelled_by_developer, new_subscription_replace, upgraded, unknown, adapty_revoked.

Присутствует в следующих типах событий:

subscription_cancelled, subscription_refunded и trial_cancelled.
cohort_nameStringНазвание аудитории, которая определила, какой пейвол был показан пользователю.
consecutive_paymentsIntegerКоличество периодов, на которые пользователь подписан без перерывов. Включает текущий период.
currencyStringМестная валюта.
developer_idStringID плейсмента, из которого пришла транзакция.
environmentStringВозможные значения: Sandbox или Production.
event_datetimeISO 8601 dateДата и время события. Совпадает со значением на корневом уровне события.
original_purchase_dateISO 8601 dateДля возобновляемых подписок исходная покупка — это первая транзакция в цепочке; её ID (original transaction ID) связывает все последующие продления. Исходная дата покупки — это дата и время этой первой транзакции.
original_transaction_idString

Для возобновляемых подписок — это original transaction ID, связывающий цепочку продлений. Исходная транзакция является первой в цепочке; последующие транзакции — её продолжение.

Если продлений не было, original_transaction_id совпадает с store_transaction_id.

paywall_nameStringНазвание пейвола, из которого пришла транзакция.
paywall_revisionStringРевизия пейвола, из которого пришла транзакция. Значение по умолчанию — 1.
price_localFloatЦена продукта до вычета комиссии Apple/Google в местной валюте.
price_usdFloatЦена продукта до вычета комиссии Apple/Google в USD.
profile_countryStringОпределяется Adapty на основе IP-адреса профиля.
profile_event_idUUIDУникальный ID события, который можно использовать для дедупликации.
profile_has_access_levelBooleanБулево значение, указывающее, есть ли у профиля активный уровень доступа.
profile_idUUIDID профиля, сгенерированный Adapty. Совпадает со значением на корневом уровне события.
profile_ip_addressStringIP-адрес профиля (может быть IPv4 или IPv6; при наличии предпочтение отдаётся IPv4). null, если в настройках приложения отключён параметр Collect users’ IP addresses.
profile_total_revenue_usdFloatОбщая выручка по профилю с учётом вычета возвратов.
promotional_offer_idStringAdapty ID использованного promotional offer. Этот ID задаётся при создании оффера в дашборде.
purchase_dateISO 8601 dateДата и время покупки продукта.
rate_after_first_yearBooleanБулево значение, указывающее, что подписка соответствует условиям сниженной ставки комиссии (обычно 15%) после одного года непрерывного продления. Ставки комиссии варьируются в зависимости от условий программы и страны. Подробнее — в разделе Комиссия стора и налоги.
storeStringСтор, в котором был куплен продукт. Стандартные значения: app_store, play_store, stripe, paddle.
Если вы задаёте пользовательские транзакции стора через серверный API, используется значение из параметра store.
store_countryStringСтрана, переданная нам стором.
store_offer_categoryStringПрименённая категория оффера. Возможные значения: introductory, promotional, winback.
store_offer_discount_typeStringПрименённый тип оффера. Возможные значения: free_trial, pay_as_you_go и pay_up_front.
subscription_expires_atISO 8601 dateДата истечения срока подписки. Как правило, в будущем.
transaction_idStringУникальный идентификатор транзакции.
trial_durationStringДлительность пробного периода в днях. Передаётся в формате « days», например «7 days». Присутствует только в типах событий, связанных с триалом: trial_started, trial_converted, trial_cancelled.
variation_idUUIDУникальный ID пейвола, в котором была совершена покупка.
vendor_product_idString

ID продукта в Apple App Store, Google Play Store или Stripe.

Если доступ был предоставлен без реальной транзакции в сторе, vendor_product_id будет одним из следующих значений:

Дополнительные свойства событий, связанных с налогами и выручкой

Перечисленные ниже свойства событий, связанных с налогами и выручкой, — это дополнительные поля, которые применяются только к определённым типам событий. Это означает, что указанные типы событий включают свойства событий для большинства типов событий, а также дополнительные поля, перечисленные ниже.

Типы событий, для которых применяются свойства событий, связанных с налогами и выручкой:

  • subscription_renewed
  • subscription_initial_purchase (также называется subscription_started — это одно и то же событие)
  • subscription_refunded
  • non_subscription_purchase | Поле | Тип | Описание | | :-------------------- | :---- | :----------------------------------------------------------- | | net_revenue_local | Float | Чистая выручка (доход после вычета комиссии Apple/Google и налогов) в местной валюте. | | net_revenue_usd | Float | Чистая выручка (доход после вычета комиссии Apple/Google и налогов) в USD. | | proceeds_local | Float | Цена продукта после вычета комиссии Apple/Google в местной валюте. | | proceeds_usd | Float | Цена продукта после вычета комиссии Apple/Google. | | tax_amount_local | Float | Сумма удержанного налога в местной валюте. | | tax_amount_usd | Float | Сумма удержанного налога в USD. |

Пример payload для non_subscription_purchase

non_subscription_purchase следует той же структуре, что и события подписки, но отражает разовую или расходуемую покупку. Поля, характерные только для подписок, не применяются: cancellation_reason, will_renew, is_in_grace_period, is_refund, is_lifetime и trial_duration отсутствуют. subscription_expires_at присутствует, но равно null. Поля налогов и выручки (net_revenue_*, proceeds_*, tax_amount_*) включены.

Пример payload (нажмите, чтобы развернуть)
{
  "profile_id": "00000000-0000-0000-0000-000000000000",
  "customer_user_id": "UserIdInYourSystem",
  "event_type": "non_subscription_purchase",
  "event_datetime": "2000-01-31T00:00:00.000000+0000",
  "event_properties": {
    "store": "app_store",
    "currency": "USD",
    "price_usd": 4.99,
    "price_local": 4.99,
    "proceeds_usd": 4.2415,
    "proceeds_local": 4.2415,
    "net_revenue_usd": 4.2415,
    "net_revenue_local": 4.2415,
    "tax_amount_usd": 0,
    "tax_amount_local": 0,
    "profile_id": "00000000-0000-0000-0000-000000000000",
    "environment": "Production",
    "vendor_product_id": "100coins",
    "transaction_id": "0000000000000000",
    "original_transaction_id": "0000000000000000",
    "purchase_date": "2024-11-15T10:45:36.181000+0000",
    "original_purchase_date": "2024-11-15T10:45:36.181000+0000",
    "subscription_expires_at": null,
    "store_country": "US",
    "profile_country": "US",
    "profile_ip_address": "10.10.1.1",
    "profile_has_access_level": false,
    "profile_total_revenue_usd": 4.99,
    "consecutive_payments": 1,
    "rate_after_first_year": false,
    "profile_event_id": "00000000-0000-0000-0000-000000000000"
  },
  "event_api_version": 1
}

Для события Access Level Updated

Событие Access Level Updated — это специфическое событие вебхука, которое генерируется только при активной интеграции Webhook и только если данный тип события включён. Если он включён, событие отправляется на настроенный Webhook и отображается в Event Feed. Если не включён — событие не создаётся.

Если вы включили общий доступ к уровням доступа, событие access level updated будет отправлено для всех профилей, использующих этот уровень доступа.

Используйте это событие, чтобы обновить уровень доступа пользователя в своей базе данных, предоставить или отозвать премиум-функции на бэкенде и синхронизировать доступ между устройствами и платформами.

СвойствоТипОписание
ab_test_nameStringНазвание A/B-теста, в рамках которого была совершена транзакция.
access_level_idStringИдентификатор уровня доступа.
activated_atISO 8601 dateДата и время последней активации доступа.
active_introductory_offer_typeStringТип применённого introductory offer. Возможные значения: free_trial, pay_as_you_go, pay_up_front.
active_promotional_offer_idStringИдентификатор promotional offer, указанный в разделе Product дашборда Adapty.
active_promotional_offer_typeStringТип применённого promotional offer. Возможные значения: free_trial, pay_as_you_go, pay_up_front.
base_plan_idStringИдентификатор базового плана в Google Play Store или идентификатор цены в Stripe.
billing_issue_detected_atISO 8601 dateДата и время обнаружения проблемы с оплатой.
cancellation_reasonStringВозможные причины отмены: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, cancelled_by_developer, new_subscription_replace, upgraded, unknown, adapty_revoked.
cohort_nameStringНазвание аудитории, к которой относится профиль.
currencyStringЛокальная валюта (по умолчанию USD).
developer_idStringИдентификатор плейсмента, в рамках которого была совершена транзакция.
environmentStringВозможные значения: Sandbox или Production.
event_datetimeISO 8601 dateДата и время события.
expires_atISO 8601 dateДата и время истечения доступа.
is_activeBooleanПризнак того, активен ли уровень доступа.
is_in_grace_periodBooleanПризнак того, находится ли профиль в льготном периоде.
is_lifetimeBooleanПризнак того, является ли уровень доступа пожизненным.
is_refundBooleanПризнак того, является ли транзакция возвратом средств.
original_purchase_dateISO 8601 dateДля возобновляемых подписок исходная покупка — это первая транзакция в цепочке; её идентификатор (original transaction ID) связывает всю цепочку продлений, а последующие транзакции являются её продолжением. Дата исходной покупки — это дата и время этой первой транзакции.
original_transaction_idString

Для возобновляемых подписок — идентификатор исходной транзакции, связывающий цепочку продлений. Исходная транзакция является первой в цепочке; последующие транзакции являются её продолжением.

Если продлений не было, original_transaction_id совпадает с store_transaction_id.

Идентификатор транзакции исходной покупки.
paywall_nameStringНазвание пейвола, в рамках которого была совершена транзакция.
paywall_revisionStringРевизия пейвола, в рамках которого была совершена транзакция. Значение по умолчанию — 1.
profile_countryStringОпределяется Adapty на основе IP-адреса профиля.
profile_event_idUUIDУникальный идентификатор события, который можно использовать для дедупликации.
profile_has_access_levelBooleanПризнак того, есть ли у профиля активный уровень доступа.
profile_idUUIDВнутренний идентификатор профиля пользователя в Adapty.
profile_ip_addressStringIP-адрес профиля (может быть IPv4 или IPv6; IPv4 предпочтителен при наличии). Равно null, если параметр Collect users’ IP addresses отключён в настройках приложения.
profile_total_revenue_usdFloatОбщая выручка по профилю с учётом возвратов.
purchase_dateISO 8601 dateДата и время покупки продукта.
renewed_atISO 8601 dateДата и время следующего продления доступа.
starts_atISO 8601 dateДата и время начала действия уровня доступа.
storeStringСтор, в котором был куплен продукт. Стандартные значения: app_store, play_store, stripe, paddle.
Если транзакции задаются через серверный API с помощью пользовательских транзакций стора, используется значение из параметра store.
store_countryStringСтрана, переданная в Adapty магазином приложений.
subscription_expires_atISO 8601 dateДата истечения подписки.
transaction_idStringУникальный идентификатор транзакции.
trial_durationStringДлительность пробного периода в днях (например, «7 days»).
variation_idUUIDИдентификатор варианта, используемый для атрибуции покупок к данному пейволу.
vendor_product_idString

Идентификатор продукта в сторе (Apple/Google/Stripe).

Если доступ был предоставлен без реальной транзакции в сторе, vendor_product_id принимает одно из следующих значений:

will_renewBooleanУказывает, будет ли платный уровень доступа продлён.

Обратите внимание, что эта структура может расширяться со временем — по мере добавления новых данных нами или сторонними сервисами, с которыми мы работаем. Убедитесь, что ваш код, обрабатывающий её, достаточно устойчив и опирается на конкретные поля, а не на всю структуру целиком.