pass_series.* events
Season-ticket lifecycle — bought, each date completing, dates added or dropped mid-season, and the holders-only presale on the next one.
Fires across the life of a Pass Series — a season ticket sold once that grants a whole slate of other pass plans' dated windows.
The family exists because a series is not just a pass with more dates. A season grows when
rules absorb new windows, changes when a date is cancelled, and progresses as each date
runs — and none of that has an equivalent on a single-window pass. The pass.* family still
fires for every underlying window, because each date is a real window on a real plan; these
describe the slate.
Two payload facts integrators get wrong
refund_per_holder on
pass_series.leg_dropped is a
figure, not an action. Subscriby never moves the money — the creator does. An
automation that treats it as "already refunded" will double-refund.
pass_series.purchased fires in
addition to
subscription.activated, because a
series is a subscription row. An endpoint subscribed to both gets two
deliveries for one purchase and must de-duplicate on subscription_id.
Which scope each event is about
| Scope | Events | Ability |
|---|---|---|
| The slate — the plan and its dates | leg_added, seats_exhausted, presale_opened | project-subscription-plan:view |
| One holder — a purchase and a person | purchased, leg_completed, leg_substituted, leg_dropped, completed | project-subscription:view |
The split mirrors the pass.* family, where window_* events describe the window and
holder_* events describe a person. Subscribe to the scope you actually act on.
Events
pass_series.purchased
A season ticket was bought and its whole slate issued.
pass_series.leg_completed
One date of a holder's season finished, with running attendance.
pass_series.completed
A holder reached the last date, with final tallies.
pass_series.leg_added
A rule absorbed a new window into a live season.
pass_series.leg_substituted
A cancelled date was replaced and a holder moved.
pass_series.leg_dropped
A cancelled date left a season, with the pro-rata figure.
pass_series.seats_exhausted
A capped season sold its last seat.
pass_series.presale_opened
Holders were given first refusal on the next season.
Building a season timetable elsewhere
The four events that keep an external calendar honest, in the order you need them:
pass_series.purchased— create the entries. Read the plan'spass_series.windowsfor the full slate.pass_series.leg_added— add an entry. Seasons composed with rules grow after they sell.pass_series.leg_substituted— move an entry, usingfrom_window_idandto_window_id.pass_series.leg_dropped— remove an entry.
Subscribers get this for free: the portal offers a calendar feed that stays in step on its own. The events are for putting the same schedule somewhere Subscriby cannot reach.
Related
pass.*events — the underlying windows opening, closing and being cancelled. Every series date is one of these too.plan.deactivated— a finished season taking itself off sale, withreason: series_exhausted.- Pass Series guide — the feature itself, control by control.
How is this guide?