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.

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.

EventFires when
pass_series.purchasedA season ticket was bought and its whole slate issued.
pass_series.leg_completedOne date of a holder's season finished, with running attendance.
pass_series.completedA holder reached the last date, with final tallies.
pass_series.leg_addedA rule absorbed a new window into a live season.
pass_series.leg_substitutedA cancelled date was replaced and a holder moved.
pass_series.leg_droppedA cancelled date left a season, with the pro-rata figure.
pass_series.seats_exhaustedA capped season sold its last seat.
pass_series.presale_openedHolders were given first refusal on the next season.

Which scope each event is about

ScopeEventsAbility
The slate: the plan and its datesleg_added, seats_exhausted, presale_openedproject-subscription-plan:view
One holder: a purchase and a personpurchased, leg_completed, leg_substituted, leg_dropped, completedproject-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.

Building a season timetable elsewhere

The four events that keep an external calendar honest, in the order you need them:

  1. pass_series.purchased: create the entries. Read the plan's pass_series.windows for the full slate.
  2. pass_series.leg_added: add an entry. Seasons composed with rules grow after they sell.
  3. pass_series.leg_substituted: move an entry, using from_window_id and to_window_id.
  4. 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.

Example envelope

{
  "id": "evt_01HX...",
  "type": "pass_series.purchased",
  "created_at": "2026-09-01T11:03:44Z",
  "api_version": "2026-05-01",
  "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
  "data": {
    "subscription_id": "5b7e2d40-1a86-4c39-97f2-e83d0b16c5a4",
    "subscriber_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
    "plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
    "plan_name": "Autumn Season Ticket",
    "passes_total": 10,
    "passes_granted": 9,
    "passes_already_held": 1,
    "starts_at": "2026-09-20T13:00:00Z",
    "ends_at": "2026-11-29T22:00:00Z",
    "seat_cap": 50,
    "seats_remaining": 13
  }
}
  • 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, with reason: series_exhausted.
  • Pass Series guide: the feature itself, control by control.

Events

Compare with the current pages

How is this guide?

On this page

Subscriby is a product designed by you — for you.

No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request