Your floor plan, bookable anywhere.

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.

Runs on your own hostPHP 8.2+, MySQL. No Node, no Composer, no monthly fee.
Embeds with one tagWordPress, Shopify, Webflow, Wix or plain HTML.
No double bookingsRow-locked conflict check on every request.
Live · reservations reset nightly

Embedded with <script src="…/embed.js" data-map="restaurant">

One line of HTML. Any website.

SeatMap runs on your own server and hands you a snippet per map. Paste it into a WordPress page, a Shopify theme, a Webflow embed, or a plain HTML file — the map renders there, sized to fit, and every booking lands in your admin.

  • Sizes itself to the content — no scrollbars inside the map.
  • Follows the visitor's light or dark mode, or force one with data-theme.
  • Works without third-party cookies, so it books fine inside any site.
WordPressShopifyWebflowWixSquarespacePlain HTML
<!-- Paste where the map should appear --> <script src="https://your-domain.com/embed.js" data-map="restaurant" data-theme="auto" async></script>

An admin your staff can actually use.

Draw the plan, watch bookings arrive, confirm with one click. Everything below is the live demo — sign in and try it.

/admin/maps/1/edit
The map builder: a restaurant floor plan with rectangles drawn over each table, and a side panel editing table A1's price and capacity.

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.

/admin/reservations
The reservations list with guest names, areas, dates and pending, confirmed and cancelled badges.

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.

/admin
The dashboard with today's bookings, pending approvals, a 14-day chart and a per-map table.

Today at a glance: what is booked, what is waiting for approval, which venue is busiest, and the last two weeks of demand.

Built for the way venues actually book.

Dates, time slots or instant

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.

Opening hours and closed days

A weekly schedule per map. Closed days are struck through in the calendar; each weekday can keep its own hours.

Seasonal and weekend pricing

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.

Group bookings

Let a guest pick a whole row of cinema seats or four sunbeds in one go, with a guest count on each booking.

Filters, zones, accessibility

Visitors search by name, cap the price, filter by zone (Stalls, Balcony, Floor 2) and show only wheelchair-accessible areas.

Stripe Checkout, optional

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.

Double bookings can't happen

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.

Emails with calendar invites

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.

Owner and manager roles

Managers handle reservations. Settings, the builder and the team stay with the owner.

Installs in three screens

Upload, open the URL, enter your database and your email. Dependencies are bundled: no Composer, no Node, no terminal.

Six venues, live right now.

Each one shows a different booking mode. Open any of them and make a reservation.

From upload to first booking.

Upload the plan

A photo, a PDF export, a sketch — any image works. No image? Draw on a blank grid.

Draw the areas

Rectangles, circles or polygons over each table, seat or space. Set the price, capacity and hours once per map.

Share or embed

Send the map's link, or paste the snippet into your website. Bookings arrive in the admin and in your inbox.

One payment. Your server. Your data.

No per-booking fees and no monthly plan. The licence covers one production site and its staging copy.

  • Full source: Laravel 12 backend, React map builder, vanilla JS widget
  • Six ready-made demo maps to start from
  • Six months of support and a year of updates
$49one-time
See it working first

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.

Questions people ask before buying

Do I need WordPress?

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.

What does the server need?

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.

Can guests pay online?

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.

Can a guest cancel?

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.

Can two people book the same table?

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.

Is it translatable?

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.

How is the embed kept safe?

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.