The SeatLayer plugin puts a live seating chart on any WordPress page or post. Install it from wordpress.org/plugins/seatlayer-seating-charts, or from wp-admin > Plugins > Add New by searching for SeatLayer. The WordPress seating chart plugin page covers what it does before you install it. Visitors pick seats and pay through your own payment gateway. Your payment gateway controls processing fees, applicable taxes, and payout timing; SeatLayer bills Hosted Ticket usage separately.
The renderer behind the chart is benchmarked at 200,000 seats, so the same plugin serves a small theatre and a stadium.
The event must use a published reserved-seat Chart. GA capacity may be included inside that Chart; the plugin is not a pure-GA ticketing flow without a seating chart.
Before you start
You need four things, in this order:
-
A SeatLayer account. Hosted Ticketing is self-serve; there is no access request or approval step.
-
A published chart and a Managed event. Create both at app.seatlayer.io. Note the event key. It is the
slugyou chose and the value the plugin needs. -
A connected payment account. In the dashboard, go to Payments and connect your payment gateway. Until you do, the chart will render but buyers will see “this event is not taking online payments yet”. A free event does not need a payment account.
-
The plugin, installed and activated on your WordPress site. In wp-admin > Plugins > Add New, search for SeatLayer and activate SeatLayer Seating Charts, or install it from the directory listing at wordpress.org/plugins/seatlayer-seating-charts.
Add a chart to a page
Use the SeatLayer seating chart block, choose your event, and publish.
If you prefer a shortcode, or you are on the classic editor:
[seatlayer_chart event="summer-fest"]Optional attributes:
| Attribute | Default | What it does |
|---|---|---|
event |
None | Required. Your event key. |
height |
640 |
Container height in pixels (320–2000). |
max_selection |
10 |
Most seats one buyer may select (1–50). |
locale |
buyer’s browser | Any of the 37 supported languages, e.g. de, ja, zh-Hant. Omit it and each buyer gets their own browser language, English if we do not ship theirs. |
currency |
event default | ISO code, e.g. USD. |
[seatlayer_chart event="summer-fest" height="720" max_selection="4"]The secret key is optional
The plugin renders a Managed public/unlisted event, so its buyer chart works
with only the event key. This is the anonymous Managed-event path, not the
publishable-key bootstrap used by a Platform/SDK event. A custom Platform embed
uses publicKey for Public sale or an authenticated token provider for private
audiences.
A secret key under Settings → SeatLayer does exactly one thing: it lets the block editor list your events in a dropdown instead of you pasting keys.
How checkout works
This checkout design keeps a WordPress site out of the payment path:
-
The buyer selects seats on your page. The widget creates a hold on SeatLayer’s servers. A competing request receives a conflict instead of a second successful hold.
-
On checkout, the buyer is sent to SeatLayer’s hosted payment page, carrying only the hold id. No amount is passed. The server recomputes the total from its own hold records, so nothing on your site can change what a buyer pays.
-
They pay through your own connected payment account. Your payment gateway controls processing fees, applicable taxes, and payout timing; SeatLayer bills Hosted Ticket usage separately.
-
Once the payment provider confirms, the seats are booked and the buyer is emailed their tickets. Replies to that email reach you, not SeatLayer.
Because payment confirmation comes from a signed provider webhook rather than the buyer’s browser, a closed tab or lost connection mid-payment cannot lose an order.
Refunds
Refund from the order in SeatLayer (Refund or cancel…), and a full refund puts the seats back on sale. Refunds you make in Stripe, PayPal or Razorpay sync back to SeatLayer automatically. With other providers, refund from the order in SeatLayer, or record an outside refund with Refund or cancel… → Cancel without refund.
A partial refund does not release seats because a partial amount cannot identify its seat.
Performance
The chart’s JavaScript loads only on pages that contain a chart, so embedding one on a single ticket page does not add weight to the rest of the site.
Does it work alongside WooCommerce?
Yes. The plugin runs on a site that also uses WooCommerce, and the two run side by side rather than through one checkout. Ticket purchases use your own payment gateway and do not create WooCommerce cart items or orders, so seats are not WooCommerce products. Keep using WooCommerce for merchandise on the same site, and use the plugin for seated tickets.
What this plugin does not do yet
The plugin does not put ticket management, Box Office, Control Room, or Door UI inside WordPress. Those Hosted Ticketing surfaces stay in SeatLayer and operate on the same event inventory; SeatLayer issues the seat-specific QR/PDF tickets after a confirmed order.
Troubleshooting
The chart area is blank. Check the event key, and that the chart is published. A draft chart has no buyer-facing version. Your browser console will name the failure.
“This event is not taking online payments yet.” No gateway is connected for
this event’s mode. Connect one under Payments in the dashboard, and note that a
test-mode event needs test credentials.
Buyers pay but never get tickets, and orders stay unconfirmed. For Razorpay,
this is almost always a missing webhook. Copy the webhook URL shown on the
Payments screen into your Razorpay dashboard and subscribe to
payment.captured, payment.failed and refund.processed. Payment confirmation
depends on it.
The event dropdown is empty in the editor. Either no secret key is saved (expected; type the key instead), or the saved key was rejected. The editor shows which.