Webhook 事件类型与字段
Adapty 会在订阅事件发生时发送 webhook。本节定义了这些事件类型以及每个 webhook 中包含的数据。
| 事件名称 | 描述 |
|---|---|
| subscription_started | 当用户激活不含试用期的付费订阅时触发,即立即计费。 |
| subscription_renewed | 当订阅续期并向用户收费时发生。此事件从第二次计费开始触发,无论是试用订阅还是非试用订阅。 |
| subscription_renewal_cancelled | 用户已关闭订阅自动续期。用户在付费订阅期结束前仍可访问高级功能。 |
| subscription_renewal_reactivated | 当用户重新激活订阅自动续期时触发。 |
| subscription_expired | 当订阅取消后完全结束时触发。例如,若用户在 12 月 12 日取消订阅,但订阅在 12 月 31 日前仍处于活跃状态,则该事件在 12 月 31 日订阅到期时记录。 |
| subscription_paused | 当用户激活订阅暂停时发生(仅限 Android)。 |
| subscription_deferred | 当订阅购买被延迟时触发,允许用户在延迟付款的同时继续访问高级功能。此功能通过 Google Play Developer API 提供,可用于免费试用或为面临经济困难的用户提供便利。 |
| non_subscription_purchase | 任何非订阅购买,例如永久授权或消耗型商品(如游戏内金币)。 |
| trial_started | 当用户激活试用订阅时触发。 |
| trial_converted | 当试用期结束并向用户收费(首次购买)时发生。例如,若用户的试用期至 1 月 14 日,但在 1 月 7 日被收费,则该事件在 1 月 7 日记录。 |
| trial_renewal_cancelled | 用户在试用期间关闭了订阅自动续期。用户在试用期结束前仍可访问高级功能,但不会被收费或开始订阅。 |
| trial_renewal_reactivated | 当用户在试用期间重新激活订阅自动续期时发生。 |
| trial_expired | 当试用期结束且未转化为订阅时触发。 |
| entered_grace_period | 当付款尝试失败且用户进入宽限期(如已启用)时发生。用户在此期间仍保留高级访问权限。 |
| billing_issue_detected | 当计费尝试过程中发生计费问题时触发(例如,银行卡余额不足)。 |
| subscription_refunded | 当订阅被退款时触发(例如,由 Apple Support 处理)。 |
| non_subscription_purchase_refunded | 当非订阅购买被退款时触发。 |
| access_level_updated | 当用户的访问等级更新时发生。 |
Webhook 事件类型
您可以将所有事件类型发送到 Webhook,也可以只选择其中部分类型。您可以参考我们的事件流程,了解预期接收的数据格式以及如何围绕它构建业务逻辑。在设置 Webhook 集成时,您可以禁用不需要的事件类型,也可以在那里用自定义 ID 替换 Adapty 默认的事件 ID。
| 事件名称 | 描述 |
|---|---|
| subscription_started | 当用户激活不含试用期的付费订阅时触发,即立即计费。 |
| subscription_renewed | 当订阅续期并向用户收费时发生。此事件从第二次计费开始触发,无论是试用订阅还是非试用订阅。 |
| subscription_renewal_cancelled | 用户已关闭订阅自动续期。用户在付费订阅期结束前仍可访问高级功能。 |
| subscription_renewal_reactivated | 当用户重新激活订阅自动续期时触发。 |
| subscription_expired | 当订阅取消后完全结束时触发。例如,若用户在 12 月 12 日取消订阅,但订阅在 12 月 31 日前仍处于活跃状态,则该事件在 12 月 31 日订阅到期时记录。 |
| subscription_paused | 当用户激活订阅暂停时发生(仅限 Android)。 |
| subscription_deferred | 当订阅购买被延迟时触发,允许用户在延迟付款的同时继续访问高级功能。此功能通过 Google Play Developer API 提供,可用于免费试用或为面临经济困难的用户提供便利。 |
| non_subscription_purchase | 任何非订阅购买,例如永久授权或消耗型商品(如游戏内金币)。 |
| trial_started | 当用户激活试用订阅时触发。 |
| trial_converted | 当试用期结束并向用户收费(首次购买)时发生。例如,若用户的试用期至 1 月 14 日,但在 1 月 7 日被收费,则该事件在 1 月 7 日记录。 |
| trial_renewal_cancelled | 用户在试用期间关闭了订阅自动续期。用户在试用期结束前仍可访问高级功能,但不会被收费或开始订阅。 |
| trial_renewal_reactivated | 当用户在试用期间重新激活订阅自动续期时发生。 |
| trial_expired | 当试用期结束且未转化为订阅时触发。 |
| entered_grace_period | 当付款尝试失败且用户进入宽限期(如已启用)时发生。用户在此期间仍保留高级访问权限。 |
| billing_issue_detected | 当计费尝试过程中发生计费问题时触发(例如,银行卡余额不足)。 |
| subscription_refunded | 当订阅被退款时触发(例如,由 Apple Support 处理)。 |
| non_subscription_purchase_refunded | 当非订阅购买被退款时触发。 |
| access_level_updated | 当用户的访问等级更新时发生。 |
subscription_renewal_reactivated 携带的是之前的产品 ID——即用户取消订阅时处于活跃状态的产品 ID——即使用户后来通过购买其他产品重新激活了订阅也是如此。Apple 在整个取消 → 重新激活链路中保持相同的 original_transaction_id,因此该事件反映的是原始产品。新产品将在下一个 subscription_renewed 事件中体现,届时新产品的计费正式开始。
Webhook 事件结构
Adapty 只会发送你在 Integrations -> Webhooks 页面 Events names 部分所选择的事件。
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": "[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_id | UUID | 广告 ID(仅限 Android)。 |
| attributions | JSON | 归因数据。在 Webhook 设置中启用 Send Attribution 后包含此字段。 |
| customer_user_id | String | 您应用中的用户 ID(UUID、邮箱或其他 ID),需在应用代码中识别用户时设置。若未在应用代码中识别用户,或该用户为匿名用户(未登录),则此字段为 null。 |
| String | 用户邮箱,需通过 Adapty SDK 中的 updateProfile 方法,或通过服务端 API 创建/更新用户画像时设置。若未向 SDK 或 API 方法传入 email 值,则此字段为 null。 | |
| event_api_version | Integer | Adapty API 版本(当前版本:1)。 |
| event_datetime | ISO 8601 | 事件的业务发生时间,例如购买事件对应购买日期,到期事件对应到期日期,而非 Adapty 接收或发送事件的时间。采用 ISO 8601 格式(例如 2020-07-10T15:00:00.000000+0000)。有关排序的说明请参见下方注意事项。 |
| event_properties | JSON | 事件属性。 |
| event_type | String | Adapty 格式的事件名称。完整列表请参见 Webhook 事件类型。 |
| idfa | UUID | 广告标识符(仅限 Apple)。对应 Adapty 看板用户画像中的 IDFA。若因追踪限制、儿童模式或隐私设置而不可用,则可能为 null。 |
| idfv | UUID | 供应商标识符(IDFV),每位开发者唯一。对应 Adapty 看板用户画像中的 IDFV。 |
| integration_ids | JSON | 用户集成 ID,需通过 Adapty SDK 中的 setIntegrationIdentifier 方法,或通过服务端 API 创建/更新用户画像时设置。不可用或集成已禁用时为 null。 |
| play_store_purchase_token | JSON | Play Store 购买令牌,在 Webhook 设置中启用 Send Play Store purchase token 后包含此字段。 |
| profile_id | UUID | Adapty 为每个用户画像自动生成的用户画像 ID。若未识别用户或允许购买发生在登录之前,同一 Apple/Google ID 可能关联多个不同的用户画像 ID。详情请参阅 Adapty 如何处理父/继承用户画像。 |
| profile_install_datetime | ISO 8601 | 安装时间戳,采用 ISO 8601 格式(例如 2020-07-10T15:00:00.000000+0000)。 |
| profiles_sharing_access_level | JSON | 与当前用户画像共享访问等级的其他用户列表(不含当前用户)。若您的应用启用了访问等级共享,此列表将包含使用同一 Apple/Google ID 的其他用户画像。 格式:
|
| user_agent | String | 设备浏览器的 User-Agent。 |
| user_attributes | JSON | 可设置的自定义数据,用于为用户画像补充应用专属信息。通常用于记录用户偏好(如主题、语言)或行为标记(是否完成用户引导、功能使用情况等)。 格式为键值对,键为字符串,值可为字符串或数字(例如 {"Favourite_color": "Violet", "Pet_name": "Fluffy"})。您可以在 Adapty 看板中针对单个用户画像手动设置自定义属性,也可通过 Adapty SDK 中的 updateProfile 方法以编程方式设置,或在通过服务端 API 创建/更新用户画像时设置。在 Webhook 设置中启用 Send User Attributes 后包含此字段。 虽然移动应用代码中的自定义属性值可设为浮点数或字符串,但通过服务端 API 或历史数据导入的属性可能以不同格式传入,此时布尔值和整数值将转换为浮点数。 |
event_datetime 反映的是订阅生命周期中事件发生的时间,而非 Adapty 处理或推送该事件的时间。因此,多个事件可能共享相同的 event_datetime,或以非时间顺序到达。例如,subscription_expired 事件的 event_datetime 可能早于 Adapty 先行推送的 subscription_renewal_cancelled 事件。请勿依赖 event_datetime 对事件排序。应改用自行记录的接收时间排序,并通过 profile_event_id 或交易 ID 进行去重。
归因
若要发送归因数据,请在 Integrations -> Webhooks 页面中启用 Send Attribution 选项。启用后,若你已配置归因集成,以下数据将随每个来源的事件一并发送。所有事件类型均会收到相同的归因数据。
{
"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_set | String | 归因广告组。 |
| status | String | 可为 organic、non_organic, 或 unknown。 |
| channel | String | 营销渠道名称。 |
| ad_group | String | 归因广告集。 |
| campaign | String | 营销活动名称。 |
| creative | String | 归因创意关键词。 |
| created_at | ISO 8601 date | 归因记录的创建日期和时间。 |
| network_user_id | String | 归因来源为用户分配的 ID。 |
集成 ID
以下集成 ID 目前在事件中使用:
adjust_device_idairbridge_device_idamplitude_device_idamplitude_user_idappmetrica_device_idappmetrica_profile_idappsflyer_idbranch_idfacebook_anonymous_idfirebase_app_instance_idmixpanel_user_idpushwoosh_hwidone_signal_player_idone_signal_subscription_idtenjin_analytics_installation_idposthog_distinct_user_id
Play Store 购买令牌
此字段包含重新验证购买所需的全部数据(如有需要)。只有在 Webhook 集成设置中启用了 Send Play Store purchase token 选项后,才会发送该字段。
| 字段 | 类型 | 描述 |
|---|---|---|
| product_id | String | 在 Play Store 中购买的产品唯一标识符(SKU)。 |
| purchase_token | String | Google Play 生成的令牌,用于唯一标识本次购买交易。 |
| is_subscription | Boolean | 表示所购产品是否为订阅(true)或一次性购买(false)。 |
事件属性
事件属性因事件类型而异,即使是同类事件也可能有所不同。例如,来自 App Store 的事件不会包含 base_plan_id 等 Android 专属属性。
访问等级更新事件具有独特的属性,因此我们为其单独开辟了一个章节。同样,附加税务和收入事件属性也被单独列出,因为它们仅适用于特定的事件类型。
适用于大多数事件类型
大多数事件类型的事件属性是一致的(Access Level Updated 事件除外,该事件在其专属章节中描述)。下表列出了所有属性,并标注了各属性所属的具体事件。
| 字段 | 类型 | 描述 |
|---|---|---|
| ab_test_name | String | 交易来源的 Adapty A/B 测试名称。 |
| ab_test_revision | Integer | 交易来源的 A/B 测试版本号。 |
| base_plan_id | String | Google Play 商店中的基础方案 ID 或 Stripe 中的价格 ID。 |
| cancellation_reason | String | 可能的取消原因: 出现在以下事件类型中: subscription_cancelled、subscription_refunded 和 trial_cancelled。 |
| cohort_name | String | 决定用户看到哪个付费墙的目标受众名称。 |
| consecutive_payments | Integer | 用户连续订阅的周期数(不含中断),包含当前周期。 |
| currency | String | 本地货币。 |
| developer_id | String | 交易来源的版位 ID。 |
| environment | String | 可能的值为 Sandbox 或 Production。 |
| event_datetime | ISO 8601 date | 事件的日期和时间,与事件根级别的值相同。 |
| original_purchase_date | ISO 8601 date | 对于续费订阅,原始购买是链中的第一笔交易,其 ID 称为原始交易 ID,用于关联续费链;后续交易均为其延伸。原始购买日期即该首笔交易的日期和时间。 |
| original_transaction_id | String | 对于续费订阅,这是关联续费链的原始交易 ID。原始交易是链中的第一笔;后续交易均为其延伸。 如果没有延伸交易, |
| paywall_name | String | 交易来源的付费墙名称。 |
| paywall_revision | String | 交易来源的付费墙版本号,默认值为 1。 |
| price_local | Float | 扣除 Apple/Google 分成前的本地货币产品价格。 |
| price_usd | Float | 扣除 Apple/Google 分成前的美元产品价格。 |
| profile_country | String | 由 Adapty 根据用户画像 IP 地址确定。 |
| profile_event_id | UUID | 唯一事件 ID,可用于去重。 |
| profile_has_access_level | Boolean | 布尔值,表示该用户画像是否拥有有效的访问等级。 |
| profile_id | UUID | Adapty 生成的用户画像 ID,与事件根级别的值相同。 |
| profile_ip_address | String | 用户画像 IP(可以是 IPv4 或 IPv6,优先使用 IPv4)。如果在应用设置中禁用了 Collect users’ IP addresses,则为 null。 |
| profile_total_revenue_usd | Float | 该用户画像的总收入(已扣除退款)。 |
| promotional_offer_id | String | 所使用的促销活动的 Adapty ID,在看板中创建优惠时由您设置。 |
| purchase_date | ISO 8601 date | 产品购买的日期和时间。 |
| rate_after_first_year | Boolean | 布尔值,表示该订阅在连续续费满一年后是否符合降低佣金率(通常为 15%)的条件。佣金率因项目资格和国家/地区而异。详情请参阅商店佣金与税费。 |
| store | String | 产品购买所在的商店。标准值:app_store、play_store、stripe、paddle。 如果您通过服务端 API 设置了自定义商店交易,则使用 store 参数中的值。 |
| store_country | String | 应用商店发送给我们的国家/地区信息。 |
| store_offer_category | String | 已应用的优惠类别。可能的值为 introductory、promotional、winback。 |
| store_offer_discount_type | String | 已应用的优惠类型。可能的值为 free_trial、pay_as_you_go 和 pay_up_front。 |
| subscription_expires_at | ISO 8601 date | 订阅的到期日期,通常为未来时间。 |
| transaction_id | String | 交易的唯一标识符。 |
| trial_duration | String | 试用期时长(天数),格式为” days”,例如”7 days”。仅出现在与试用相关的事件类型中:trial_started、trial_converted、trial_cancelled。 |
| variation_id | UUID | 发生购买的付费墙唯一 ID。 |
| vendor_product_id | String | Apple App Store、Google Play 商店或 Stripe 中的产品 ID。 如果访问权限不是通过真实商店交易授予的, |
额外的税费与收入事件属性
以下与税费和收入相关的事件属性是仅适用于特定事件类型的附加字段。也就是说,下列事件类型在包含大多数事件类型的事件属性的基础上,还会额外附带以下字段。
包含税费与收入事件属性的事件类型:
subscription_renewedsubscription_initial_purchase(也称为subscription_started,属于同一事件)subscription_refundednon_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 手续费后的产品价格,以 USD 计。 | | tax_amount_local | Float | 扣除的税费金额,以本地货币计。 | | tax_amount_usd | Float | 扣除的税费金额,以 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,
"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 事件是一种特殊的 Webhook 事件,仅在 Webhook 集成处于活跃状态且该事件类型已启用时才会生成。启用后,该事件将发送至配置的 Webhook,并显示在 Event Feed 中。若未启用,则不会创建该事件。
如果您已启用共享访问等级,则 access level updated 事件将发送至所有共享该访问等级的用户画像。
使用此事件来更新数据库中用户的访问等级、在后端授予或撤销高级功能,并保持跨设备或跨平台的访问同步。
| 属性 | 类型 | 描述 |
|---|---|---|
| ab_test_name | String | 交易来源的 A/B 测试名称。 |
| access_level_id | String | 访问等级的 ID。 |
| activated_at | ISO 8601 date | 访问权限最近一次激活的日期和时间。 |
| active_introductory_offer_type | String | 已应用的新用户优惠类型。可选值为 free_trial、pay_as_you_go 和 pay_up_front。 |
| active_promotional_offer_id | String | 促销活动的 ID,如 Adapty 看板产品部分所示。 |
| active_promotional_offer_type | String | 已应用的促销活动类型。可选值为 free_trial、pay_as_you_go 和 pay_up_front。 |
| base_plan_id | String | Google Play 商店中的基础方案 ID,或 Stripe 中的价格 ID。 |
| billing_issue_detected_at | ISO 8601 date | 发生计费问题的日期和时间。 |
| cancellation_reason | String | 取消原因,可选值:voluntarily_cancelled、billing_error、price_increase、product_was_not_available、refund、cancelled_by_developer、new_subscription_replace、upgraded、unknown、adapty_revoked。 |
| cohort_name | String | 用户画像所属目标受众的名称。 |
| currency | String | 本地货币(默认为 USD)。 |
| developer_id | String | 交易来源版位的 ID。 |
| environment | String | 可选值为 Sandbox 或 Production。 |
| event_datetime | ISO 8601 date | 事件的日期和时间。 |
| expires_at | ISO 8601 date | 访问权限到期的日期和时间。 |
| is_active | Boolean | 布尔值,表示访问等级是否处于激活状态。 |
| is_in_grace_period | Boolean | 布尔值,表示用户画像是否处于宽限期内。 |
| is_lifetime | Boolean | 布尔值,表示访问等级是否为永久授权。 |
| is_refund | Boolean | 布尔值,表示该交易是否为退款。 |
| original_purchase_date | ISO 8601 date | 对于自动续订订阅,原始购买是该链中的第一笔交易,其 ID 称为原始交易 ID,用于关联续订链;后续交易均为其延续。原始购买日期即为第一笔交易的日期和时间。 |
| original_transaction_id | String | 对于自动续订订阅,这是关联续订链的原始交易 ID。原始交易是链中的第一笔;后续交易均为其延续。 如果没有延续交易, |
| paywall_name | String | 交易来源付费墙的名称。 |
| paywall_revision | String | 交易来源付费墙的版本号。默认值为 1。 |
| profile_country | String | 由 Adapty 根据用户画像 IP 判断。 |
| profile_event_id | UUID | 唯一事件 ID,可用于去重。 |
| profile_has_access_level | Boolean | 布尔值,表示用户画像是否拥有有效的访问等级。 |
| profile_id | UUID | Adapty 内部用户画像 ID。 |
| profile_ip_address | String | 用户画像的 IP 地址(可为 IPv4 或 IPv6,优先使用 IPv4)。若在应用设置中禁用了 Collect users’ IP addresses,则为 null。 |
| profile_total_revenue_usd | Float | 用户画像的总收入,含退款。 |
| purchase_date | ISO 8601 date | 购买产品的日期和时间。 |
| renewed_at | ISO 8601 date | 访问权限将续订的日期和时间。 |
| starts_at | ISO 8601 date | 访问等级开始生效的日期和时间。 |
| store | String | 购买产品的商店。标准值:app_store、play_store、stripe、paddle。 如果你通过服务端 API 设置了自定义商店交易,则使用 store 参数中的值。 |
| store_country | String | 应用商店发送给 Adapty 的国家信息。 |
| subscription_expires_at | ISO 8601 date | 订阅的到期日期。 |
| transaction_id | String | 交易的唯一标识符。 |
| trial_duration | String | 试用期时长,以天为单位(例如:“7 days”)。 |
| variation_id | UUID | 实验变体的标识符,用于将购买归因到对应付费墙。 |
| vendor_product_id | String | 商店(Apple/Google/Stripe)中的产品 ID。 如果访问权限是在没有真实商店交易的情况下授予的, |
| will_renew | Boolean | 表示付费访问等级是否将自动续订。 |
请注意,此结构可能会随着时间推移而扩展——我们或我们合作的第三方可能会引入新的数据字段。请确保处理该结构的代码足够健壮,依赖特定字段而非整个结构。