plan.* events
Subscription plan lifecycle.
Fires on every change to a subscription plan's state or pricing. Consumers commonly use these to keep a pricing-page cache or a CRM field in sync.
Events
plan.created
Plan first created on a project.
plan.updated
Any mutable plan field changes.
plan.activated
Inactive plan flipped active.
plan.deactivated
Active plan flipped inactive.
plan.deleted
The plan is soft-deleted (row retained with `deleted_at` set; reads return 404).
plan.sync_completed
Plan synced to PSP catalog.
| Event | Fires when |
|---|---|
plan.created | A plan is first created on a project. |
plan.updated | Any mutable plan field changes (price, interval, trial, eligibility filters). |
plan.activated | An inactive plan is flipped to active. |
plan.deactivated | An active plan is flipped to inactive (still viewable, not purchasable). |
plan.deleted | The plan is soft-deleted (row retained with deleted_at set; reads return 404). |
plan.sync_completed | A plan is synced to the external PSP catalog (Stripe, PayPal, CoinPayments, Razorpay). |
See the dedicated pages above for full payload, field reference, and caveats per event.
Example payload
{
"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's omitted. Each from is the plan's previous value after model casting — price is a string, an enum column is its backed string value — while each to is the caller-supplied value exactly as validated.
Required abilities
Tokens subscribing to plan.* events must carry project-subscription-plan:view at mint time.
How is this guide?