
Perfect For
- Salons, barbers, clinics, therapists and personal trainers
- Classes, workshops, tours and activities
- Equipment, vehicle, boat and court hire
- Cabins, rooms, glamping and holiday lets
- Consultations and services you want to approve first
Key Features
- Any Kind of Booking – Time slots for appointments and lessons, whole days for hire, or nights with check-in and check-out dates. Fixed length or chosen by the customer.
- Classes, Tours & Events – Set how many spaces each slot has and count them by booking or by person. Customers see how many places are left.
- Staff & Resources – Staff, rooms or equipment shared across products, each with their own hours, time off, spaces and calendar colour. Customers choose, or pick “Any available”.
- Flexible Hours – Several time ranges per day, holidays, closures, special opening hours, buffers between bookings, minimum notice and a booking window.
- Smart Pricing – Base and per-block costs with rules for weekends, peak dates, times of day, longer stays and group sizes. Adults/Children prices and optional extras.
- Deposits – Take a percentage or fixed deposit at checkout. The balance is invoiced automatically with a “Pay now” link.
- Approvals – Let customers request a booking and pay only once you approve it.
- No Double Bookings – Times are held while in the cart, and every booking is checked under a database lock, so two customers can never take the last space.
- Customer Self-Service – My Account > Bookings to pay, cancel or reschedule within your rules, and add bookings to Google, Apple or Outlook calendars.
- Emails & Reminders – Confirmations with calendar invites, reminders, approval and pay-now emails, plus admin and staff notifications.
- Bookings Dashboard – Bookings list with filters, search, bulk actions and CSV export, a month/week/day calendar, and Add booking for phone and walk-in bookings.
- Calendar Sync – Private iCal feeds for all bookings or each staff member, and busy times imported from Google Calendar, Outlook, Airbnb and more.
- Page Builders – Elementor widgets with full style controls, block editor blocks, and shortcodes for other page builders.
- Any Theme – A polished “Yeti style” card in your accent colour, or “Match my theme” to use your theme’s own fonts and buttons.
- Modern WooCommerce – Any payment gateway, HPOS and the Cart and Checkout blocks. Tested with WordPress 7.1 and WooCommerce 11.2.
How It Works
- Create – choose “Bookable product” as the product type, then set the booking type, hours and prices.
- Book – customers pick a date and time, the number of people, staff and extras, and see the live price.
- Pay – checkout works with any payment gateway, with deposits or approvals if you want them.
- Manage – see everything in the bookings list and calendar, and let customers manage their own bookings.
Built for Busy Shops
- Every booking is checked and saved in one locked step. We test it by sending several requests for the last space at the same moment: exactly one gets it.
- Unpaid orders release their times after a limit you set. A payment that arrives later takes the time back only if it is still free; if not, you are told to rebook or refund.
- The Pay for order page re-checks the time before taking payment.
- If a booking can’t be updated after a payment, it is never shown as done: the order is flagged, you are emailed, and it is retried every hour, with a “Re-check bookings” order action.
- Emails are saved with each booking change and retried if sending is interrupted.
- Correct across daylight saving changes – times are stored in UTC and shown in your timezone.
- HPOS and the Cart and Checkout blocks are supported, and it passes the WordPress Plugin Check with no errors or warnings.
Put Bookings Anywhere
The booking form appears automatically on bookable product pages. You can also add a booking form, a grid of bookable products or the customer’s bookings to any page with the Elementor widgets, block editor blocks or shortcodes, which you can add in any page builder’s shortcode or text element.Requirements
- WordPress 6.5 or higher (tested on 6.5 and 7.1)
- WooCommerce 9.0 or higher (tested on 9.0 and 11.2)
- PHP 8.0 or higher (tested on PHP 8.0, 8.3 and 8.5)
Changelog:
1.0.14
- Fixed: when updating from an older version, the copying of order billing names and emails onto existing bookings (used by the bookings search) no longer skips bookings if a database read or write fails. It stops at the booking that failed and carries on from there on a later page load, and the update is only marked complete once every booking has been filled in
1.0.13
- Fixed: if the bookings already made can't be read when a time is checked (a database error), the time is no longer treated as free. Adding to the cart, rescheduling, staff changes and late payments are refused with a "please try again" message and nothing is booked or changed. A late payment is retried every hour instead of being restored or cancelled, and the booking calendar shows the error instead of free times
1.0.12
- Fixed: changing or removing a calendar link while a calendar import is being saved no longer touches the import's busy times or status. The busy times of the old link are cleared once no import is running (retried every minute until then), and they stop blocking times as soon as the link is changed. An import that has to wait for another one no longer saves anything; the problem is emailed instead
1.0.11
- Fixed: when a calendar import hits a database error while replacing busy times, or while saving which import is in use, no busy time is deleted while it may still be in use. Every busy time from the last complete import stays blocked, and the problem is shown in the admin and emailed. Removing or changing a calendar link now only clears its busy times once the new settings are saved
1.0.10
- Fixed: availability checks read imported calendar busy times as one consistent snapshot. If a calendar is replaced while a booking is being checked, the check reads again instead of seeing the old or new busy times only in part, so a time both calendars mark busy can never be booked during the replacement. If the busy times can't be read consistently, the time is treated as busy
1.0.9
- Fixed: calendar imports can no longer overlap. One import saves at a time, so two imports of the same calendar can't leave a mixture of their busy times. Each import now checks that the previous busy times were fully replaced; if they can't be removed, the import is reported as failed and the last complete import stays in force. Only the busy times of the last complete import are ever used
1.0.8
- Fixed: a payment is now decided and saved under the booking lock on the booking as it is at that moment. If its pay deadline has passed, it only gets its time back through the availability check; if another customer has taken the time, or the booking was cancelled meanwhile, it stays cancelled and the shop is told to rebook or refund
- Fixed: the admin calendar shows day and night bookings on their last date across the spring clock change (for example a single night on 28 March in the UK)
- Fixed: the admin calendar shows long bookings (more than 62 days) on every date they cover, in the month, week and day views
- Fixed: searching the bookings list by the customer's name or email now finds bookings made through the classic and block checkouts, for guests and customers with accounts, with HPOS on or off. Bookings keep a copy of their order's billing name and email, kept up to date when the order changes and removed when WooCommerce erases the order's personal data; existing bookings are filled in automatically. Search by booking number accepts #123
1.0.7
- Fixed: calendar files (confirmation email attachments, My Account .ics downloads and private calendar feeds) no longer need PHP's mbstring extension. Long lines are folded at 75 bytes without splitting accented letters, other scripts or emoji
1.0.6
- Fixed: an imported calendar whose timezone PHP doesn't know by name (such as Outlook's "Eastern Standard Time" or a custom name) is no longer read in the shop's timezone. Its times are converted using the calendar's own timezone definition or the matching Windows timezone. If the timezone still can't be worked out, the import fails with a warning naming it, and the busy times from the last complete import stay blocked
1.0.5
- Fixed: a calendar with more busy times than can be stored (5,000 in the next two years) is no longer imported in part. The import fails with a warning in the admin and by email, the busy times from the last complete import stay blocked, and the next complete calendar imports as normal
- Fixed: the price shown on the booking form includes the staff member or resource the booking will get when it is assigned automatically or the customer chooses "Any available", and the form names who it is. If that staff member is taken before the booking is added to the cart, the cart says who it is now with and the new price
- Fixed: when a customer moves a booking from My Account, the month calendar no longer counts the booking's own time against it, so a move that overlaps the current time (09:00-11:00 to 10:00-12:00) can be chosen. Other customers still see the time as taken
1.0.4
- Fixed: when a booking's cart hold runs out before it can be linked to its order, or an On hold order's pay deadline has passed, the order check and the hourly job only give it its time back through the locked availability check, with its new status and pay deadline saved in the same write. If another customer has booked the time meanwhile, the booking is cancelled instead of blocking the time again, and the shop and the customer are emailed
- Fixed: balance invoices are taxed the way the cart taxes the booking: the customer's location, the product's tax class, tax-exempt customers, and prices entered with or without tax. The deposit and the balance always add up to the full booking charge, tax included
- Fixed: bookings added in the admin with an order are taxed the same way, using the customer's saved address
- Fixed: a calendar with an event, alarm or timezone that is opened but never closed is no longer imported, even if it has no complete events at all. The busy times from the last complete import are kept and the warning is shown. A valid calendar with no events still clears the old busy times
1.0.3
- Fixed: on the Pay for order page, payment only goes ahead once each booking's renewed pay deadline has been saved and read back unchanged. If the save fails, or another request changed the booking in between, the customer is asked to try again and is not charged, and the booking lock is always released
- Fixed: a calendar that can't be read in full (a repeat rule that isn't supported, a page that isn't a calendar, a calendar cut off part way, or an event with no readable start) is no longer imported. The busy times from the last complete import stay blocked, and the warning is shown in the admin and emailed
- Fixed: capacity counts the most places in use at the same moment, so bookings that follow one another (09:00-10:00, then 10:00-11:00) share a place instead of being added together. Buffers are included. This applies to product capacity, per-person capacity and shared staff and resources
- Fixed: removing or replacing a product's or staff member's calendar link stops its busy times straight away and deletes them. A calendar that temporarily can't be downloaded still keeps its last busy times
- Fixed: if a booking can't be linked to its order, moved from In cart to Unpaid, or given its pay deadline, the order is flagged and retried hourly instead of the booking being left to run out. A payment for a booking whose cart hold ran out takes the time back through the locked check first, so it can never be marked paid on top of another customer's booking
- Fixed: removing a cart item, or re-checking an expired cart hold, only deletes the booking while it is still an unpaid cart hold, never one that another request has just checked out
- Fixed: every place that takes the booking lock releases it even if an error is thrown part way
- Fixed: a customer's reschedule only applies to the booking as it was checked (time and staff member). The booking edit form never overwrites notes added while it was open, and booking notes are added in one statement so none are lost
- Fixed: if the server cuts a product or staff form short (more fields than PHP's max_input_vars allows), the booking settings are kept and the admin is told, instead of part of them being saved
- Fixed: bookings still show people of a type the shop has since removed, and their group size if group bookings are turned off. A deleted staff member or product is shown as "#ID (deleted)" instead of a blank
- Added: a warning when a product or staff member with upcoming bookings is trashed or deleted, with a link to those bookings
1.0.2
- Fixed: the public calendar and time-slot requests check the booking length and group size against the product's limits (and reject impossible dates) before any availability work, so an oversized request can't make the server loop through a huge length
- Fixed: "Resend confirmation" and adding a booking with no order no longer stop with a PHP error. The confirmation is saved with the booking and sent through the email queue, so it is retried if sending fails; sending the Add booking form twice opens the booking it already made instead of creating a second one
- Fixed: changing a booking's staff member / resource, or setting a cancelled booking back to an active status (also with the Confirm, Mark paid and Complete actions), is checked under the booking lock against what is free now. Conflicts and failed saves are reported; "Allow double booking" saves it on purpose and notes it on the booking
- Fixed: staff and resources shared between products count each booking by the places it uses (one per booking, or one per person for products that count by person), stored with the booking, so every product's calendar sees the same space left. Existing bookings are updated automatically
- Fixed: repeating events in imported calendars (daily, weekly, monthly and yearly rules, with exceptions and moved or cancelled occurrences) now block every occurrence for the next two years. A calendar that can't be read in full, or can't be downloaded, shows a warning in the admin and is emailed to the shop once; the last good import is kept
- Fixed: if the booking can't be updated when a balance invoice is paid, it is handled like a first payment: the order is flagged and noted, staff are emailed, and the hourly retry or the "Re-check bookings" order action marks it paid
- Fixed: the hourly "Re-check bookings" retry now finds flagged orders on stores that don't use High-Performance Order Storage
- Fixed: My Account > Bookings lists upcoming and past bookings separately with pages, so a long history can never hide current bookings or their Pay now and Cancel links
- Fixed: restoring a trashed Pending payment, On hold or approval order gives its bookings back their status if their time is still free. If the time was taken meanwhile, the booking stays cancelled and the shop is told by order note and email
- Changed: "Email the customer a confirmation" unticked on Add booking now also keeps WooCommerce's own order emails to the customer quiet
- Fixed: refunding or cancelling a deposit order, or cancelling a deposit booking any other way, also cancels its unpaid balance invoice. The pay page refuses a balance for a cancelled booking, and a balance paid anyway is flagged to the shop by order note and email
- Fixed: on staff and resources shared between products, the longer buffer of the two bookings applies, so every product's calendar gives the same answer. Buffers are limited to 1440 minutes or 30 days
- Fixed: extras are stored by id, so removing or reordering a product's extras never changes what an existing booking shows or is charged for. Bookings made before 1.0.2 keep their extras
- Fixed: if a booking can't be saved when it is added to the cart, the customer is told and nothing goes into the cart
- Fixed: deleting a booking cancels it first (without emailing the customer), so its unpaid order and balance invoice can no longer be paid. The pay page also refuses an order whose booking no longer exists
- Fixed: setting a cancelled booking back to Confirmed, Paid or Deposit paid emails the customer, admin and staff a confirmation
- Added: hold limits, so one visitor can't reserve a whole calendar: at most 10 bookings in one cart and 20 new holds an hour from one connection, plus a site-wide cap of 50 live holds by visitors who aren't logged in, since an IP address can be faked (filters ybk_max_cart_bookings, ybk_holds_per_hour and ybk_guest_holds). Staff and logged-in customers are not held to the guest cap; staff are not limited at all
- Fixed: calendar feed links are never signed with an empty secret if the secret is missing. Added "Make new feed links" under Bookings > Settings, for a link shared by mistake
- Fixed: if a booking can't be cancelled when its order is cancelled, refunded or released for non-payment, the order is flagged and it is retried, instead of the booking holding its time with no deadline
- Fixed: a busy or failing database while the cart is re-checked keeps the booking in the cart with a "please refresh" notice, instead of removing it as taken
- Fixed: Approve, and the customer's Cancel booking button, report a failed save instead of saying it worked
- Added: personal data export and erase for bookings (Tools > Export / Erase Personal Data), including guest bookings found by their order's email, and suggested privacy policy text. Bookings still to come are kept and listed
- Fixed: "Delete all bookings and settings" on uninstall also removes the plugin's working options, transients, scheduled jobs and order flags
- Fixed: calendar invites carry a SEQUENCE number, and cancellation emails attach a cancelled event, so calendar apps update or remove the booking
- Fixed: Add booking searches all customers instead of listing the first 500; product and staff lists show all of them. The admin calendar and the calendar feed return every booking instead of stopping at 2,000, and the admin calendar loads customer names in one query
- Fixed: approval requests not answered before their start time are declined automatically, freeing the time, and the customer is told
- Fixed: a booking request checkout no longer also sends WooCommerce's "order on hold" email
- Fixed: guest customers are no longer sent "View or manage your booking" links to My Account, which they can't use; their emails say how to make changes
- Added: staff are emailed when a booking is moved to them or away from them (Edit, or a reschedule to another staff member)
1.0.1
- Fixed: a payment that arrives after an unpaid booking's pay deadline, before the hourly release has run, now takes the time back through the locked availability check. If another customer has taken the time since, the booking is not marked paid, and the shop is told by order note and email to rebook or refund
- Fixed: if a paid order's booking can't be updated (the database is busy or returns an error), it is no longer treated as done or as "time taken". The order is flagged and noted, the shop is emailed once, it is retried every hour, and a "Re-check bookings" order action and an admin notice let staff fix it straight away
- Fixed: an email queued by one request while another request is sending a booking's emails is no longer lost or overwritten
- Fixed: a cart hold that runs out while the cart is being checked is never revived after another customer has taken the time
- Fixed: if saving the link to a new balance order fails, the hourly recovery links that order instead of creating a second invoice, and it now works through every booking even behind ones that keep failing
- Fixed: removing a booking's line from an order cancels the booking and frees its time
- Fixed: when a retried checkout re-creates the lines of a pending order, the booking follows the new line, so a later release and late payment still restore it
- Removed: the WPBakery elements, which had not been tested with WPBakery. The shortcodes can still be added in any page builder's shortcode or text element
- Changed: the minimum versions are now WordPress 6.5, WooCommerce 9.0 and PHP 8.0, the oldest versions the full test suite has been run on
1.0.0 - Initial Release
- Bookable product type for WooCommerce
- Time slot, whole day and nightly bookings
- Fixed length or customer-chosen length
- Weekly opening hours with multiple time ranges per day
- Holidays, closures, special opening hours and store-wide closed dates
- Buffer time, minimum notice and booking window
- Spaces per slot for classes, tours and events, counted by booking or by person
- Staff and resources with their own spaces, hours, time off and calendar colours
- Customers choose staff, pick "Any available", or staff are assigned automatically
- Base and block costs with pricing rules for days, dates, times, length and group size
- Types of people with their own prices and limits
- Optional extras charged per booking, per person or per block
- Deposits with automatic balance invoices
- Requires approval option with a no-payment request checkout
- Times held in the cart and every booking checked under a lock - no double bookings
- My Account > Bookings with pay, cancel, reschedule and add-to-calendar links
- Confirmation emails with calendar invites, reminders, and admin and staff notifications
- Bookings list with filters, search, bulk actions and CSV export
- Month, week and day admin calendar
- Add booking for phone and walk-in bookings
- iCal feeds for all bookings and for each staff member
- Busy times imported from Google Calendar, Outlook, Airbnb and other iCal links
- Block editor blocks, Elementor widgets with style controls, WPBakery elements and shortcodes
- "Yeti style" and "Match my theme" display options for any theme
- HPOS and Cart/Checkout Blocks compatible, tested with WordPress 7.1 and WooCommerce 11.2
- Translation ready, with .pot template included
Only logged in customers who have purchased this product may leave a review.
Support by TheYetiDev
TheYetiDev supports this product through WPBay
Questions are handled in WPBay's private ticket system, keeping your purchase details and support conversation together.
After purchase, open this item in My Downloads and choose Get Support.
What support includes
- Answers to product-related questions
- Help with reported bugs and issues
- Guidance for included third-party assets
What support does not include
- Customizations or new features
- Installation or setup services
Maintenance snapshot
See recent updates, compatibility, support, and developer activity.
- Updated today
- Developer active recently
- WPBay support available
- WordPress 7.1 tested
Snapshot updated 17 hours ago
View details Hide details
Maintenance details
This is maintenance data. It does not measure product quality or sales.
- Last update Updated today
- Compatibility WordPress 7.1 tested · PHP 8.5 tested · WooCommerce 11 tested
- Releases 14 releases in the 16 days since listing
- Developer activity Developer active recently
- Support No recent support tickets to measure
- Docs and demo Documentation available · Changelog available · Demo available
Health remained stable during the last 90 days.
How this snapshot works
Plugin Health
The score is out of 100 and uses data WPBay can check. Ratings, popularity, and sales are not used.
- Last update 30 points
-
Plugins receive full recency points under 30 days, then step down at 90, 180, 365, and 545 days.
- Compatibility 20 points
-
WordPress, PHP, and WooCommerce (when relevant) are scored separately. The latest two PHP lines count as current. Nearby previous versions keep most of the points.
- Current version 100%
- One version behind 75%
- Two versions behind 50%
- Three versions behind 25%
- Older or not listed 0%
- Releases 15 points
-
One release earns 10, two or three earn 13, and four or more earn 15. Each accepted product ZIP counts once; reprocessing the same upload and listing-only edits do not count.
- Developer activity 15 points
-
Based on WPBay login and dashboard activity. Exact last-login dates are never shown.
- Support 15 points
-
There are no recent WPBay tickets to measure.
- Docs and demo 5 points
-
Documentation: 2. Changelog: 1. Working demo or preview: 2.
Score ranges
- 90–100 Excellent
- 75–89 Healthy
- 60–74 Fair
- 40–59 Needs attention
- 0–39 Limited
Long gaps
WPBay also checks for long gaps between updates, developer activity, support replies, and releases. Buyers do not see this score.
- Time since update 35 points
- Last developer activity 25 points
- WordPress compatibility 15 points
- Support replies 15 points
- Fewer releases 10 points
More by TheYetiDev
Explore more bestselling products from this creator.

Reviews
There are no reviews yet.