Commet
  • Pricing
Log InTry out
Introduction

Subscription Events

subscription.createdsubscription.activatedsubscription.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.refundedpayment.disputedpayment.dispute_resolved

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
DocumentationKnowledge BaseBuild with AIAPI ReferenceWebhooks

subscription.plan_change_scheduled

Fired when a downgrade or interval change is scheduled for the end of the billing period.

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

Current status — the subscription stays usable.

currentPlanobject

The plan currently in effect (id and name).

scheduledPlanobject

The plan that takes effect at effectiveAt (id and name).

billingIntervalstring | null

The current billing interval.

scheduledBillingIntervalstring | null

The new billing interval, if the change includes one. Null when only the plan changes.

effectiveAtstring

ISO 8601 datetime when the change executes (the billing period end).

{
  "event": "subscription.plan_change_scheduled",
  "timestamp": "2026-04-15T12:00:00.000Z",
  "organizationId": "org_abc123",
  "mode": "live",
  "apiVersion": "2026-05-25",
  "data": {
    "subscriptionId": "sub_1a2b3c4d",
    "customerId": "user_123",
    "status": "active",
    "currentPlan": {
      "id": "plan_pro",
      "name": "Pro"
    },
    "scheduledPlan": {
      "id": "plan_starter",
      "name": "Starter"
    },
    "billingInterval": "monthly",
    "scheduledBillingInterval": null,
    "effectiveAt": "2026-04-25T00:00:00.000Z"
  }
}

Scheduled plan change lifecycle

Commet is fair by default: changes that benefit the customer (upgrades) apply immediately, changes that reduce what they get (downgrades, shorter intervals) apply at the end of the period they already paid for.

MomentEventWhat to do
Downgrade requestedsubscription.plan_change_scheduledShow "changing to {scheduledPlan.name} on {effectiveAt}". Keep current plan access.
A different change replaces itsubscription.plan_change_revoked + subscription.plan_change_scheduledUpdate the notice to the new target plan.
Billing period endssubscription.plan_changedApply the new plan's entitlements.

Immediate upgrades skip this event entirely — they fire subscription.plan_changed right away.

How is this guide?

subscription.cancellation_revoked

Fired when a scheduled cancellation is reverted before it executes. The subscription continues normally.

subscription.plan_change_revoked

Fired when a scheduled plan change is replaced before it executes.