plan.* events
Fires on every change to a plan's state, pricing or storefront position.
Fires on every change to a plan's state, pricing or storefront position. Consumers commonly use these to keep a pricing-page cache or a CRM field in sync.
Background
Example envelope
{
"id": "evt_01HX...",
"type": "plan.updated",
"created_at": "2026-05-18T10:05:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"plan": {
"id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
"name": "Premium Monthly",
"price": "29.0000",
"currency_id": "8f27a0d4-63be-4915-8c07-1a5d9e34b628",
"billing_cycle": "month",
"active": true
},
"changes": {
"price": { "from": "25.0000", "to": "29.00" }
}
}
}The data.changes block is present on plan.updated and identifies the fields that changed. For other events it is omitted. Each from is the plan's previous value after model casting, so price is a string and an enum column is its backed string value, while each to is the caller-supplied value exactly as validated.
Required ability
Tokens subscribing to plan.* events must carry project-subscription-plan:view at mint time.
Events
plan.createdA plan is first created on a project.plan.updatedAny mutable plan field changes.plan.activatedInactive plan flipped active.plan.deactivatedActive plan flipped inactive.plan.sold_outA plan hit its sales cap, or a pass series filled its last seat, and Subscriby paused it automatically.plan.order_changedThe creator arranged the order plans appear in on the portal and in the bot, or reset it.plan.deletedPlan soft-deleted (removed from the catalog).plan.sync_completedPlan synced to the payment-provider catalog (Stripe, PayPal, CoinPayments or Razorpay).How is this guide?
Last updated on