pass_series.seats_exhausted
A capped season ticket sold its last seat.
When this fires
A purchase took the last seat on a series with a Seat Limit. The season is now sold out — its portal card reads Sold out, but a checkout already in flight is not blocked — the seat cap is only claimed once the payment lands, so a late buyer can pay, be given nothing, and be told to ask the organiser for a refund. Treat this event as the cue to stop promoting the season yourself.
Fires at the transition, once. An endpoint told this on every subsequent read would be told a fact rather than an event.
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": "pass_series.seats_exhausted",
"created_at": "2026-09-12T14:22:51Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
"plan_name": "Autumn Season Ticket",
"seat_cap": 50,
"seats_taken": 50,
"last_subscription_id": "5b7e2d40-1a86-4c39-97f2-e83d0b16c5a4"
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always pass_series.seats_exhausted for this event. |
created_at | ISO 8601 | 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 | The series plan that sold out. |
data.plan_name | string | Its name. |
data.seat_cap | integer | The limit that was reached. |
data.seats_taken | integer | Holders counted against it. |
data.last_subscription_id | string UUID | The purchase that took the final seat. |
Caveats
- Sold out is not permanent. A seat is released when a holder cancels or is refunded, and the series goes back on sale — at which point a later purchase can exhaust it again and emit this a second time. Treat it as a state change, not a terminal state.
- Only holders who actually hold the series consume a seat. A checkout that was started and abandoned, or a payment that never cleared, does not.
- A series with no Seat Limit never emits this at all.
- Raising the cap does not emit anything. If you are tracking availability, read
seats_remainingon the plan rather than inferring it from this event alone.
Related events
pass_series.purchased— every purchase, each carryingseats_remaining.plan.deactivated— the series coming off sale for good once its dates have run.- Pass series events overview — back to family overview.
How is this guide?