CommetCommet
GitHubDiscordStatus
Introduction

Subscription Events

subscription.createdsubscription.activatedsubscription.reactivatedsubscription.pause_scheduledsubscription.pause_updatedsubscription.pause_revokedsubscription.pausedsubscription.resumedsubscription.resume_failedsubscription.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

Plan Grant Events

plan_grant.createdplan_grant.updatedplan_grant.expiredplan_grant.revoked

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

plan_grant.updated

A plan grant duration changed.

Payload

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

idstring

The public plan grant ID.

customerIdstring

The public customer ID.

subscriptionIdstring

The public subscription ID.

basePlanIdstring

The public ID of the subscribed base plan.

targetPlanIdstring

The public ID of the plan whose access was granted.

targetPlanReleaseIdstring

The public ID of the immutable target plan release.

status"active" | "expired" | "revoked"

The plan grant status at this transition.

duration"cycles" | "until_date" | "until_revoked"

How the plan grant duration is defined at this transition.

durationCyclesinteger | null

The cycle count when duration is cycles.

startsAtstring

When the plan grant started.

expiresAtstring | null

The effective expiration deadline, if any.

reasonstring

The reason recorded for this transition.

source"dashboard" | "api" | "system"

Where this transition originated.

revokedAtstring | null

When the plan grant was revoked, otherwise null.

createdAtstring

When the plan grant was created.

updatedAtstring

When the represented transition occurred.

eventsWebhookPlanGrantTimelineEvent[]

The grant timeline through the represented transition.

{
  "event": "plan_grant.updated",
  "timestamp": "2026-06-23T14:30:00.000Z",
  "organizationId": "8f14e45f-ceea-4e7a-9c3d-1c2b3a4d5e6f",
  "mode": "live",
  "apiVersion": "2026-08-27",
  "data": {
    "id": "pgr_1a2b3c4d",
    "customerId": "user_123",
    "subscriptionId": "sub_1a2b3c4d",
    "basePlanId": "pln_starter",
    "targetPlanId": "pln_pro",
    "targetPlanReleaseId": "plr_1a2b3c4d",
    "status": "active",
    "duration": "until_date",
    "durationCycles": null,
    "startsAt": "2026-08-01T00:00:00.000Z",
    "expiresAt": "2026-11-15T00:00:00.000Z",
    "reason": "Extended evaluation",
    "source": "dashboard",
    "revokedAt": null,
    "createdAt": "2026-08-01T00:00:00.000Z",
    "updatedAt": "2026-08-15T12:00:00.000Z",
    "events": [
      {
        "id": "gre_1a2b3c4d",
        "type": "created",
        "reason": "Two-month product evaluation",
        "source": "api",
        "previousExpiresAt": null,
        "expiresAt": "2026-10-01T00:00:00.000Z",
        "duration": "cycles",
        "durationCycles": 2,
        "requestedExpiresAt": null,
        "createdAt": "2026-08-01T00:00:00.000Z"
      },
      {
        "id": "gre_5e6f7g8h",
        "type": "updated",
        "reason": "Extended evaluation",
        "source": "dashboard",
        "previousExpiresAt": "2026-10-01T00:00:00.000Z",
        "expiresAt": "2026-11-15T00:00:00.000Z",
        "duration": "until_date",
        "durationCycles": null,
        "requestedExpiresAt": "2026-11-15T00:00:00.000Z",
        "createdAt": "2026-08-15T12:00:00.000Z"
      }
    ]
  }
}

When this fires

After an active Plan Grant's duration or deadline is committed. The payload is the grant at that update, and its last timeline event is updated.

This event does not fire for any other field change.

How is this guide?

plan_grant.created

A plan grant was created.

plan_grant.expired

A plan grant expired.