plan.deleted
Plan soft-deleted (removed from the catalog).
This is the final event you will receive for the given plan_id.
When this fires
The plan is removed from the project. It is soft-deleted — the row is retained with deleted_at set, so subscription rows that reference it are untouched and continue to honor their existing term. Only deletions made through the REST API (DELETE /api/v1/projects/{project}/plans/{plan}) emit this event; deleting a plan from the creator dashboard does not.
Required ability
project-subscription-plan:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "plan.deleted",
"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.00",
"currency_id": "8f27a0d4-63be-4915-8c07-1a5d9e34b628",
"billing_cycle": "month",
"active": true
}
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always plan.deleted for this event. |
created_at | ISO 8601 timestamp | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | string UUID | Project this event belongs to. |
data.plan.id | string UUID | Plan identifier. |
data.plan.name | string | Display name. |
data.plan.price | string | Decimal amount as a string, e.g. "29.00". |
data.plan.currency_id | string UUID | Currency row id — not an ISO 4217 code. |
data.plan.billing_cycle | enum: day | week | month | year | lifetime | Billing cadence unit. |
data.plan.active | boolean | Last-known active flag before deletion. |
Caveats
- Reads of the plan after this event return
404. Existing subscriptions continue to reference the plan id internally. - Deleting a plan makes no call to the payment providers. Catalog entries previously created by the plan sync (Stripe prices, PayPal plans, and so on) remain active at the provider and must be archived there manually.
Related events
plan.deactivated— typical predecessor.plan.created— first event in the lifecycle.- Plan events overview — back to family overview.
How is this guide?