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

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Происходит при обновлении уровня доступа пользователя.
Note

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

Note

В Google Play Adapty может отправить событие subscription_started со всеми денежными полями, равными нулю — например, когда Google заменяет одну подписку другой или когда подписка начинается с бесплатного периода. Не учитывайте такие события как доход. При замене подписки Google выдаёт новый токен покупки, поэтому Adapty фиксирует оплаченную транзакцию с другим store_transaction_id.

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

Adapty будет отправлять только те события, которые вы выбрали в разделе Events names на странице Integrations -> Webhooks.

События webhook сериализуются в 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": "john.doe@company.com",
  "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,
    "original_price_usd": 4.99,
    "original_price_local": 4.99,
    "discount_amount_usd": 0,
    "discount_amount_local": 0,
    "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_idUUIDAdvertising ID (только Android).
attributionsJSONДанные атрибуции. Включается, если в настройках вебхука включён параметр 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Фактическое (бизнес-) время события: например, дата покупки для события покупки или дата истечения для события истечения — не момент получения или отправки события в Adapty. Формат ISO 8601 (например, 2020-07-10T15:00:00.000000+0000). Подробнее о порядке событий см. примечание ниже.
event_propertiesJSONСвойства события.
event_typeStringНазвание события в формате Adapty. Полный список см. в разделе Типы событий вебхука.
idfaUUIDAdvertising ID (только Apple). IDFA в профиле в дашборде Adapty. Может быть null, если недоступен из-за ограничений отслеживания, детского режима или настроек конфиденциальности.
idfvUUIDIdentifier for Vendors (IDFV), уникальный для каждого разработчика. IDFV в профиле в дашборде Adapty.
integration_idsJSONИдентификаторы интеграций пользователя, если вы задаёте их с помощью метода setIntegrationIdentifier в SDK Adapty или при создании/обновлении профилей через серверный API. null, если недоступно или интеграции отключены.
play_store_purchase_tokenJSONТокен покупки Play Store. Включается, если в настройках вебхука включён параметр Send Play Store purchase token.
profile_idUUIDID профиля, автоматически генерируемый Adapty для каждого профиля. Один Apple/Google ID может быть связан с разными profile 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) Adapty ID
  • customer_user_id: (String) Customer User ID, если указан
user_agentStringUser-agent браузера устройства.
user_attributesJSONПользовательские данные для обогащения профилей информацией, специфичной для приложения. Обычно используются для отслеживания предпочтений пользователя (например, тема, язык) или поведенческих флагов (завершение онбординга, использование функций).
Задаются в формате ключ-значение, где ключи — строки, а значения — строки или числа (например, {"Favourite_color": "Violet", "Pet_name": "Fluffy"}).
Пользовательские атрибуты можно задавать вручную в дашборде Adapty для отдельных профилей, программно через метод updateProfile в SDK Adapty или через серверный API при создании/обновлении профилей.
Включается, если в настройках вебхука включён параметр Send User Attributes.

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

Note

event_datetime отражает момент, когда событие произошло в жизненном цикле подписки, а не когда Adapty его обработал или доставил. Из-за этого события могут иметь одинаковое значение event_datetime или поступать не в хронологическом порядке. Например, событие subscription_expired может иметь более раннее значение event_datetime, чем событие subscription_renewal_cancelled, которое Adapty доставит раньше него. Не используйте event_datetime для упорядочивания событий. Вместо этого сортируйте события по времени получения на своей стороне и дедуплицируйте их с помощью profile_event_id или идентификаторов транзакций.

Атрибуции

Чтобы отправлять данные атрибуции, включите опцию 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

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

FieldTypeDescription
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, которое описано в отдельном разделе). Ниже представлена подробная таблица свойств с указанием, к каким событиям они относятся.

Note

Adapty конвертирует другие валюты в USD по курсу currencylayer.com (обновляется каждые 8 часов). Курс фиксируется на момент транзакции — последующие изменения не влияют на результат конвертации.

ПолеТипОписание
ab_test_nameStringНазвание A/B-теста Adapty, в рамках которого произошла транзакция.
ab_test_revisionIntegerРевизия A/B-теста, в рамках которого произошла транзакция.
base_plan_idStringИдентификатор базового плана в Google Play Store или идентификатор цены в 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_idStringИдентификатор плейсмента, в рамках которого произошла транзакция.
discount_amount_localFloatСкидка, применённая к транзакции: стандартная цена минус фактически списанная сумма, до вычета комиссии Apple/Google, в локальной валюте. 0 при покупке по полной цене. Для бесплатного пробного периода равна полной стандартной цене (original_price_local), так как ничего не списывается. null, если скидка применена, но стандартная цена неизвестна (см. original_price_local). Всегда null для офферов App Store с единовременной оплатой: единый платёж покрывает несколько расчётных периодов, поэтому сравнение с ценой за один период невозможно.
discount_amount_usdFloatЗначение discount_amount_local в USD.
environmentStringВозможные значения: Sandbox или Production.
event_datetimeISO 8601 dateДата и время события. Совпадает со значением на корневом уровне события.
original_price_localFloatСтандартная, недисконтированная цена продукта до вычета комиссии Apple/Google, в локальной валюте. Для подписок — это цена продления. Равна price_local при покупке по полной цене и всегда равна price_local для разовых покупок, поскольку сторы не сообщают отдельную стандартную цену для них. null при дисконтированной покупке, если стор не предоставляет надёжную стандартную цену (например, автопродление отключено, продление всё ещё содержит оффер или ожидается смена продукта).
original_price_usdFloatТо же, что original_price_local, в USD.
original_purchase_dateISO 8601 dateДля периодических подписок первоначальная покупка — это первая транзакция в цепочке; её идентификатор, называемый original transaction ID, связывает цепочку продлений. Последующие транзакции являются её продолжением. Дата первоначальной покупки — это дата и время этой первой транзакции.
original_transaction_idString

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

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

paywall_nameStringНазвание пейвола, в рамках которого произошла транзакция.
paywall_revisionStringРевизия пейвола, в рамках которого произошла транзакция. Значение по умолчанию — 1.
price_localFloatСумма, списанная за транзакцию до вычета комиссии Apple/Google, в локальной валюте. null для бесплатных пробных периодов, так как ничего не списывается.
price_usdFloatСумма, списанная за транзакцию до вычета комиссии Apple/Google, в USD. null для бесплатных пробных периодов, так как ничего не списывается.
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Общая выручка по профилю с вычетом возвратов.
promotional_offer_idStringИдентификатор Adapty для использованного promotional offer. Этот идентификатор задаётся при создании оффера в дашборде.
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.
store_offer_number_of_periodsIntegerКоличество базовых расчётных периодов, на которые распространяется скидка оффера (1 и более). Присутствует только при наличии оффера. null для офферов App Store с единовременной оплатой и в случаях, когда стор не сообщает продолжительность оффера.
subscription_expires_atISO 8601 date

Дата истечения срока подписки.

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

transaction_idStringУникальный идентификатор транзакции.
trial_durationStringПродолжительность пробного периода в днях. Передаётся в формате « days», например «7 days». Присутствует только в типах событий, связанных с пробным периодом: trial_started, trial_converted, trial_cancelled.
variation_idUUIDУникальный идентификатор пейвола, на котором была совершена покупка.
vendor_product_idString

Идентификатор продукта в Apple App Store, Google Play Store или Stripe.

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

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

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

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

  • subscription_renewed
  • subscription_initial_purchase (также называется subscription_started — то же самое событие)
  • subscription_refunded
  • non_subscription_purchase
ПолеТипОписание
net_revenue_localFloatЧистый доход (после вычета комиссии Apple/Google и налогов) в местной валюте.
net_revenue_usdFloatЧистый доход (после вычета комиссии Apple/Google и налогов) в USD.
proceeds_localFloatЦена продукта после вычета комиссии Apple/Google в местной валюте.
proceeds_usdFloatЦена продукта после вычета комиссии Apple/Google.
tax_amount_localFloatСумма удержанного налога в местной валюте.
tax_amount_usdFloatСумма удержанного налога в USD.

Пример полезной нагрузки 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_*) включены.

Пример полезной нагрузки (нажмите, чтобы развернуть)
{
  "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,
    "original_price_usd": 4.99,
    "original_price_local": 4.99,
    "discount_amount_usd": 0,
    "discount_amount_local": 0,
    "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 и включённом типе этого события. Если оно включено, оно отправляется на настроенный Webhook и отображается в Event Feed. Если не включено, событие не создаётся.

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

Tip

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

PropertyTypeDescription
ab_test_nameStringНазвание A/B-теста, из которого был получен транзакт.
access_level_idStringID уровня доступа.
activated_atISO 8601 dateДата и время последней активации доступа.
active_introductory_offer_typeStringТип применённого introductory offer. Возможные значения: free_trial, pay_as_you_go и pay_up_front.
active_promotional_offer_idStringID promotional offer, указанного в разделе Products дашборда Adapty.
active_promotional_offer_typeStringТип применённого promotional offer. Возможные значения: free_trial, pay_as_you_go и pay_up_front.
base_plan_idStringID базового плана в Google Play Store или ID цены в 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_idStringID плейсмента, из которого была получена транзакция.
environmentStringВозможные значения: Sandbox или Production.
event_datetimeISO 8601 dateДата и время события.
expires_atISO 8601 date

Дата и время истечения доступа. На основе этого поля Adapty вычисляет is_active.

В течение льготного периода здесь хранится дата окончания льготного периода; после возврата или отмены — дата отмены. Отдельного поля для окончания льготного периода нет.

is_activeBooleanПризнак активности уровня доступа. Вычисляется на основе expires_at (совместно с starts_at и is_lifetime) в момент генерации события.
is_in_grace_periodBooleanПризнак того, что профиль находится в льготном периоде. Пока true, в expires_at хранится дата окончания льготного периода.
is_lifetimeBooleanПризнак того, что уровень доступа является пожизненным.
is_refundBooleanПризнак того, что транзакция является возвратом.
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.
profile_countryStringОпределяется Adapty на основе IP-адреса профиля.
profile_event_idUUIDУникальный ID события, который можно использовать для дедупликации.
profile_has_access_levelBooleanПризнак наличия у профиля активного уровня доступа.
profile_idUUIDВнутренний ID профиля пользователя в Adapty.
profile_ip_addressStringIP-адрес профиля (может быть IPv4 или IPv6; при наличии предпочтительнее IPv4). null, если опция Collect users’ IP addresses отключена в настройках приложения.
profile_total_revenue_usdFloatОбщая выручка по профилю с учётом возвратов.
purchase_dateISO 8601 dateДата и время покупки продукта.
renewed_atISO 8601 dateДата и время начала текущего периода платного доступа. До первого продления совпадает с activated_at.
starts_atISO 8601 dateДата и время начала действия уровня доступа.
storeStringСтор, в котором был куплен продукт. Стандартные значения: app_store, play_store, stripe, paddle.
Если транзакции заданы через серверный API с помощью пользовательских транзакций стора, используется значение из параметра store.
store_countryStringСтрана, переданная в Adapty стором.
subscription_expires_atISO 8601 dateДата истечения подписки. В данном событии содержит то же значение, что и expires_at: в льготном периоде — дату его окончания; после возврата или отмены — дату отмены.
transaction_idStringУникальный идентификатор транзакции.
trial_durationStringДлительность пробного периода в днях (например, «7 days»).
variation_idUUIDИдентификатор варианта, используемый для атрибуции покупок данному пейволу.
vendor_product_idString

ID продукта в сторе (Apple/Google/Stripe).

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

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

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