pass.holder_moved
A pass holder was moved from a cancelled access window to the next available one on the same plan.
When this fires
One holder of a cancelled access window was moved onto another date. Fires once per resettled holder of an ordinary pass, alongside the single pass.window_cancelled for the window itself. A season-ticket holder's move emits pass_series.leg_substituted instead; the two are mutually exclusive.
The replacement is the soonest window on the same plan that is still on sale, has not started yet, and that this customer does not already hold a pass for. If the schedule has nothing future left, a window already in progress is used rather than stranding them. Every window on a plan sells for the same price, which is what makes the move an even swap rather than a substitution.
They are not charged again. If the cancelled window had not opened yet, their existing invite links stay valid for the replacement date; if they had already been admitted to a live window, that access and those links are revoked immediately and fresh links are sent when the replacement window opens.
Caveats
- Timestamps are UTC; convert to the plan's schedule timezone before showing them.
was_queuedis the field worth branching on. A queued holder keeps their place and is admitted automatically on the new date; an unqueued one still has to tap their link, and is sent it again as a button.- Nobody is moved onto a date they already hold. A customer with passes for two consecutive windows skips to the one after.
- The move is written quietly, so no
subscription.*event accompanies it. This event is the only signal. - Holders who were paused, past due, or had cancelled their own pass are not moved and emit nothing at all.
Related events
pass.window_cancelled: the window-level event, fired once.pass.holder_stranded: the other outcome, when no window was available.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Request Body
application/json
The signed JSON envelope posted to your endpoint.
TypeScript Definitions
Use the request body type in TypeScript.
The envelope every event is delivered in.
Response Body
Example Requests
/pass.holder_movedHow is this guide?