> ## Documentation Index
> Fetch the complete documentation index at: https://api.fanvue.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Subscription Cancelled Webhook

> Webhook event fired when a subscription is cancelled, before access ends.

<Warning>
  `subscription.cancelled` is deprecated. Use
  [`creator.subscription.cancel_at_period_end_changed`](/creator/subscriptions)
  instead. This event continues to fire during the migration window; new
  integrations should use the `creator.*` event.
</Warning>

## When this fires

Triggered (`subscription.cancelled`) when an active subscription is cancelled —
the subscriber turns off auto-renew, the creator blocks them, or moderation ends
the relationship. The subscriber usually keeps access until the end of the period
they already paid for; `accessEndsAt` tells you when that access stops.

Use this to react to churn the moment it is decided, instead of diffing
subscriber snapshots on a schedule.

<Note>
  Cancellation and expiry are distinct events. `subscription.cancelled` fires when
  a cancellation is **scheduled** (access typically continues until `accessEndsAt`).
  [`subscription.expired`](/webhooks/subscription-expired) fires when access
  actually **ends**. A typical lifecycle emits `subscription.cancelled` first, then
  `subscription.expired` when the paid period runs out.

  Requires the `read:creator` scope.
</Note>

## Payload

* `recipientUuid`: UUID of the creator who was subscribed to
* `subscriberUuid`: UUID of the fan whose subscription was cancelled
* `cancelReason`: Why it was cancelled. One of `subscriber_requested`, `creator_blocked`, `moderation`.
* `cancelledAt`: ISO 8601 time the cancellation was recorded
* `accessEndsAt`: ISO 8601 end of the already-paid period; access continues until then. Equals `cancelledAt` when access ends immediately (for example, free-trial cancellations). May be `null` if no paid period applies.
* `clientReferenceId`: The attribution reference captured on the original subscription purchase, echoed here so churn events carry the same attribution as the [`subscription.new`](/webhooks/new-subscriber) event. Omitted when the subscription was not attributed. See [Checkout Attribution](/checkout/attribution).
* `metadata`: The custom metadata captured on the original subscription purchase, echoed here. Omitted when none was set.
* `timestamp`: ISO 8601 time the event was emitted

## Example payload

```json theme={null}
{
  "recipientUuid": "f4b2a184-2b4a-4a04-9b70-3c0e0a1caa12",
  "subscriberUuid": "5939ae62-3eb5-4433-954f-f78c7b4282f3",
  "cancelReason": "subscriber_requested",
  "cancelledAt": "2026-05-20T08:39:33.139Z",
  "accessEndsAt": "2026-06-19T08:39:33.139Z",
  "clientReferenceId": "crm-contact-8821",
  "metadata": {
    "campaign": "spring-promo"
  },
  "timestamp": "2026-05-20T08:39:33.310Z"
}
```
