Ticketing invariants
These rules are Event behavior (system of record). BFFs must not contradict them. No schema or migration dump — behavior only.
GA vs reserved
| Mode | Inventory | Sell / hold requirement |
|---|---|---|
| General admission (GA) | Quantity | Decrement remaining quantity. No seat id. |
| Reserved seating (RS) | Specific seats | seatIds required. No oversell of a seat. |
No oversell. Event uses SKIP LOCKED so concurrent holds/checkouts cannot take the same GA unit or reserved seat.
Seat-map lock: the first reserved-seating inventory write for a map locks that seat map. After lock, the map is not an open editing surface for selling inventory. Predict/detect is a separate path and does not persist Event inventory.
Carts and holds
| Rule | Behavior |
|---|---|
| Hold TTL | 12 minutes from create. |
GET cart | Does not extend TTL. Polling is not a keep-alive. |
| Checkout secret | Extends the hold 8 minutes. |
| Expiry | Held GA quantity / RS seats return to availability when the hold dies. |
Do not document “refresh cart to keep seats” — that is false on Event.
Channels
Event records sales channel as web / door / app. GO additionally sends clientSource: go-app (see GO internals). Do not invent a mapping between channel and clientSource beyond what those codepaths set.
Lifecycle records Event stores
Event is SoR for records of:
- scan / redeem
- refund
- transfer
- exchange
Checkout orchestration (create/confirm the ticketing side of checkout) is Event. Money movement is eventlinx-api-stripe. $0 and cash completion go through the Stripe API; GO Terminal PaymentIntent create is via Event, completion via Stripe.
What is not a shipped patron product
Patron self-serve exchange is not shipped. Patron-api still has exchange routes; the patron UI flag is off. Do not describe it as a live Get Tickets feature.
- Transfers on patron: live.
- GO: blocks exchange into reserved seating. The GO API does not gate reserved POS; the Expo app does (
isDevEnv). See GO internals.
Where to read contracts
Event OpenAPI: GET /doc on the Event hosts in Environments. Source: eventlinx-api-event src/routes.ts. Groupings and payload shapes change in code — do not fork them into this site.