Upload the plan, draw the tables, seats or spaces, and take reservations on any website with one script tag. Self-hosted, no monthly fee.
The map below is the real product, embedded on this page the same way it would be on yours. Pick a date, tap a table, book it.
Embedded with <script src="…/embed.js" data-map="restaurant">
Draw the plan, watch bookings arrive, confirm with one click. Everything below is the live demo — sign in and try it.

Drop in any image and draw rectangles, circles or polygons over it. Each area gets a label, price, capacity, zone, a wheelchair flag and its own colour. Select several and edit them at once; undo anything.

Filter by map, status, date or guest. Confirm or cancel one at a time or in bulk, leave internal notes, switch to a month calendar, export to CSV. Guests get an email with a calendar invite at each step.

Today at a glance: what is booked, what is waiting for approval, which venue is busiest, and the last two weeks of demand.
Each map picks its mode: a calendar with time slots for dinner, a date range for sunbeds, or nothing at all for a parking space right now.
A weekly schedule per map. Closed days are struck through in the calendar; each weekday can keep its own hours.
Rules like “weekends +20%” or “July and August: 250”. The same rule engine runs in the browser and on the server, so the price shown is the price stored.
Let a guest pick a whole row of cinema seats or four sunbeds in one go, with a guest count on each booking.
Visitors search by name, cap the price, filter by zone (Stalls, Balcony, Floor 2) and show only wheelchair-accessible areas.
Per map: take the full amount or a deposit before a seat is confirmed. Seats are held for 30 minutes while the guest pays; unpaid holds free themselves.
Conflicts are checked inside a database transaction with row locks. Two people racing for the last table: one gets it, the other is told immediately.
Received, confirmed and cancelled emails with an .ics file and a private manage-booking link, plus a heads-up to you for every new booking. Wording and SMTP are set in the admin.
Managers handle reservations. Settings, the builder and the team stay with the owner.
Upload, open the URL, enter your database and your email. Dependencies are bundled: no Composer, no Node, no terminal.
Each one shows a different booking mode. Open any of them and make a reservation.
Tables with date and time slots, VIP area at a higher price.
Pick several seats for one screening in a single booking.
Stalls and Balcony zones, with a filter for accessible seats.
Desks booked instantly, filtered by floor.
Spaces reserved on the spot, no date needed.
Sunbeds with July and August prices set by rule.
A photo, a PDF export, a sketch — any image works. No image? Draw on a blank grid.
Rectangles, circles or polygons over each table, seat or space. Set the price, capacity and hours once per map.
Send the map's link, or paste the snippet into your website. Bookings arrive in the admin and in your inbox.
No per-booking fees and no monthly plan. The licence covers one production site and its staging copy.
Launching on CodeCanyon. Until then, the demo is fully open — including the admin.
Requires PHP 8.2+, MySQL 8 / MariaDB 10.6+. Version 1.0.0, Laravel 12.
No. SeatMap is a standalone application. It runs on any PHP host and its maps embed into WordPress, Shopify, Webflow, Wix or plain HTML with the script tag. If you only want a WordPress plugin, we sell one of those separately.
PHP 8.2 or newer, MySQL 8 or MariaDB 10.6+, and the usual PHP extensions (PDO, mbstring, OpenSSL, fileinfo, GD). That is a standard shared host or any VPS. The installer checks all of it on the first screen.
Yes, optionally. Connect Stripe in Settings and tick “Require online payment” on a map: the guest is sent to Stripe Checkout, the seats are held for 30 minutes, and the booking confirms itself when the payment lands (webhook or return-page check). Charge the full amount or a deposit percentage. Leave it off and bookings work as a simple request you confirm.
Every email carries a private “view or cancel your booking” link. You decide whether online cancellation is allowed and how many hours before the visit it closes.
No. The server checks for a clash inside a locked database transaction before saving. The second person sees “this area has just been reserved” and the map refreshes.
Yes. Every string in the admin, the widget and the emails goes through Laravel's JSON language files. Add a file for your language and switch the locale.
Each map page carries a signed, time-limited token; the booking API accepts writes only with it, and it is rate limited. Seat ids are validated against the map on the server, so nobody can book an area that does not exist.