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
Plan row hard-deleted.
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 row is hard-deleted. |
plan.sync_completed | A plan is synced to the external PSP catalog (Stripe, PayPal, Razorpay, Paystack). |
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": "prj_01HX...",
"data": {
"plan": {
"id": "pln_01HX...",
"name": "Premium Monthly",
"price": 29.0,
"currency": "USD",
"billing_cycle": "monthly",
"trial_days": 7,
"active": true
},
"changes": {
"price": { "from": 25.0, "to": 29.0 }
}
}
}The data.changes block is present on plan.updated and identifies the fields that changed. For other events it's omitted.
Required abilities
Tokens subscribing to plan.* events must carry project-subscription-plan:view-any at mint time.
How is this guide?