Skip to main content
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.renewed means the fan’s access never lapsed and the subscription rolled straight into a new billing period. Read expires_at and current_period_start off this event. The money for the same cycle arrives on creator.payment.succeeded with billing_reason: "subscription_renewal".
  • creator.subscription.activated means 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.
Take 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

status is never "cancelled". A cancelled-but-still-active subscription reports status: "active" with cancel_at_period_end: true, and the fan keeps access until expires_at. Only deactivated reports expired. Gate access on expires_at and cancel_at_period_end, not on status alone.
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

The creator.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.
currentPeriodEnd minus currentPeriodStart is not the cycle, and neither is expires_at minus current_period_start on these events. The two dates come off different clocks. The end is the subscription’s stored expiry, while the start is the timestamp of the latest successful charge. A renewal that fails and only settles on a later retry moves the start without moving the plan. A signup charge that settles after it was quoted shortens the span to less than the months sold. Use intervalMonths, and read the dates only as when this period started and when it runs out.
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.