• Pricing
  • Blog
Log inBook a demo
Introduction

Subscription Events

subscription.createdsubscription.activatedsubscription.reactivatedsubscription.canceledsubscription.updatedsubscription.plan_changedsubscription.cancellation_scheduledsubscription.cancellation_revokedsubscription.plan_change_scheduledsubscription.plan_change_revokedsubscription.past_due

Trial Events

trial.startedtrial.convertedtrial.expiredtrial.will_endtrial.checkout_ready

Checkout Events

checkout.ready

Payment Events

payment.receivedpayment.failedpayment.recoveredpayment.retry_failedpayment.refundedpayment.disputedpayment.dispute_resolved

Payment Link Events

payment_link.createdpayment_link.completedpayment_link.failedpayment_link.canceled

Invoice Events

invoice.createdinvoice.upcominginvoice.overdueinvoice.voided

Payment Method Events

payment_method.attachedpayment_method.updated

Customer Events

customer.createdcustomer.updatedcustomer.state_changed

Credits & Balance Events

credits.grantedcredits.purchasedcredits.lowcredits.depletedcredits.expiredbalance.topped_upbalance.lowbalance.depleted

Quota & Usage Events

quota.threshold_reachedquota.exceededusage.recorded

Seat Events

seats.updatedseats.limit_reached

Add-on Events

addon.activatedaddon.deactivated

Payout Events

payout.availablepayout.createdpayout.paidpayout.failed
System status
DocumentationKnowledge BaseBuild with AIAPI ReferenceWebhooks

subscription.canceled

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

Payload

All webhook payloads follow a consistent top-level structure with event-specific data nested within the data object.

subscriptionIdstring

The subscription ID.

customerIdstring

The customer ID. Returns your externalId if you provided one when creating the customer, otherwise returns the Commet publicId.

statusstring

Always "canceled" for this event. Revoke access when you receive this.

canceledAtstringoptional

ISO 8601 datetime when the cancellation was requested or triggered.

cancelReasonstring | null

The reason for cancellation, if provided. Set by Commet on system-initiated terminations: "refund" (full refund of a subscription invoice) or "dunning_exhausted" (all payment retries failed).

endDatestringoptional

ISO 8601 datetime when the subscription ended. Matches the billing period end for scheduled cancellations; for immediate terminations it is the moment of termination.

{
  "event": "subscription.canceled",
  "timestamp": "2026-06-23T14:30:00.000Z",
  "organizationId": "8f14e45f-ceea-4e7a-9c3d-1c2b3a4d5e6f",
  "mode": "live",
  "apiVersion": "2026-07-31",
  "data": {
    "subscriptionId": "sub_1a2b3c4d",
    "customerId": "user_123",
    "status": "canceled",
    "canceledAt": "2026-04-20T10:15:00.000Z",
    "cancelReason": "Too expensive",
    "endDate": "2026-04-25T00:00:00.000Z"
  }
}

Cancellation lifecycle

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

MomentEventstatusWhat to do
Customer requests cancellationsubscription.updatedactiveShow "ending on {endDate}" in your UI. Do NOT revoke access.
Billing period endssubscription.canceledcanceledRevoke 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.
  • A full refund of a subscription invoice: fires with cancelReason: "refund", alongside payment.refunded.
  • Exhausted dunning retries: fires with cancelReason: "dunning_exhausted", alongside payment.retry_failed.

How is this guide?

subscription.reactivated

Fired when a canceled subscription is reactivated and its reactivation charge succeeds.

subscription.updated

Fired when subscription details change, including when a cancellation is scheduled.