Skip to main content
Two events share the subscription resource. They are delivered in the Standard-Webhooks envelope; the fields below describe the data object. Every event requires the read:self scope. Fanvue models cancellation as cancel_at_period_end, not an immediate removal: 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.
These two events do not tell you when access ends. app.subscription.deactivated is a reserved name that is not emitted, and neither of the events below carries a date: expires_at and created_at are always null today, because Fanvue’s billing source does not supply them to the webhook. Treat these events as a signal to re-read live state from the App Subscriptions endpoints, they are the only place the period dates exist.

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, a cancelled subscription is still active until its period ends. A consumer switching on status sees no change at all when a buyer cancels.

Examples

app.subscription.activated

app.subscription.cancel_at_period_end_changed

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

Reconciling

These events tell you that something changed, not when the period ends. app.subscription.deactivated is not emitted, expires_at and created_at are always null, and webhooks can be missed or delayed. Read live subscription state from the App Subscriptions endpoints rather than deriving it from events alone. Use the event as the trigger to re-read.