事件流程

一个操作往往会触发多个事件。例如,首次购买会同时发送 Subscription startedAccess level updated。下方的示意图展示了当用户订阅、取消或重新激活时,Adapty 会发送哪些事件以及发送顺序。

如何读懂图表

  • 时间差。 Apple 会在订阅开始或续期前数小时扣款。在图中标出这段时间差,会给每张图多增加一个步骤,却不影响你实际收到的事件,因此图中将扣款和开始时间合并在一起展示。
  • 顺序。 同一操作触发的事件会在同一时刻到达。图中必须按某种顺序绘制,但你的事件流中的排列顺序可能有所不同,两者都没有对错之分。
  • 覆盖范围。 商店通知会触发图中展示的每一个事件。合成事件不会出现:Adapty 通过定时器发送它们,不同集成的延迟各不相同,因此它们在时序图中没有固定位置。

订阅生命周期

初次购买流程

当用户首次购买订阅且没有试用期时,会触发以下事件:

  • Subscription started
  • Access level updated:授予用户访问权限

当订阅到达续期日期时,订阅将自动续期,并触发以下事件:

  • Subscription renewal:开始新一个订阅周期
  • Access level updated:更新订阅到期日期,将访问权限延长至下一个周期

支付未成功或用户取消续订的情况,分别在账单问题结果流程订阅取消流程中说明。

Initial Purchase Flow diagram

订阅取消流程

当用户取消订阅时,系统会创建以下事件:

  • Subscription renewal canceled:表示订阅在当前周期结束前仍保持有效,之后用户将失去访问权限
  • Access level updated:用于禁用该访问等级的自动续订

订阅结束后,系统将触发 Subscription expired (churned) 事件,标记订阅的终止。

Subscription Cancellation Flow diagram

如果退款申请获批,以下事件将替代 Subscription expired (churned)

  • Subscription refunded:用于终止订阅并提供退款详情
Subscription Cancellation Flow with a Refund diagram

对于 Stripe,订阅可以立即取消,跳过剩余有效期。在这种情况下,以下事件会同时生成:

  • Subscription renewal cancelled
  • Subscription expired (churned)
  • Access Level updated:用于移除用户的访问等级

如果退款申请通过,系统还会在批准时触发 Subscription refunded 事件。

Subscription Immediate Cancellation Flow diagram

订阅重新激活流程

如果用户取消订阅后,订阅到期,之后又重新购买了同一订阅,系统将创建一个 Subscription renewed 事件。即使中间存在访问中断,Adapty 也会通过 vendor_original_transaction_id 将其视为同一交易链,因此此次重购被视为续订。

Access level updated 事件将被创建两次:

  • 在订阅结束时,撤销用户的访问权限
  • 在订阅重新购买时,授予访问权限
订阅重新加入流程图

订阅暂停流程(仅限 Android)

此流程适用于用户在 Android 上暂停并随后恢复订阅的情况。

暂停订阅会产生延迟效果。如果用户在订阅续期前将其暂停,订阅仍保持有效,用户在当前计费周期剩余时间内继续享有付费访问权限。

  1. 当用户暂停订阅时,会触发 Subscription paused (Android only) 事件。

  2. 订阅周期结束时,Adapty 会触发 Access level updated 事件以撤销用户的访问权限。

  3. 当用户恢复订阅时,将触发以下事件:

    • Subscription renewed
    • Access level updated(用于恢复用户的访问权限)

这些订阅将属于同一交易链,并通过相同的 vendor_original_transaction_id 关联。

订阅暂停流程图

试用流程

如果您在应用中使用试用功能,您将收到额外的试用相关事件。

试用期成功转化流程

当用户开始试用、绑定信用卡,并在试用期结束后成功转化为标准订阅时,就会触发此流程。在试用开始时,系统会创建以下事件:

  • Trial started:标记试用开始
  • Access level updated:授予访问等级

当标准订阅正式开始时,系统会创建 Trial converted 事件。

Trial Flow with Successful Conversion diagram

试用期取消转化流程

如果用户在试用期转为订阅之前取消,系统将在取消时生成以下事件:

  • Trial renewal cancelled:禁止试用期自动转为订阅
  • Access level updated:禁止续订访问权限

用户在试用期结束前仍可正常使用,届时系统会生成 Trial expired 事件,标记试用期结束。

Trial Flow without Successful Conversion diagram

试用期到期后重新激活订阅的流程

如果试用期因账单问题或取消而到期,用户后续购买订阅时,系统将创建以下事件:

  • 访问等级已更新,为用户授予访问权限
  • 试用已转化

即使试用期与订阅之间存在时间间隔,Adapty 也会通过 vendor_original_transaction_id 将两者关联起来。此次转化被视为一条连续交易链的一部分,该链从零价格的试用期开始。这就是系统创建 试用已转化 事件而非 订阅已开始 事件的原因。

试用期到期后的订阅重新激活流程图

产品变更

本节涵盖对活跃订阅所做的各类调整,例如升级、降级,或购买其他组合中的产品。

立即生效的产品变更流程

用户变更产品后,系统可以在订阅结束前立即完成切换(通常发生在升级或替换产品的情况下)。此时,在产品变更的瞬间:

  • 访问等级发生变更,系统创建两个 Access level updated 事件:
    1. 撤销第一个产品的访问权限。
    2. 授予第二个产品的访问权限。
  • 旧订阅结束,并退款(系统创建 Subscription refunded 事件,cancellation_reason = upgraded)。请注意,此时不会创建 Subscription expired (churned) 事件;Subscription refunded 事件将替代它。
  • 新订阅开始(系统为新产品创建 Subscription started 事件)。
Immediate Product Change Flow Upgrade diagram

如果用户降级订阅,第一个订阅将持续到已付费周期结束,订阅到期后将被新的低级别订阅替换。在这种情况下,系统会立即创建 Access level updated 事件以禁用访问自动续订。所有其他事件将在订阅实际替换时创建:

  • 系统创建另一个 Access level updated 事件,授予第二个产品的访问权限。
  • 系统创建 Subscription expired (churned) 事件,结束第一个产品的订阅。
  • 系统创建 Subscription started 事件,为新产品开启新订阅。
Delayed Product Change Downgrade diagram

延迟产品变更流程

还有一种情况:用户在订阅续费时更改产品。这种情况与前一种非常相似:系统会立即创建一个 Access level updated 事件,以禁用旧产品的访问等级自动续费。所有其他事件将在用户更改订阅且变更生效于系统时创建:

  • 另一个 Access level updated 事件被创建,以授予第二个产品的访问权限。
  • Subscription expired (churned) 事件被创建,以结束第一个产品的订阅。
  • Subscription started 事件被创建,以启动新产品的新订阅。
Product Change on Renewal Flow diagram

账单问题结果流程

如果试用转换或订阅续费因账单问题失败,后续流程取决于是否启用了宽限期。

启用宽限期时,若付款成功,试用将完成转换或订阅将完成续费。若付款失败,应用商店会继续尝试向用户收取订阅费用,如仍失败,则应用商店将自行终止试用或订阅。

因此,在账单问题发生时,Adapty 中会创建以下事件:

  • 检测到账单问题
  • 已进入宽限期(如果已启用宽限期)
  • 访问等级已更新,将访问权限延续至宽限期结束

如果后续付款成功,Adapty 会记录 Trial convertedSubscription renewed 事件,用户不会失去访问权限。

如果付款最终失败且应用商店取消了订阅,Adapty 将生成以下事件:

  • Trial expiredSubscription expired (churned),附带 cancellation_reason: billing_error
  • 访问等级已更新,撤销用户的访问权限
Billing Issue Outcome Flow with Grace Period diagram

如果没有宽限期,账单重试期(应用商店持续尝试向用户收费的时段)将立即开始。

如果在宽限期结束前付款始终未能成功,后续流程与此相同:当应用商店自动终止订阅时,会生成相同的事件:

  • Trial expiredSubscription expired (churned) 事件,cancellation_reasonbilling_error

  • Access level updated(更新访问等级)以撤销用户访问权限

Billing Issue Outcome Flow without Grace Period diagram

跨用户账户共享购买的流程

当一个 Customer User ID 尝试恢复或续期已绑定到另一个 Customer User ID 的订阅时,Adapty 的 Sharing paid access between user accounts 设置将决定如何管理访问权限。具体流程会因所选选项而有所不同。

Note

对于 Apple 家庭共享交易(in_app_ownership_type=FAMILY_SHARED),只会触发 Access level updated 事件——下方各产品的订阅事件不会触发。完整的事件矩阵请参阅 Apple 家庭共享

Note

如果用户点击 Restore Purchases 时,当前用户画像已拥有访问权限,则此次恢复操作无效,不会触发任何 Webhook 事件。本节中的事件仅在访问权限实际在用户画像之间转移时才会触发。

要快速了解第二个用户画像领取现有订阅时会触发哪些事件,请参阅下方矩阵。后续各节将展示每种流程的完整 JSON 载荷。

事件已启用(默认)将访问等级转移至新用户已禁用
新用户画像:Access level updatedis_active=true触发触发不触发
旧用户画像:Access level updatedis_active=false不触发——两个用户画像均保留访问等级当新识别设备传播交易时触发不触发——原始用户画像保留访问等级
新事件中的 profiles_sharing_access_level 字段列出共享该访问等级的其他用户画像null不适用——不触发任何事件

已转移订阅的续订、退款和到期事件,将继续在当前持有该访问等级的用户画像上触发 subscription_renewedsubscription_refundedsubscription_expired 事件。转移事件本身不会触发 subscription_started 事件,因为没有记录新的交易——只有归因关系发生了变化。

有关各模式的详细约定,请参阅实用参考

将访问等级转移给新用户的流程

推荐的方案是将访问等级转移给新用户。这样可以保留原始用户的交易历史,确保分析数据的一致性。整个过程只会生成 2 个 Access level updated 事件:

  1. 移除第一个用户的访问权限
  2. 为第二个用户授予访问权限
Transfer Access to New User Flow diagram

以下是该场景下生成的事件中,与访问等级分配和转移相关的字段说明:

  • 用户 A:访问等级更新(当用户 A 在应用内购买订阅时发送)

    {
      "profile_id": "00000000-0000-0000-0000-000000000000",
      "customer_user_id": UserA,
      "event_properties": {
        "profile_has_access_level": true,
      },
      "profiles_sharing_access_level": null
    }
  • 用户 A:访问等级更新(当应用重新安装且用户 B 登录,撤销用户 A 的访问权限时发送)

  {
    "profile_id": "00000000-0000-0000-0000-000000000000",
    "customer_user_id": UserA,
    "event_properties": {
      "profile_has_access_level": false,
    },
    "profiles_sharing_access_level": null
  }
  • 用户 B:访问等级已更新(在用户 B 登录并获得访问权限时发送)

    {
      "profile_id": "00000000-0000-0000-0000-000000000001",
      "customer_user_id": UserB,
      "event_properties": {
        "profile_has_access_level": true,
      },
      "profiles_sharing_access_level": null
    }

用户间共享访问流程

此选项允许多个用户共享同一访问等级,前提是他们的设备登录了相同的 Apple/Google ID。当用户重新安装应用并使用不同的邮箱登录时,仍可访问之前的购买内容,此选项非常适合这种场景。启用此选项后,多个已识别用户可以共享同一访问等级。在共享访问等级期间,所有交易记录均归属于原始 Customer User ID ,以确保完整的交易历史记录和分析数据。

因此,只会创建 1 个事件:Access level updated,用于向第二个用户授予访问权限。

Share Access Between Users Flow diagram

以下是本场景中生成的事件里,与访问等级分配和共享相关字段的详细说明:

用户 B:Access level updated(当用户 B 登录并获得访问权限时发送)

{
  "profile_id": "00000000-0000-0000-0000-000000000000",
  "customer_user_id": UserA,
  "event_properties": {
    "profile_has_access_level": true,
  },
  "profiles_sharing_access_level": [
    {
      "profile_id": "00000000-0000-0000-0000-000000000001,
      "customer_user_id": UserB
    }
  ]
}

用户之间访问权限不共享的流程

使用此选项时,只有第一个获得该访问等级的用户画像能永久保留它。如果购买需要绑定到唯一的 Customer User ID ,这是最理想的选择。

用户间共享访问等级禁用流程图