Draw without CAD
Pen, shapes, curved rows, and a full transform frame — a venue designer that runs in the browser.
The embeddable seat map and booking layer for ticketing products. Real-time availability, atomic holds, your checkout.
Turn any room, bowl, or field into live inventory.
Trace sections with pen and shape tools, import an existing manifest, or generate a venue with AI. Publishing bakes geometry, tiers, prices, and fan views into a bookable event.
Pen, shapes, curved rows, and a full transform frame — a venue designer that runs in the browser.
Drop a spreadsheet manifest, rebuild from listing data, or describe the venue and let AI draft the bowl.
One publish turns the drawing into priced seats, per-seat 3D elevation, and section views.
Pen and shape tools trace any roomFreehand paths, rectangles, arcs, and polygons snap to the venue grid.
Curved rows regenerate at even spacingBend a row and its seats redistribute along the new arc automatically.
Spreadsheet manifests keep every seat labelHeaders are auto-detected; sections, rows, seats, and prices survive intact.
Listing data rebuilds a bowl automaticallySection, row, seat, and price labels are enough to reconstruct a layout.
AI generation drafts a venue from a sentenceDescribe “a 15k two-tier arena”, then refine the generated bowl by hand.
Tier rake bakes per-seat 3D elevationPublish computes an elevation for every seat — no plug-ins, no re-import.
360° views attach directly to sectionsDrop a panorama on a section; buyers preview it before picking a price.
Transform frame rotates and scales groupsMulti-select sections and move, rotate, or mirror them as one unit.
Undo and redo restore the full venueGeometry, pricing, and label changes all step back cleanly.
Every seat live. Every hold atomic.
One lock engine per event holds, confirms, and releases seats as a single atomic operation. Holds are all-or-nothing, expire on their own, and can never oversell — even mid on-sale.
GET /best?count=3 → G7 · G8 · G9
Contiguous · Row G · no seat left strandedA hold reserves every requested seat or none of them, then releases itself when the countdown ends.
One call returns the best contiguous seats in a row — without stranding a lone seat between sold ones.
Availability streams over WebSocket to every open map the moment a seat is held, sold, or released.
One lock engine per eventA single Durable Object serialises every hold, confirm, and release.
Holds reserve every seat or nonePartial holds don't exist — a conflict names the exact seats that clashed.
Expired holds release automaticallyNo cron, no cleanup job — the lock engine forgets on time.
Confirmed seats can never be re-heldA paid seat leaves the pool until a refund reopens it.
Conflicts answer with a clean 409The response lists the conflicting seat ids, ready for your UI.
Stranded single seats are refused422 orphan_seat by default — pass allowOrphans only when you mean it.
Best available prefers the frontContiguous runs first, then lower price, then rows nearer the stage.
Blocked seats never reach a buyerOrganizer blocks trump holds, best available, and agents alike.
Refunds reopen inventory safelyThe exact seats return to sale the moment the refund lands.
A world-class seat experience that remains entirely yours.
Give every event a hosted booking page, hand any surface a signed checkout link, or drive your own UI with the booking API. The fan relationship stays yours.
Choose the view that feels right.
Powered by SeatMapOS · live availabilityEvery published venue gets a fast hosted booking page — share one link anywhere you sell.
A single-use, expiring link carries a live seat hold into any checkout surface — even a chat.
Availability, best available, hold, and confirm are plain HTTP — render seats however you like.
A hosted booking page for every eventPublishing mints /book/<event> — share one link anywhere you sell.
Signed claim links carry live holdsA compact signed token binds each link to a real, expiring hold.
Claim links expire and refuse replaysExpired answers 410; a replay shows the original receipt, never a resale.
Plain HTTP hold, confirm, and releaseThree endpoints run the whole flow — no SDK required.
WebSocket availability for your own UISeat states stream per event; render them however you like.
Bearer tokens for server-side callsThe same signed token works as a cookie or an Authorization header.
Fees are computed server-side, alwaysClients display totals; they never invent them.
Section views travel with inventoryYour storefront can show the view from any section it sells.
Adoption can begin with one eventRun a single on-sale on SeatMapOS while the rest of your stack stays put.
Give every fan the confidence to choose.
Flat maps hide what a seat is worth. SeatMapOS lifts the map into a tiered 3D bowl and renders the view from the seat — sightline, elevation, and section context before checkout.
A toggle raises the flat map into the raked, tiered bowl — per-seat elevation is baked at publish.
A geometric sightline from the exact section, plus 360° photos where the venue provides them.
Fans who saw the view before paying file fewer complaints and request fewer refunds.
The buyer map lifts into the 3D bowlOne toggle, same canvas — no plug-ins and no model files.
Per-seat elevation baked at publishTier rake becomes a z for every seat, stored with the map.
Geometric sightline from any sectionThe view is computed from real seat position and stage geometry.
360° panoramas where venues provide themDrop a photo sphere on a section; buyers can look around.
View media is versioned with the venueRepublishing keeps views in step with the geometry.
Tiers stack solid from the ground upNo floating decks — the bowl reads like the building it is.
Section context follows the ticketThe chosen view stays attached after purchase.
The same 3D data powers the phone appiOS renders the identical bowl from the identical payload.
Plain canvas rendering — no plug-insWorks in every modern browser with nothing to install.
The first seat map your AI can actually book.
SeatMapOS speaks MCP. ChatGPT searches your events, compares real seats, places a genuine five-minute hold, and hands the fan a signed checkout — working end to end today.
Two seats together for Riverton vs City this Saturday, under $150 total.
I’m holding G7 and G8 for five minutes. The checkout link is signed and single-use — if it expires, the seats release automatically.
search_events, get_seat_options, hold_seats — the agent uses the same atomic engine as your site.
An Apps SDK widget renders events, seat options, and the live hold countdown inside the thread.
The hold travels through a single-use claim link and completes on a secure checkout page.
ChatGPT books through real MCP toolsFive commerce tools, verified working end to end.
search_events reads live inventoryResults come from the live database, not a cached feed.
hold_seats places a real five-minute holdThe agent competes fairly with every other buyer.
Seat cards render inside the conversationAn Apps SDK widget shows events, seats, and the countdown.
Claim links finish checkout on your pageThe hold travels by signed token to /claim/<token>.
Expired claims answer 410, replays get receiptsSafe to retry, impossible to double-sell.
release_hold frees seats mid-conversationChanged your mind? The seats go straight back on sale.
AI venue generation drafts a full bowlgenerate_venue turns a sentence into editable geometry.
Spreadsheet import runs from a chat promptimport_spreadsheet maps a manifest without leaving the thread.
Every dollar accounted for, event by event.
A finance dashboard that itemises gross, fees, refunds, and net per event — with standard or instant payouts and reports ready for your accountant.
Face value, service fee, processing, promos, and refunds stay separate from checkout to report.
Standard payout after the event, or instant payout for 3% — never less than $2.99 or more than $40.
A refund reopens the exact seats atomically, ready to resell — no spreadsheet surgery.
Gross, fees, refunds, and net per eventOne dashboard reads the season the way your accountant does.
Money is integer cents end to endNo floats anywhere — every total reproduces to the cent.
Service fee: 3.7% plus $1.79 a ticketRounded half-up per charge and itemised on every receipt.
Processing shown separately at 2.9%Buyers see exactly where every dollar goes.
Free orders carry zero feesNo service fee, no flat fee, no processing on a $0 order.
Promos apply before fees, never afterA discount shrinks the fee base — it can never inflate it.
Instant payout: 3%, from $2.99 to $40Optional speed; the standard payout stays free.
Refunds itemised against their ordersEvery refund lands in the report next to the order it reverses.
Reports export event by eventHand your accountant a file, not a login.
The whole booking engine, in a native app.
A native SwiftUI fan app with zero third-party dependencies: browse events, pick from live availability, hold with a real countdown, and keep every ticket in a wallet.
Live sections, prices, and availability come straight from the same booking engine as the web map — not a cached copy.
Holds, best available, and fee math match the web checkout to the cent — one production API.
PKCE sign-in with rotating refresh tokens. No passwords, nothing kept outside the keychain.
Event, section, row, and seat stay one tap away from purchase through event day.
Native SwiftUI with zero dependenciesNo pods, no packages — the whole app is first-party code.
Sign in with Google over PKCESystem auth session and CryptoKit — no embedded webview.
Refresh tokens rotate; reuse revokesA stolen refresh token dies the first time it is replayed.
Best available built into the pickerOne tap asks the engine for the best contiguous run.
Hold countdown mirrors the live engineThe timer on screen is the hold's real expiry.
Fees match the web to the centThe app mirrors the same fee math — same rounding, same receipt.
The ticket wallet keeps full seat contextEvent, section, row, and seat — available offline after purchase.
Deep links open straight to an eventseatmapbooking:// routes land on the exact seat map.
One production API — no shadow stackThe app talks to the same Workers the web does.
A clean path from selected seat to confirmed order.
Keep the seat context visible, itemise every fee, and complete payment before the five-minute hold expires. Totals are computed server-side, so the receipt always matches.
Face value, service fee, and processing stay itemised from selection to receipt.
Percent or amount codes apply before fees — a discount never inflates the fee line.
RSVPs and comps carry no service fee and no processing fee. Zero means zero.
Face value and fees stay itemisedThree lines, no bundles: face value, service, processing.
The seat selection remains visibleFans never lose sight of what they are buying.
The hold countdown runs to the secondCheckout shows the same expiry the engine enforces.
Expired sessions cannot oversellA dead hold means a clean error — never a stolen seat.
Promo codes apply before feesPercent or amount, the discount lands before the fee math.
Free tickets skip every feeRSVPs and comps carry no service or processing fee at all.
Claim receipts survive link replaysReopening a paid claim shows the receipt, not an error.
Refunds reopen the exact seatsInventory heals itself the moment a refund lands.
Totals are computed server-sideThe client renders; the Worker decides.
Keep your revenue. And your checkout.
No platform or setup fee for the founding pilot. Buyers pay one itemised service fee — 3.7% plus $1.79 per ticket — and 2.9% processing. Organizers keep the full face value.
Platform fee and setup for your whole pilot season.
Per ticket, plus 2.9% payment processing — itemised at checkout.
No setup fee and no platform fee for your whole pilot season.
The entire buyer service fee, shown next to 2.9% processing at checkout. Nothing hidden.
Free tickets carry no SeatMapOS fee and no processing fee at all.
Founding pilot pays no platform feeNo setup fee either — the whole pilot season is on us.
Organizers keep the full face valueSeatMapOS takes no percentage of your ticket price.
3.7% + $1.79 service fee, itemisedThe entire buyer fee, shown line by line at checkout.
2.9% processing, shown separatelyPayment costs are never hidden inside the service fee.
Comps and RSVPs remain fee-freeFree tickets carry no SeatMapOS fee and no processing fee.
Promos never inflate the fee lineFees are computed on the discounted subtotal.
Instant payout optional at 3%From $2.99 up to a $40 cap — standard payout stays free.
No hidden organizer percentageThe buyer fee is the entire SeatMapOS revenue model.
Every total is reproducible mathThe fee function is pure — same inputs, same receipt, every time.
A serious seat layer for the stack you already have.
Plain HTTP and WebSocket against a zero-dependency engine on Cloudflare Workers: availability, best available, hold, confirm, release, and finance — with honest error contracts.
// All-or-nothing: every seat is reserved, or none are.
const hold = await fetch("/api/events/evt_main-hall/hold", {
method: "POST",
body: JSON.stringify({
owner: "web:fan_81",
seatIds: ["G7", "G8", "G9"],
ttlMs: 300_000,
}),
}); // 200 { holdId } · 409 { conflicts } · 422 { orphan seat }
const live = new WebSocket("/api/events/evt_main-hall/ws");One lock engine per event serialises every hold and confirm. Conflicts return 409 — never a double sell.
409 seat conflicts, 422 orphan-seat protection, 410 expired claims — errors you can build UI on.
The same engine is exposed as MCP tools, so AI surfaces book exactly like your own storefront.
Zero third-party runtime dependenciesThe production Worker ships no npm runtime deps at all.
Workers, D1, R2, and Durable ObjectsEdge compute, SQL, object storage, and one lock per event.
One Durable Object lock per eventEvery hold and confirm for an event runs through one serialised door.
Plain HTTP hold, confirm, releaseThe whole booking flow is three endpoints and a JSON body.
WebSocket seat-state stream per eventSubscribe once; every hold, sale, and release arrives live.
409 conflicts and 422 orphan seatsFailure modes are named, typed, and safe to build UI on.
Signed compact tokens, one crypto pathSessions, bearer auth, and claim links share one HMAC core.
MCP server with commerce toolsAgents search, hold, and hand off checkout like any client.
Mobile PKCE with rotating refreshThe iOS app signs in without ever seeing a password.
Hold retries stay idempotent by holdIdRetrying a hold with the same id can never double-book.
Venue import and export endpointsGeometry moves in and out as plain JSON.
Typed end to end in TypeScriptOne repo, one type system, no codegen step.
Request access to the SeatMapOS demo environment. For clubs, venues, promoters, and ticketing teams who want a fan-first seat experience without giving up their brand or checkout.