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

# subscription.canceled

> Fired when a subscription is terminated, at period end or immediately. Revoke access here.

## Cancellation lifecycle

A regular cancellation is scheduled for the end of the current billing period. Two events fire at different moments:

| Moment | Event | status | What to do |
| - | - | - | - |
| Customer requests cancellation | `subscription.updated` | `active` | Show "ending on \{endDate}" in your UI. Do NOT revoke access. |
| Billing period ends | `subscription.canceled` | `canceled` | Revoke access. |

```
POST /subscriptions/{id}/cancel
  └→ subscription.updated  (status: "active", canceledAt: set, endDate: set)
       ... time passes until billing period ends ...
  └→ subscription.canceled (status: "canceled")
```

## Immediate terminations

Some terminations skip the schedule: `subscription.canceled` arrives right away, with no prior `subscription.updated`, and `endDate` is the moment of termination — not a billing period boundary.

* `POST /subscriptions/{id}/cancel` with `immediate: true`. Cancellations of free plans and of subscriptions in `pending_payment` or `past_due` also settle immediately — canceling inside the dunning grace window voids the unpaid renewal.
* Exhausted dunning retries: fires with `cancelReason: "dunning_exhausted"`, alongside `payment.retry_failed`.
* A trial without a payment method that ends without a card: fires with `cancelReason: "trial_ended_without_payment_method"`.

When the plan group has a default plan, exhausted dunning retries and a trial that ends without a card move the subscription to that plan instead, and `subscription.plan_changed` fires.

Refunding a payment does not cancel its subscription. If you want both outcomes, request a [cancellation](https://commet.co/docs/manage-subscriptions.md) separately. Older cancellation events triggered by refunds may have `cancelReason: "refund"`.


## OpenAPI

````yaml /openapi/en/webhooks/2026-08-27.json webhook subscription.canceled
openapi: 3.1.0
info:
  title: Commet Webhooks
  version: '2026-08-27'
  description: >-
    Outbound webhook events emitted by the Commet API. Each event is delivered
    as a signed POST to your configured endpoints.
servers: []
security: []
paths: {}

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.