creator.subscription.* events track the lifecycle of a fan’s profile subscription to a creator, separately from the money, which arrives on creator.payment.succeeded.
All four require the
read:creator scope. Each event arrives in the envelope, and the tables below describe data.
A typical churn sequence is cancel_at_period_end_changed (auto-renew off, access continues) followed by deactivated when the paid period runs out. A failed renewal can deactivate a subscription with no prior cancel_at_period_end_changed.
The four events replace these legacy events:
activated vs renewed
Both report a subscription that is active and set to renew. They differ in what happened.creator.subscription.renewedmeans the fan’s access never lapsed and the subscription rolled straight into a new billing period. Readexpires_atandcurrent_period_startoff this event. The money for the same cycle arrives oncreator.payment.succeededwithbilling_reason: "subscription_renewal".creator.subscription.activatedmeans access is being granted where there was none. That covers a new subscriber, a lapsed fan re-subscribing, or a renewal that only succeeded after the subscription had already been deactivated.
renewed if you cache expires_at. Without it a cached period goes stale every cycle, because the payment event carries the money but no new dates.
Subscription resource
price is the signup price, not the amount charged. A discount or free trial makes the charged amount differ. A creator who changes their subscription price bills the new price on renewal, and Fanvue doesn’t rewrite this value. For the amount actually taken, read gross on the correlated creator.payment.succeeded.
Use current_period_start, not created_at, for “since when is this fan on their current period”. created_at is the first-ever subscription date and never advances, so it reports a stale period for any returning subscriber. current_period_start falls back to created_at for a fan with no paid charge yet, for example one still inside a free trial.
cancel_at_period_end is false on a deactivated subscription that ran out. The field reports the auto-renew flag at the moment of deactivation, not whether the fan had cancelled earlier. To tell voluntary churn from a failed renewal, look for the preceding cancel_at_period_end_changed or read deactivation_reason.
Tracking
tracking travels on every creator.subscription.* event and carries the subscriber’s tracking-link attribution as { link_url, metadata }. The block is null when the subscriber carries neither a tracking parameter nor an impression on one of this creator’s links.
The lookup is best-effort. A failed lookup sends
tracking: null rather than dropping the event, so null means “none recorded or not resolved”.
Correlating with the money
Native profile subscriptions have no external UUID, so the identity is the(purchaser, creator) pair. id is a correlation token, the subscription’s initial-payment invoice number, carried on activated and renewed. subscription.id here equals payment.subscription.id on creator.payment.succeeded, so you can join the access event to the money event. The token is null on deactivated and cancel_at_period_end_changed, so key your own records on the (purchaser, creator) pair rather than on id.
Examples
creator.subscription.activated
creator.subscription.renewed
The same shape, with the billing period rolled forward. created_at is unchanged because it is the first-ever subscription date.
creator.subscription.deactivated
Access has ended, so renew_date and renew_price are null and id is not carried.
creator.subscription.cancel_at_period_end_changed
Auto-renew has been turned off. status stays active and the fan keeps access until expires_at, while renew_date and renew_price go null because no charge will occur. Turning auto-renew back on emits the same event with cancel_at_period_end: false, auto_renew: true, and the renewal fields repopulated.
Billing cycle length
Thecreator.subscription.* payloads don’t carry the billing cycle length, so read it off subscription.intervalMonths on GET /subscribers, GET /subscribers/{userUuid}, and GET /creators/{creatorUserUuid}/subscribers. intervalMonths is the cycle length of the fan’s current period, in whole months. The value is 1 for a standard monthly subscription, or 3, 6 or 12 for a fan who signed up on a multi-month bundle.
A bundle buys a longer first period only. Once it renews, the subscription bills monthly at the creator’s current price, and intervalMonths reports 1 from then on. That is the real billing behaviour, not a rounding of the original plan.
intervalMonths is null where there is no whole-month cycle to report. That happens for a fan inside a free trial, whose period is a trial length in days rather than a billing cycle, and for a fan with no subscription charge on record.