← All documentation

Venues & Seating

Build booth inventory, draw a venue map, lay out priced seats and tables, sell them through a public paid seat checkout, then work the door — QR tickets, check-in, and door-only staff logins — and refund what needs refunding.

Some events sell a headcount — twenty vendors, any twenty. Others sell a specific place — booth A1, table 12, seat R4-7. Venue tools are for the second kind. They let you build a booth inventory, draw it on a real map of your site, lay out seats and tables in a room, and reserve exact locations against a date.

This is the toolset for indoor markets with fixed footprints, event halls, theaters, and anywhere the answer to “where am I?” needs to be more precise than “somewhere at the market.”

How do I turn a market into a venue?

A venue in VendorStreet is a market with its booking mode set to Spaces. There’s no separate object to create.

Go to Market → Edit → Basics and set Booking mode to Spaces. The in-app help puts it directly: “Capacity mode limits bookings by count; Spaces mode limits by named booths.”

VendorStreet will warn you when you switch, because changing the mode affects existing bookings and space assignments. Do it before you take real bookings, not after.

Once you’re in Spaces mode, the Spaces & Map tab comes alive and the spaces endpoints start accepting work. See Markets for the mode comparison.

What are regions, spaces, and layout objects?

Three nested layers, from coarse to fine:

Regions are the big divisions of your site — “Building A,” “North Lawn,” “Upstairs.” Add them under the Regions card with a name and an optional description. Regions are reorderable and act as a filter everywhere else, including on your public map.

Spaces are your booths — the sellable inventory. The Spaces inventory card lists them by Code, Name, Size, Base price, and Status. When adding one you set:

  • Space code — the identifier vendors and staff use (A1, NW-04).
  • Name (optional) — a friendlier label.
  • Width (feet) and Depth (feet) — the footprint.
  • Base price (USD) — what this booth costs. This is where a Spaces-mode market gets its base price for pricing rules.
  • Region — which region it belongs to.

Building a row of identical booths? Use Duplicate along row — set the number of Copies and a Direction (Right or Left) and VendorStreet generates the rest.

Every one of those fields stays editable afterwards — each row in the inventory has an edit and a delete action. Changing a booth’s Base price or Size only affects bookings made from then on; an invoice records what it charged when it was issued and never re-reads the booth afterwards, so nobody’s existing bill moves. Changing the Space code is safe too — bookings track the booth itself, and the code is only a label — though staff and vendors will see the new one, so don’t renumber your site mid-season.

Deleting a booth is deliberately harder, because a booth is only removable while nothing points at it: no booking (a vendor’s unsubmitted draft counts — they’ve already picked it), no seats or tables drawn inside it, no invoice line billing for it, and no active hold. If any of those exist the delete is refused and says what’s holding it. Nine times out of ten what you actually want is to edit the booth and set its Status to inactive, which takes it off the board for new bookings and leaves everything already booked intact.

Layout objects are seats, tables, and sections placed inside a space. That’s the seating layer, covered below.

How do I put my booths on a map?

Under the Map editor card — “Draw polygons to map spaces to the uploaded layout image.”

  1. Upload a site plan or overhead image as PNG or JPEG (Upload map, or Replace map later).
  2. Select a space from your inventory.
  3. Drag a rectangle over its position on the map — or switch to the polygon tool and click out each corner for irregular shapes.
  4. Repeat for each booth.

The result is a real map of your market that visitors can browse at /markets/<your-slug>/map. It supports pan and zoom, filtering by region, and a legend showing Available, Booked, Locked, and Assigned to you.

Note that the public map is read-only — visitors can look and filter, but nothing is booked from that page.

How do I set up a seating chart?

Seating lives inside a space, under the Seating layout card. You’ll need a map image uploaded and selected for that space first — the layout is drawn on top of it.

Start by choosing a Seating model:

  • Not configured — no seating.
  • Open / general admission“capacity only, no seat identity to lay out.” Picks a headcount and hides the canvas entirely.
  • Operator-assigned seats — you place people in specific seats.
  • Customer seat selection — seat-level identity intended for customer picking.
  • Table reservations — reservations are made by table rather than by seat.

Any model other than open reveals the layout canvas: “Place seats and tables on the space map below, then save the layout.”

Placing seats, tables, and sections

The canvas toolbar gives you Add seat, Add table, and Add section. Place objects by dragging them onto the map image; a live counter tracks how many are placed and how many are queued for removal. Click Save layout when you’re done.

Each object type behaves differently:

  • Seat — a single point. Has a Label and an optional Section assignment (defaults to Unassigned).
  • Table — a rectangle with a Label and a Capacity.
  • Section — a rectangle grouping seats, with a Label, a Capacity, and a Sale mode.

Remove deletes the selected object.

What are sale modes, and which should I use?

Sale mode is set per section and controls how that part of the room is sold. It overrides the space’s seating model, so you can mix approaches in one room — reserved seats down front, general admission at the back, a private suite sold whole.

  • Assigned — pick individual seats. Buyers get specific seats. Capacity is optional here because it derives from the seats you’ve tagged into the section.
  • General admission — buy N up to capacity. No seat identity; people buy a quantity against a cap. Requires a capacity of at least 1.
  • Whole — sold as one unit. The entire section goes to one buyer — a suite, a private room, a VIP box. Requires a capacity of at least 1.

Pricing sections and seats

Sections now carry a price, and that price means something slightly different per sale mode:

  • Assigned — the price is per seat. Every seat in the section costs the section price unless you tier it (below).
  • General admission — the price is per admission, multiplied by the quantity bought.
  • Whole — the price is for the whole unit.

Set a section’s price (in dollars) on the section tool in the Seating layout editor. A section — or a bare seat that belongs to no section — with no price is treated as not purchasable online; the public checkout won’t sell it.

Price tiers let you charge more for front-row than back-row within one assigned section. Define named, reusable tiers on the space — for example Premium, Standard, Value — each with its own price and colour, then assign each seat to a tier. A seat’s tier price wins over its section price; an untiered seat falls back to the section price. The public map shows a colour legend and a price range for tiered sections.

How does reserving seats work?

Open the Reserve seats card — “Hold and book specific seats or tables on [space] for a scheduled occurrence, with live availability.” It appears once a seating model is set to something other than open.

  1. Pick an Occurrence — which scheduled date you’re reserving against. See Scheduling.
  2. Click seats or tables on the map to select them. For general admission sections, use the and + steppers instead; each row shows how many of the capacity are left.
  3. Your picks appear in the Selection panel, each with a Remove link and a live countdown.
  4. Optionally add add-ons — an add-ons total is shown as you go.
  5. Click Confirm reservation.

How long do seat holds last?

Ten minutes. The moment you select a seat it’s held against everyone else, and the countdown in the Selection panel shows the time remaining. When a hold expires, the selection clears and the seat returns to the pool. The duration is fixed and not currently configurable.

Because two people can be working the same room, you’ll occasionally hit a conflict. VendorStreet is explicit about it rather than silently reassigning: “One or more selected seats were just booked by someone else”, “This section was just sold out by someone else”, or “This selection’s holds have expired. Please re-select your seats.” Availability refreshes automatically and you pick again.

The operator Reserve seats tool is inventory only — confirming a seat there is a roster operation, not a sale. No charge is created and no card is taken at that step; it’s for placing people you’ve already dealt with. Payment is handled by the public seat checkout, below.

Can customers buy seats online?

Yes — venues now have a full public paid seat checkout. This is new; if you remember venue seating as inventory-only, that’s changed. Customers browse the seat map, hold a selection, and pay through Stripe, exactly the way experiences sell.

The public seat page (reached via a View seating button on your public venue page) lets a visitor:

  1. Pick the space and the date (occurrence) they’re buying for.
  2. Browse the master map — sections coloured by availability (open / limited / sold out) — and drill into a section.
  3. Select seats (assigned), choose a quantity (general admission), or take the whole unit — building a cart under a 10-minute hold with a live countdown.
  4. Click Proceed to payment, enter name and email, and pay on Stripe Checkout.

Only priced seats and sections are sellable — anything left unpriced shows as “not available for online purchase.” The amount is always recomputed server-side from the held seats, so the price is never trusted from the browser. When payment succeeds a booking is confirmed and the customer gets a confirmation email and a status page; if they abandon checkout, the hold simply expires and the seats return to the pool.

Stripe must be connected for this to work — an operator with no connected Stripe account will have customers stopped at payment, the same as experiences. See Payments & Payouts.

Who’s coming? The door list

Manage → Door list (or /markets/<market-id>/door-list) is the roster for one occurrence. Pick the date and you get every paid seat booking: the seats or general-admission section they hold, the buyer’s name and email, how many admissions, what they paid, and when they booked. It’s sorted by seat label, so you can read down it the way you’d read a room.

Export CSV writes the whole list — not the part you can see — so you can print it, hand it to whoever is working the door, or load it into something else.

Paid bookings only, deliberately. Someone who abandoned checkout isn’t a guest, and a refunded booking’s holder isn’t coming. Neither appears.

The door list also shows who has already arrived — see the next section for how people get checked in.

How do I check people in at the door?

The door list is the list to read. Manage → Door check-in (or /markets/<market-id>/door) is the screen you work — open it on a phone, pick tonight’s date, and either scan tickets or look guests up by name.

The ticket

Every seat confirmation email now carries a QR code, and the buyer’s booking status page shows the same one. That’s the ticket. Guests can show it on a phone or on paper — it’s the same code either way, and it doesn’t expire.

Bookings confirmed before this feature shipped have no QR in their original email. You don’t need to do anything about that: email lookup works for everyone, and if you’d rather the guest had a ticket, the QR is already on their booking status page (the “View your booking” link in their original confirmation).

Scanning

Tap Start the camera and point it at the guest’s QR code. You’ll see who they are, which seats they hold, and how many of their party are already inside — then one tap admits them.

The camera needs permission the first time, and browsers only allow it over https. If the camera won’t start, the page tells you so and points you at the lookup instead; nothing is blocked by a camera that won’t cooperate.

Looking someone up

Dead phone, deleted email, or a QR that just won’t scan — type any part of their email, name, or seat into Look them up and admit them from the result. This searches tonight’s list only, and it works offline-ish: the list is already loaded, so it doesn’t wait on the network.

Admitting part of a party

A booking for four can be admitted four at once, or two now and two when the others park the car. The count accumulates against the booking, so:

  • The default button admits everyone still outside — one tap for a party arriving together.
  • The small number buttons underneath admit just that many.
  • You can never admit more than the booking sold. The fifth person on a booking for four is refused, and it’s refused safely even if two people on two different phones scan the same ticket at the same moment.

Scanning the same ticket twice is not an error. It reads “Already checked in — 4 of 4 admitted, at 7:42 PM”, which is exactly what you need to know when someone tries to walk in on a ticket their friend already used.

When a ticket is refused

The screen names the reason rather than just failing, because you have to say it out loud to the person in front of you:

  • Performance cancelled — this occurrence was called off, so nobody is admitted on any ticket. Ticket holders are refunded automatically; tell them to check their email.
  • Refunded — the booking was refunded and the seats went back on sale.
  • Wrong date — a real ticket for this venue, but a different occurrence.
  • Not paid — the checkout never completed, so there’s no ticket.
  • Not a ticket — the code isn’t one of yours at all.

“Performance cancelled” outranks the others: if the show is off it is the only thing worth saying, and it is true of every ticket presented at that door.

Who can work the door

Door staff don’t need to be market managers. Invite them as Door staff — see below.

How do I give someone door-only access?

In Manage → Users → Invite, pick the market and choose Door staff (check-in only) as their role. They get the same emailed invite as any other staff member.

A door staff member can do exactly two things in that market: read the door list for an occurrence, and check people in. Everything else refuses them — schedules, spaces, booth maps, vendors, invoices, reports, market settings, and refunds. Their roster carries no prices and no takings — what a seat sold for and what the night collected are yours, not theirs — and they have no access at all to any other market.

Their app reflects it: signing in takes them straight to the check-in screen, and the rest of the operator menu isn’t there. It’s a deliberately small amount of trust to hand a casual or seasonal worker.

Market admins and managers can work the door too, without a separate invite — somebody has to cover it when the door staff don’t turn up.

How do I refund a seat sale?

Open the Door list for the occurrence, find the booking, and click Refund. You’ll be asked to confirm, because two things happen at once: the buyer’s money goes back through Stripe, and their seats return to the pool for anyone to buy. The buyer gets an email telling them the booking was refunded and their payment has been returned, and their booking status page changes to Refunded.

It’s the whole booking or nothing. There’s no partial or per-seat refund — if someone bought three seats and wants to give back one, refund the booking and let them rebook the two they’re keeping.

If Stripe refuses the refund, nothing changes. The booking stays paid, the seats stay held, and you can try again — VendorStreet won’t record a refund that didn’t happen. Failures are also filed for the platform team to look at.

The Stripe dashboard trap

Refunding in the Stripe dashboard gives the money back but does NOT free the seat. Stripe knows nothing about your seating chart, so the seat stays sold and unbookable, and your door list still shows the buyer as coming. This has always been true and still is — the in-app Refund button is the one action that does both.

If you already refunded in Stripe and are stuck with a seat you can’t sell, use the door list anyway: tick “I already refunded this in Stripe — just release the seats” in the confirm dialog. That releases the seats and cancels the booking without trying to refund a second time (which Stripe would reject). The buyer’s email says the booking was cancelled and the refund was handled separately, so nothing claims money moved twice.

How do I cancel a whole performance?

Open the occurrence in Scheduling and set its status to Cancelled. Before you confirm, the dialog tells you exactly what is about to happen — how many vendor bookings and invoices are affected, and how many tickets were sold and how much money goes back. If the number of tickets surprises you, stop and check you have the right date.

Confirming does all of this:

  • Every ticket sold for that occurrence is refunded in full, automatically. You do not refund them one at a time. The seats are released, the bookings are cancelled, and each buyer is emailed — and that email leads with the fact that the event was cancelled, not just that they were refunded.
  • The door stops admitting people. Anyone scanned or looked up at that occurrence’s door gets “Performance cancelled” instead of an Admit button, whatever their ticket says.
  • Nothing more can be sold for it. Seat holds and checkouts are refused, including from a bookmarked link or a tab someone left open.
  • Vendor bookings on the date are cancelled and their unpaid invoices voided, as described in Markets.

If a refund fails, you are told, and nothing pretends otherwise. Stripe occasionally refuses one — a payment already refunded from the dashboard, for example. That ticket stays paid, its seats stay held, its buyer is not emailed a refund notice, and the confirmation flags the failure so you can settle it from the door list. The cancellation itself still completes; one stuck refund never blocks the other hundred.

Cancelling is not deleting. A date nobody booked can be deleted outright; a date with sales must be cancelled, precisely so all of the above runs. VendorStreet refuses to delete an occurrence that has sold seats.

Service fee and tipping on seat checkout

Because venue seats now take real payment, they carry the same optional checkout charges as experiences:

  • A fixed service fee — set a per-model default under organization settings, or override it per venue in Market → Edit → Basics (“Checkout charges”).
  • Tipping — off by default; turn it on per venue with optional presets or a compulsory floor the buyer can add to, plus a custom note.
  • A card processing surcharge and sales tax via Stripe Tax also apply here.

One thing worth calling out plainly: on these sales you are the merchant of record, which means you are responsible for collecting and remitting sales tax — and Stripe collects $0 tax until you register your jurisdictions in Stripe. The full story, including the worked line-item math, is in Checkout Charges.

Who can reserve seats?

Two paths now:

  • The public seat checkout (above) is open to anyone — no login, guests buy and pay for themselves.
  • The operator Reserve seats tool is still staff-only, from inside the market admin, and remains payment-free — use it to place people you’ve handled outside the online flow.

The booth map at /markets/<your-slug>/map still shows booth polygons only — it doesn’t render seats. Seat browsing and buying happen on the dedicated public seat page, not the booth map.

Common gotchas

  • A map image is required before you can lay out seating. “Upload and select a map for this space to lay out seating.”
  • Holds expire in ten minutes, with no warning beyond the countdown. Long phone bookings will lose their selection mid-call.
  • Section sale mode beats the space’s seating model. If a section is behaving unexpectedly, check its sale mode before the space setting.
  • General admission and whole sections need an explicit capacity; assigned sections derive theirs from tagged seats.
  • Unpriced seats and sections can’t be sold online. The public checkout skips anything with no price; set a section price (or seat tier) to make it purchasable.
  • Seats now take real payment, and Stripe must be connected. Without a connected Stripe account, public seat buyers are stopped at checkout.
  • On seat sales you’re the merchant of record. You owe the sales tax, and Stripe collects $0 tax until you register your jurisdictions in Stripe. See Checkout Charges.
  • Refunding in Stripe does not free the seat. Use the door list’s Refund button, which refunds and releases together. If the money already went back through Stripe, release the seats with the “already refunded in Stripe” option instead.
  • Refunds are whole-booking only. There’s no way to give back one seat out of three.
  • Door staff can’t refund. Refunding is an admin/manager action; a door session is refused. That’s the point of the role.
  • The camera needs https. On an insecure connection the browser won’t hand over a camera at all — use email lookup.
  • Old confirmation emails have no QR. Anything bought before check-in shipped is admitted by email lookup, or from the QR on the buyer’s booking status page.
  • Switching a live market’s booking mode is disruptive. Existing bookings and space assignments are affected.
  • Booth polygons and seating layouts are stored separately. Drawing booths on the map doesn’t create seats, and vice versa.

Next steps

  • Checkout Charges — service fee, tips, and sales tax on seat sales
  • Payments & Payouts — connect Stripe and get paid for seats
  • Add-ons — sell extras against specific sections, seat types, or sale modes
  • Reporting & KPIs — venue occupancy, attendance, attach rate, and seat revenue
  • Scheduling — the occurrences you reserve against