Chapter 9 — Selling a Seat: carts, holds & dummy events
Attend onboarding guide · ~7 min read · ↑ Back to contents
We can now describe a seat (section/row/seat) and price it (class name, price code, ticket type code). This chapter is the last piece of the machine: how a seat actually gets into a cart and sold.
Two ways to grab a seat
There are exactly two ways Attend asks the ticketing system to hold a seat:
1. Seat-hold specific — you name the exact seat: section/row/seat, plus the price code and ticket type code. This is what Flex and Premium use, because the fan is choosing a specific seat off a map.
2. Best available — you don't name a seat. You give a class name, price code, and ticket type code, and the system picks any matching seat for you. This is what Flow uses (the fan picks a rough area like "upper bowl," not a seat), and it's also how Pass and add-ons work.
Tip: with best-available, always send all three (class name + price code + ticket type code). If you're too vague, the system might hand you a seat from a pricier tier than you intended.
Keeping inventory honest
Attend keeps its own copy of the seats (it fetched them into its database back in Chapter 5). But seats can sell on other channels at any moment, so two things keep that copy honest:
- It rebuilds inventory every ~20 minutes, re-pulling the latest from the vendor.
- It syncs carts in real time. The instant a fan picks a seat on Attend, Attend also opens a hold for that seat in the vendor's cart. If the vendor can't hold it (someone just bought it), Attend won't put it in the fan's cart either — and shows "that seat's gone, here's another." Attend's cart and the vendor's cart never drift apart.
"Dummy events": Pass, parking, merch
In Chapter 6 we saw that a suite is real seats sold as one block. There's a sibling trick, one level up — at the event level: the dummy event.
Some things Attend sells aren't real games at all:
- a Pass (you're buying a subscription, not a specific game),
- add-ons like parking, merchandise, or food-and-drink credit.
For these, the team creates a dummy event in the ticketing system — an "event" with no real game behind it and no barcode, existing only so the sale can be recorded. Attend sells against it using best available (the actual seat underneath doesn't matter — you just need the system to register the purchase).
Quick mechanics note
Reading availability and holding a seat are different operations — but don't use the HTTP verb to tell them apart. Against the dominant vendor (TM Archtics) the command API sends almost everything as POST, including "get available seats"; only a couple of calls (like token validation) are GET. Think in terms of the command (fetch vs. hold), not the verb.
Example
Two Warriors fans, same game:
- Maria uses the Flex store, opens the seat map, and picks Section 119, Row 1, Seat 7 → Attend uses seat-hold specific with that exact seat +
PR+PR_A.- Sam gets a Flow last-minute text, taps "upper bowl," and pays → Attend uses best available with the upper-bowl class + price/ticket-type codes, and the system assigns Sam a seat. Sam learns the exact seat after paying.
Who's buying — login & the account ID
Holding a seat assumes we know who the fan is. Before the gated steps (seat selection, checkout) the
fan logs in through the ticketing vendor's OAuth, and Attend gets back an account ID — the
vendor's identifier for that customer. The backend builds a session around it: the @UserInfo() a
controller reads carries userId, email, accountId, plus the fan's account groups and
credit. That account ID is what gating (Chapter 14) and account credit (Chapter 15) hang
off — and it's per ticketing database, so the same person can have different account IDs on
different teams.
🧭 The four calls behind the whole funnel. Almost everything the fan app does is four backend APIs in order: catalog (what's for sale) → inventory (seats & prices for an event) → manage-cart (hold seats) → checkout (pay + commit). Chapters 22–25 walk these in depth — keep the four-step shape in mind as you read on.
Recap
- Two ways to hold a seat: seat-hold specific (exact seat — Flex/Premium) and best available (system picks — Flow, Pass, add-ons).
- Attend keeps inventory honest by rebuilding every ~20 min and syncing its cart with the vendor's in real time.
- Dummy events (no real game, no barcode) are how Pass and add-ons (parking, merch, F&B) are sold — via best available.
- Fetch vs. hold is about the command, not the HTTP verb — Archtics POSTs almost everything (only a few calls like token validation are GET).