Skip to main content
Two events share the subscription resource and report access-state changes on subscriptions to your app’s pricing plans. Every event requires read:self. Each arrives in the envelope, and the table below describes data. Fanvue records a cancellation as cancel_at_period_end, not an immediate removal, so a buyer who cancels keeps access until the end of the paid period. The money and the access state are separate events. A subscription’s initial charge emits both app.payment.succeeded with billing_reason: "subscription_initial" and app.subscription.activated.
Neither event tells you when access ends. app.subscription.deactivated is a reserved name that is never emitted, and expires_at and created_at are null on both events. Read period end from GET /apps/{appUuid}/subscription-status when either event arrives; deriving access from these events alone leaves access open after the period ends.

Subscription resource

data.object is "subscription" for both events. Branch on cancel_at_period_end, not on status. status is "active" on both events, including the cancellation, because a cancelled subscription stays active until its period ends, so a consumer switching on status sees no change when a buyer cancels.

Examples

app.subscription.activated

app.subscription.cancel_at_period_end_changed

status stays "active" and the buyer keeps access until the period ends. plan.uuid is null on this event.

Reconciling

Subscription events report that something changed, not when the period ends. Use each event as the trigger to re-read GET /apps/{appUuid}/subscription-status, which returns the current period end. The event id hashes the subscription id and the topic, so the same transition repeated on one subscription reuses the id. See Repeated subscription state transitions.