Scan floor plan now reads the printed row letters and seat numbers as well as the seat positions, so scanned seats arrive already labelled. The reading runs in your browser with a self-hosted OCR engine (nothing is sent to a third party, no extra server cost) and only looks at the seats, the row ends and the aisles. Each row's numbering is inferred (consecutive, odd, even or odd/even from the centre, either direction, zero padding kept) and missing row letters are filled from the sequence. A review step shows what was read, flags the rows to check and lets you edit, accept or fall back to automatic labels before the seats land as one undo step.
The new status page (/status) shows the live state and response time of the API, real-time updates, the reservations queue, the database, the cache, the map asset CDN and the dashboard, with a daily uptime bar for the last 90 days, incidents and scheduled maintenance. A lightweight probe checks every component every 30 seconds; sustained failures open an incident automatically. Days or hours without measurements show as no data, never as uptime. The same data is available as JSON from GET /api/status.
Platform
Try the designer and a demo shop without an account
The designer playground (/try/designer) runs the real map designer in your browser with no sign-up: start from a template, edit with undo and redo, check the validation list, preview the buyer view and export or import the chart as JSON. The draft stays in your browser and, after you sign up, New chart turns it into a chart of your workspace. The demo shop (/try/shop) is a made-up concert page with the production buyer viewer, category prices, ticket types, a hold timer, best available and a fake checkout; its inventory and other buyers are simulated in the browser, so nothing is reserved or charged.
Multi-floor charts open on all floors, and host objects carry fees
Without activeFloor, a multi-floor chart now opens on the stacked all-floors view in 2D, as seats.io does (activeFloor still picks the floor, and 3D still opens on a floor). Host objects carry fees the seats.io way, in pricing.fee, each ticket type's fee and selectedTicketType.fee, and a seat whose ticket type is not picked yet shows the span of its fees instead of the default type's. The Event Manager reports onSelectionInvalid with minimum_selected_places for minimumSelectedPlaces, in the object and the seats.io list form. The designer's displayed type also shows on section and general admission cards.
seats.io-style validators, resale-aware orphan checks and fee lines
selectionValidators accepts the seats.io list form ([{ type: "noOrphanSeats" }, { type: "minimumSelectedPlaces", minimum: 4 }], with enabled: false to switch an entry off), and noOrphanSeats.ignoreResale decides whether resale seats form a block of their own. When your pricing has fees, the tooltip, the ticket-type card and the cart show them on their own line: "incl. €2.50 fee" with allFeesIncluded: true, "+ €2.50 fee" otherwise. A release that fails now shows the buyer a short notice instead of failing silently.
Whole rows, List places on phones and a stacked floor view
Buyers can turn on Select whole rows in the selection menu: one click takes the seat's whole row block in one hold call. On phones, charts with stepThrough get List places, a sheet that walks floors, sections, rows and seats with large targets. Multi-floor charts get a stacked all-floors view in 2D, seen from the stage or from above (multiFloor.view, isometricView(), stageView()), and set3DCameraPreset() moves the 3D camera.
Table layouts, foreground decorations and text styles in the designer
Tables get layouts and open spaces, a foreground layer draws decorations above the seats, text can be bold or italic, floors carry short abbreviations for tight floor pickers and seats a displayed type that buyers see in the tooltip. Number fields gain a drag scrubber, and the chart check now flags oversized images and duplicate labels across sections with the same name. A 3D seat-picking checklist decides whether buyers on defaultRenderer: "auto" pick seats in 3D.
objectIcon accepts every Font Awesome 4.7 icon name and alias (786 names), with or without the fa- prefix, next to the 66 icons drawn in the viewer's own style. An outline downloads only when your configuration names it, at about 4 KB per icon.
Large group holds, the full object model and safe tooltip links
Workspaces can raise the hold cap so a group of more than 64 seats is held in one atomic step. Host objects carry the remaining seats.io fields, tooltips take links ([url=https://…]) that open in a new tab outside the iframe sandbox, selectionBy: "objects" counts a table booked as a whole once, and showRowLabels and previewObjectChanges() are new. 0.12.1 lets popover links leave the sandbox.
Declarative rules v2, buyer extraData and map-only mode
Colour, label, icon, visibility and tooltip rules match on price, accessibility, zone, floor, ticket type and your own extraConfig, as data, so a 50,000-seat map repaints as fast as without rules. Workspaces can publish selected extraData keys to buyers. bringYourOwnBackend renders the map with statuses fed by your own system. The loader also accepts seats.io configuration names, and changeConfig patches the live chart.
General admission in the cart total and in listSelectedObjects
General admission places picked without an immediate hold (holdOnSelectForGAs: false) are priced in the viewer's cart and counted in its total. listSelectedObjects({ includeGeneralAdmission: true }) returns one entry per area with its quantity, unit price and ticket types.
3D floors, wayfinding markers, sponsor billboards and GA holds at checkout
The 3D view colours GA table chairs by state, shows wayfinding markers, fades upper floors and gets a floor elevator and a Places list. Venues can carry sponsor billboards. holdOnSelectForGAs: false selects general admission places and holds them at checkout. The embedded designer's safe and readOnly modes are now enforced by the API, and every server SDK has connect and request timeouts.
In seasons whose bookings do not propagate, a season-ticket holder's seat that is not for sale in a match can be listed for resale in that match only. Buyers see it for sale with the listing's colour and price, and best available never picks it.
The buyer viewer, the embed, the dashboard and the developer docs are available in 70 languages, including right-to-left scripts. The viewer follows the host page's language unless you pass language.
Packages
@seatschart/embed@0.8.0
@seatschart/react@0.8.0
@seatschart/react-native@0.5.0
@seatschart/vue@0.4.0
@seatschart/angular@0.4.0
Embed & SDKs
Vue and Angular components
@seatschart/vue and @seatschart/angular wrap the seat map, the Event Manager and the designer with typed props and events, next to the React and React Native packages. This release also introduced the locale registry with 32 languages and right-to-left layouts.
Venues can pick a 3D lighting preset, and buyers can look at the stage from the seat they are considering (showViewFromSeat). The Flutter package seatschart_flutter 0.2.0 ships the same features.
@seatschart/react-native and seatschart_flutter load the viewer in a WebView over an opt-in native bridge: the same events, commands and prompts as on the web, without shipping any secret in the app.
SeatsChartEventManager and SeatsChartDesigner put the box-office tools and the map designer inside your own back office, with callbacks, modes and language and colour scheme options. The buyer chart gained partySize, style, objectPopover, legend, filterControls, the floors API and hidden form inputs.
Official server clients for TypeScript, Python, Ruby, PHP, Java, .NET and Go, published to their package registries. Each retries 429 and 503 with backoff, retries only safe or idempotent requests, and reuses your Idempotency-Key so an operation is never applied twice.
Sandboxes are isolated workspaces linked to production, with their own keys, a copy-from-production action, an atomic reset and usage that is never billed. The dashboard also follows a Light, Dark or System theme.
Listings group seats for resale or primary sale, with listing types, colours and prices, and can be sold as a whole. Holds, confirmations, best available and the buyer viewer respect them, and they reach buyers in the live state.
Give sections and zones an elevation and a rake, add stands, stack floors with their heights and place 3D tables, with a live 3D preview in the designer. The buyer viewer renders the result.
Zoomed out, each section shows its lowest price ("from R$ 120") or "Sold out". Hovering a section opens a card with free seats and prices, and the Filters panel narrows seats by price, section, ticket type and accessibility. Hosts drive the same filters with setFilters().
Prepared statements, warm connections, cached roles and pipelined reserve and confirm calls cut database and cache round trips on the hot paths. Audit entries and hold webhooks moved to the background worker.
Designer
Row tools, layers and GA tables in the designer
Join, split and interleave rows, edit sections in place, work in layers, join areas, place GA tables, calibrate a reference image and let charts publish automatically.
Per-seat ticket types, tap-to-zoom and lasso selection
Buyers pick a ticket type per seat in a card next to the seat (a bottom sheet on phones), so one order can mix full and half price. Seats too small to hit zoom in on the first tap, seat numbers appear once they are legible, embedded maps no longer steal page scrolling, and a rectangle or lasso selects many seats at once.
Ticketing platforms choose where prices come from: their own (no quote), a synced price table or the SeatsChart catalog. Half-price quotas, lot switching and per-buyer limits are enforced atomically on every hold.
One-click charts, inline rename, a start panel and a guided tour get new users drawing quickly. A live checklist finds problems as you draw, locates them on the map and blocks publishing when a severity says so.
One <script> and one div embed the seat map: the loader creates the sandboxed iframe, checks every message and turns chart events into callbacks and commands into promises. Multi-event embeds book the same seats across several events.
Connected buyers see seats change as they are held, sold or released, through one lightweight Server-Sent Events stream per event. Host pages can command the embedded map.
Dashboard
Event Manager, seasons and the server SDK
The Event Manager lets box-office staff book, block and release seats on the map. Seasons bundle events, and the first @seatschart/sdk brings the API to Node and Bun servers.
July 2026
Platform
Billing, team roles and embed domains
Workspaces get plans and billing, team members with roles, and a per-workspace list of domains allowed to embed the seat map.