
Met Hotel Booking turns a WordPress site into a working hotel reservation system. Guests search by dates and party size, see only the rooms that are genuinely free, and book them at a price your server calculated — never one the browser sent.
It is built for how a hotel actually sells: a night out of a pool of identical rooms, not a time slot belonging to a member of staff.
Search Results Checkout Confirmation. Four pages, created for you by the setup wizard, each one a shortcode and a Gutenberg block.
Every page is server-rendered, so rooms and prices are in the HTML your visitors and search engines receive, the search URL is shareable, and the whole flow works with JavaScript switched off.
Availability is not recalculated from your booking list on every search. Each room type carries one row per date holding what is total, sold, held, blocked and left.
That is what makes the booking safe. Taking a stay is a single conditional database statement inside a transaction: if the rooms are no longer there, the booking is refused rather than written. Two guests racing for the last room get one booking and one honest “sold out”, not two bookings and an apology in the morning.
While a guest fills in the checkout form, their rooms are held — not quietly left on sale for somebody else — and an abandoned checkout hands them back automatically.
✅ Rooms, not services — Room types with their own unit count, occupancy, gallery, amenities and public page at /rooms/your-room/
✅ A real availability calendar — One editable grid of nights. Block a date, stop arrivals, change what is on sale, in bulk or one cell at a time
✅ Pricing that follows the calendar — A base rate, then rate rules for weekends, seasons and special dates, materialised onto the nights they apply to
✅ Taxes and fees — Percentage or fixed, compounding in the order you set, with hotel-collected fees kept out of the online total
✅ Bookings admin — List, filter, create and edit stays; confirm, check in, check out, complete, cancel or mark a no-show, each one writing its own history
✅ Calendar view — A month occupancy grid, and a day view of arrivals, departures and who is in-house
✅ Guest dashboard — /my-bookings/, reached by an account or by the signed link in a guest’s own confirmation email, where a guest can view and cancel a stay
✅ Email notifications — Nine events, editable per recipient, and a log on every booking of exactly what was sent and when
✅ Payments — Stripe, plus pay at hotel, bank transfer and cash on arrival. Payment attempts are recorded, not only successes
✅ Cancellation policy — Snapshotted onto the stay at the moment it is sold, so changing your terms never rewrites terms a guest already agreed to
✅ Dashboard — Occupancy, ADR, RevPAR, today’s arrivals and departures, and revenue attributed per night
✅ SEO out of the box — Title, canonical, Open Graph, HotelRoom JSON-LD with an offer, and sitemap entries for every room and hotel page, standing down cleanly where Yoast or Rank Math is already acting
✅ Setup wizard — A few short steps from activation to a bookable room
✅ Theme-overridable templates — Copy any template into yourtheme/met-hotel-booking/ and it wins
A stay stores what it was sold for — the rate for each night, the taxes, the terms. Nothing re-derives it later from today’s price list, so an invoice a guest is holding stays the invoice you issued.
The free plugin runs a single hotel end to end. Pro adds:
.ics)Met Hotel Booking stores booking and guest data in your own WordPress database. It does not send that data anywhere except where a feature you have switched on requires it — see External Services below.
Guest-facing pages that show personal data — the confirmation receipt, the cancellation link and the guest dashboard — are gated by a token issued with the booking. A booking reference on its own never opens them.
The plugin records the IP address and browser of the device that made a booking, as booking metadata, for fraud and support purposes. That information is never included in anything the plugin sends to a third party.
This plugin connects to the following third-party services. Each one is used only for the feature named.
https://api.stripe.com. On the checkout payment step, and on a confirmation page with a balance still to pay by card, the guest’s browser loads Stripe.js from https://js.stripe.com so card details go straight to Stripe and never touch your server; it is not loaded on any other page, or when card payment is off. Stripe also sends payment events back to a webhook endpoint on your site, which are rejected unless they carry a valid signature.* Stripe Terms of Service
* Stripe Privacy Policy
https://*.tile.openstreetmap.org and sends the address you type, or the point you click, to https://nominatim.openstreetmap.org to look it up. On the frontend, a hotel page can embed a map frame from https://www.openstreetmap.org — only when you switch on Settings > Display > Embedded map, which is off by default. When it is on, the visitor’s browser loads the frame on a hotel page that has a map pin, and OpenStreetMap receives the visitor’s IP address and the hotel’s coordinates. When it is off, the address is a plain link that opens the map only if the visitor clicks it.* OpenStreetMap Terms of Use
* OpenStreetMap Privacy Policy
* Nominatim Usage Policy
If you need help or have questions, please use the WordPress.org support forum for this plugin.
Settings > Tools carries a status report — versions, tables, pages, URLs and scheduled jobs — which is the most useful thing to quote when opening a ticket.
The compiled scripts and styles in public/build/ are built from the human-readable source shipped in src/resources/. To rebuild them, run npm install and then npx wp-scripts build from the plugin folder; package.json and webpack.config.js are included for this.
For documentation and support, please visit the plugin website.