Description
BookingHive extends WooCommerce with bookable and rentable products. It adds a booking calendar to the product page, prices each stay from a seasonal price list, and keeps every reservation in a dedicated dashboard — so the shop you already run starts selling nights, days and weeks instead of pieces.
Use it for anything billed per date range: apartments, hotel rooms, cabins, glamping tents, boats and yachts, campers, cars, kayaks, equipment, or a coach’s calendar.
Key features
- 📅 Booking calendar on the product page – two months at a glance, unavailable dates greyed out, the price recalculated as the customer picks a range.
- 💰 Seasonal price lists – a separate rate per period and per year, so low and high season live side by side on one product.
- 🔁 Period rules – let customers book any interval, whole weeks starting on a chosen weekday, or nothing less than the entire period.
- 🛏️ More than one booking a day – give a price period a capacity and the same product sells to several customers at once: four pitches, six kayaks, ten seats on a tour. Leave it empty and the product stays a one-booking-a-day rental, priced per stay.
- 👥 Guests or units – decide whether the count is one cart line carrying the number of guests, or the WooCommerce cart quantity. On a period that has a capacity the count multiplies the price; on a period without one the price is for the whole stay.
- 🗂️ Reservations dashboard – every stay in one screen, grouped by month, with filters, per-night breakdown and order status changes.
- 🔔 Stay reminders and self-service cancellation – automatic e-mails before arrival and a signed link that lets the guest cancel without contacting you.
- 👀 Social proof on the product page – “someone just booked”, “X people viewed this in the last 24 hours” and occupancy badges, all optional.
Designed for real-world rental operations
📅 A calendar that reflects what is actually free
The calendar reads the price list and the existing reservations, so a customer only ever sees dates you can honour. Past days, days outside any price period and days already taken are unavailable — and a departure day may double as the next guest’s arrival day, so changeovers do not cost you a night. On a period with a capacity a day stays open until its seats run out, and the quantity selector narrows itself to the fewest free seats in the range the customer picked.
💰 Rates that follow the season
Every price list row covers a date range and holds its own nightly rate. A product can carry as many rows as the year needs — off-season, shoulder season, peak weeks — and each year is kept separately, so publishing next year’s rates does not disturb the current one.
🔁 Rules that match how you rent
Three period rules cover the usual rental patterns: Any range for flexible stays, Week for Saturday-to-Saturday charters, Whole range for a fixed event or a full-season lease. The rule is set per period, so the same product can be flexible in May and weekly in August.
👥 Pricing per property or per item
In guest mode the number of people is recorded with the reservation but does not change the price — the way an apartment or a house is sold. In unit mode the quantity multiplies the price and flows into the WooCommerce cart quantity — the way kayaks, bikes and gear are rented.
🗂️ One screen for the whole season
The Reservations dashboard reads bookings from its own table rather than from the order list, so a five-night stay is one row, not five. Cards are grouped by month and carry the guest, product, status, amount and night count. Filters narrow the view by guest, order, product, status and date range; a details modal shows the price of every single night, which reminders went out, and lets you move the order to another status.
🔔 Messaging that runs itself
Reminders go out 14 days, 7 days and one day before arrival — each point can be switched off separately. Every booking confirmation carries a cancellation link signed for that reservation alone, and a configurable cutoff (24 hours by default) decides how late a guest may still cancel. A confirmation e-mail closes the loop.
👀 Demand made visible
The optional Spectator Views module shows how much attention an offer gets: live viewers, recent bookings, a popularity badge above a view threshold you set, and an occupancy badge based on how full the coming weeks already are. Colours, corners and thresholds are configurable, and you can limit the whole thing to selected categories or products — or to administrators only while you try it out.
🛡️ Server-side validation
Availability and price are re-checked on the server when the item enters the cart and again before payment, so a stale page or a tampered request cannot book an occupied date or set its own price.
🌍 Translation ready and integration friendly
The plugin ships with a Polish translation and is ready for others through translate.wordpress.org, works with Polylang and WPML, and supports EU Omnibus price-history plugins.
Where everything lives in the admin
The plugin adds a BookingHive menu with four tabs, each with its own linkable URL: Global settings (admin.php?page=bookinghive&tab=general), Modules (&tab=modules), Support (&tab=support) and Partners and services (&tab=partners_and_services). The Reservations dashboard has its own entry in the same menu.
Every booking product gains a Price List tab in WooCommerce’s Product data box, next to Linked Products and Advanced. It holds the quantity mode and the changeover day for this product, a year switcher, the table of price rows — date range, rate, period rule, Edit and Delete — and an Add row button.
The Modules tab lists all three modules. Core is marked Always enabled and has no toggle: it is what registers the Booking product type, the price list, the calendar and the reservation logic, so the plugin has no purpose without it. Spectator Views and Stay Notifications can be switched off freely — their features leave the storefront and the admin, while their settings stay in the database and come back unchanged when the module is enabled again.
Changeover days, spelled out
By default the day a stay ends stays open for the next guest’s arrival, so a turnover costs you nothing — bear in mind the departure day is still billed to the departing guest, so that day is effectively sold twice. Rentals that need preparing between customers — a boat, a camper, a car — can switch Changeover day to Blocked for a service day, plugin-wide under BookingHive Global settings or per product in its Price List tab. Either way a day in the middle of a stay is never offered, a departure day already claimed as someone else’s arrival closes as well, and a one-day booking blocks its whole day, being an arrival and a departure at once. The setting takes effect immediately, including for reservations already placed — so switching to Blocked for a service day can turn away, at checkout, a customer who already has a changeover day sitting in their cart.
What BookingHive does not do
- It does not talk to channel managers or external booking platforms, and sends no reservation or diagnostic data anywhere — everything stays in your own database.
- A reservation is a virtual product, so WooCommerce calculates no shipping for it. The checkout needs at least one payment method that accepts virtual orders — a bank transfer will do.
- Price periods on one product should not overlap. For a day covered by two rows the first matching row wins, which gets hard to predict once rows are edited — end one period the day before the next begins.
- Reminder e-mails ride on WP-Cron, which only fires when somebody visits the site. On a quiet shop, point a system cron at
wp-cron.phponce a day.
Screenshots












Installation
- In the WordPress admin go to Plugins > Add New Plugin and search for “BookingHive”, or upload the ZIP under Plugins > Add New > Upload Plugin.
- Activate the plugin. WooCommerce has to be installed and active.
- Create or edit a product and set its product type to Booking.
- Open the product’s Price List tab and add at least one row for the current year: a date range, a rate and a period rule.
- Review BookingHive > Global settings for the default quantity mode and the changeover day behaviour.
- Enable Spectator Views and Stay Notifications under BookingHive > Modules if you want them, and configure each from its own Settings button.
- Incoming bookings appear under BookingHive > Reservations, grouped by month.
FAQ
-
What does BookingHive add to a WooCommerce product?
-
A new product type called Booking. Such a product gains a Price List tab in the admin, where you define date ranges with their nightly rates and booking rules, and a booking calendar on the storefront, where the customer picks a date range and sees the price recalculated instantly. Everything else — cart, checkout, orders, e-mails, reports — stays standard WooCommerce.
-
How is the price of a stay calculated?
-
From the price list, on the server. Each selected day is charged at the rate of the price list row covering it, and the total is the sum of those days, the last selected day included. A range from 18 to 22 August at a rate of 512 therefore costs 2,560. The amount that arrives from the browser is never trusted: the plugin recalculates it from the stored price list before the item enters the cart.
-
Can different dates have different prices?
-
Yes, and that is the point of the price list. Every row covers a date range and holds its own rate, so a single product can price off-season, shoulder season and peak weeks differently. Rows are kept per year, so next year’s rates can be prepared without touching the current season.
-
What booking rules are available?
-
Three. Any range lets the customer book any interval inside the period. Week allows whole weeks only, starting on the weekday you choose — the usual pattern for boat charters. Whole range allows only the entire period, for a fixed event or a full-season lease. The rule belongs to the price list row, so one product can use different rules in different seasons.
-
Does the calendar know which dates are already taken?
-
Yes. It reads existing reservations and blocks dates held by orders in the processing, completed, pending and on-hold statuses. Cancelled, refunded and failed orders release their dates. A day that is only a check-out for one booking and a check-in for another stays available, so back-to-back stays are possible. Where a price period declares a capacity the calendar counts seats instead of blocking outright: the day closes only when they are all taken.
-
Can two customers book the same dates at once?
-
No. Availability is validated on the server when the product is added to the cart and again on the cart and checkout pages, and the reservation write itself is serialised: two checkouts completing at the same instant are processed one after the other, and each re-checks the dates immediately before saving. The first one takes the dates and the second is refused with a clear message, so a double booking cannot go through.
-
Does the number of guests change the price?
-
It depends on the price period. A period with a Capacity is sold per seat, so the count multiplies the price; a period without one is sold per stay, and the count is recorded for your information only. Declaring a capacity is the single switch for both — a shop that never sets one keeps the pricing it has always had.
The Quantity mode setting decides what the count means rather than whether it counts: Guests keeps the stay as one cart line carrying the number of people, Units makes the count the WooCommerce cart quantity, which suits renting several identical items. It is set globally and can be overridden on any product.
-
Can I sell the same product to more than one customer on the same day?
-
Yes. Put a Capacity on the price-list row — four pitches, six kayaks, ten seats — and the plugin counts how many are taken on each day instead of treating the day as free or blocked. A day is offered until its seats run out, the quantity selector on the product page cannot be raised above the fewest free seats in the selected range, and the same check runs again on the server when the product is added to the cart and once more, under a lock, as the order is saved. A customer asking for more seats than remain is told how many are left.
Capacity lives on the price-list row rather than on the product, so high season can offer a different number of places than low season. An empty field means one booking a day, which is how every price list written before this feature behaves.
-
Where do I see and manage the reservations?
-
On the Reservations screen the plugin adds to the admin menu. It lists stays rather than orders, grouped by month, with tiles for the totals and revenue, filters by guest, order number, product, status and date range, and a details modal holding the guest’s contact data, the price of every night, the reminders already sent and a control to change the order status.
-
Can guests cancel a booking themselves?
-
Yes, if the Stay Notifications module is enabled. Every booking confirmation includes a cancellation link signed for that reservation, and a cutoff setting — 24 hours before arrival by default — decides how late it still works. A confirmation e-mail is sent once the cancellation goes through, and the released dates return to the calendar.
-
Which languages does the plugin support?
-
The interface is in English and ships with a Polish translation. Other languages come from the WordPress.org translation platform at translate.wordpress.org, where anyone can contribute them, and WordPress installs them on its own — nothing needs to be copied into the plugin folder. Multilingual sites are supported through Polylang and WPML.
-
Does BookingHive send my data anywhere?
-
No. No reservation or diagnostic data leaves the shop as part of normal operation: there is no call home to iLabs and no third-party service involved. Reminder and cancellation e-mails are sent by the shop’s own WooCommerce mail system, and the plugin does not synchronise with channel managers or external booking platforms.
-
Can I turn the modules off?
-
Spectator Views and Stay Notifications, yes — under BookingHive Modules, at any time. Their features leave the storefront and the admin while their settings stay in the database, so switching a module back on restores its previous configuration unchanged. Core cannot be turned off: it provides the Booking product type, the price list, the calendar and the reservation saving, so the plugin would do nothing without it.
-
Why did the cancellation link stop working?
-
Because the cutoff passed. The link is signed for one reservation and works only until the Cancellation cutoff (hours) setting is reached — 24 hours before arrival by default. After that it refuses the cancellation on purpose; that is the setting doing its job, not a broken link.
-
I am updating from 1.0.x — what do I have to watch out for?
-
2.0.0 is a rewrite and it does not migrate 1.0.x data: price lists move from the
booking_price_list_<year>product meta tobookinghive_price_list_<year>, and reservations from the{prefix}inspirelabs_bookingstable to{prefix}bookinghive_bookings. Nothing is deleted, but 2.0.0 does not read the old names — so booking products come up with an empty price list, and dates already sold stop blocking the calendar until the reservations are re-created. Update on a copy of the shop first and write to kontakt@ilabs.dev; with so few 1.0.x installs left we will help move the data across by hand. -
Where do I get help?
-
Write to kontakt@ilabs.dev, or visit https://bookinghive.ilabs.dev, where the user manual, the FAQ and technical support live. The same contact is repeated inside the plugin, under BookingHive Support.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“BookingHive – Reservation Calendar for WooCommerce” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “BookingHive – Reservation Calendar for WooCommerce” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
2.1.0
- New: capacity per price period. A price-list row can now say how many seats or units it sells per day, so one product serves several customers at once — pitches, kayaks, seats on a tour. Leave the field empty and the product behaves exactly as before: one booking a day, priced per stay.
- Where a period declares a capacity, the price is multiplied by the number of seats booked. Periods without one are still priced per stay, so no existing price list changes what it charges.
- The product page shows what is left: the quantity selector cannot exceed the fewest free seats in the selected range, and a refusal says how many places remain instead of only that the dates are taken.
- Availability now counts seats rather than answering free or taken, including on changeover days: a departure day may still be someone’s arrival and an arrival day may still be someone’s departure, each up to the capacity.
- New: a “Powered by BookingHive” credit. A small grey line links back to BookingHive below the booking form on the product page, in the footer of WooCommerce customer e-mails whose order holds a booking, and in all three stay e-mails. It is rendered by default; the
bookinghive_powered_by_htmlandbookinghive_powered_by_textfilters restyle or remove it. - Fixed: a date range longer than two days silently cleared itself after the calendar was moved to another month. The day click handler was bound a second time on every month change, and the duplicate run discarded the selection it had just made. This affected every booking product.
- Fixed: the reservations table stored prices as whole numbers, so a night priced 77.50 was recorded as 77.00. Reservations written before this release keep the truncated figure; the orders themselves were always charged correctly.
- The admin panel no longer shows the “Partners and services” tab or the partner banner above the settings tabs. Both are only hidden, not removed: the
bookinghive_show_partners_tabandbookinghive_show_sitecare_bannerfilters bring either one back. - Fixed: the “Book Now” tab, and with it the whole booking calendar, was added to every product in the shop, so an ordinary product offered a calendar that could never be submitted. The tab now appears only on products of type booking.
- The booking form’s fonts, stylesheet and scripts are loaded only on pages that actually show the form — a booking product or a page carrying the
[ilabs_ibooking_form]shortcode — instead of on every page of the shop. A page builder that keeps its content out of the post body can force them back with thebookinghive_load_booking_form_assetsfilter. - Fixed: on a server where several sites share one PHP-FPM pool and opcache with
opcache.use_cwd=0, the plugin could pick up another site’s bootstrap file, and every front-end request then died with a missing-class fatal error.
2.0.1
- Housekeeping release, no functional changes. Declares compatibility with WordPress 7.1, states the licence consistently as GPLv3 or later and ships the full licence text, and moves the tested-WordPress version into readme.txt alone so it can be raised without a new release.
2.0.0
- New Reservations dashboard: stays grouped by month, totals and revenue tiles, filters by guest, order, product, status and date range, and a details modal with a per-night price breakdown and order status control.
- Stay Notifications module: reminders 14 days, 7 days and one day before arrival, plus a signed self-service cancellation link with a configurable cutoff and a confirmation e-mail.
- Spectator Views module: live viewer counts, recent-booking notices, popularity and occupancy badges with configurable thresholds, colours and product scope.
- Quantity modes: choose whether the quantity is guest information or a price multiplier, globally and per product.
- Availability and price are validated on the server when adding to the cart and before payment, so stale pages and tampered requests can no longer book occupied dates or set their own price.
- Reservation writes are serialised per product and re-checked immediately before saving, so two checkouts completing at the same instant can no longer both book the same dates.
- The booking reminder e-mail now uses the standard WooCommerce frame like the other two, greets the customer by name, lists every booked date with the product name, and counts the days until arrival with correct grammar in every language.
- The Reservations screen now shows dates, weekdays and month headings in the language of the person looking at it, while amounts follow the shop’s own currency settings — the same symbol, position and separators WooCommerce uses everywhere else, whatever language the user works in.
- Compatible with High-Performance Order Storage. The Reservations screen reads order data through WooCommerce rather than the posts tables, so customer names, the guest search and the links to orders keep working whichever storage the shop uses.
- Booking calendar redesigned around a two-month grid.
- Two customers could book the very same two days. A two-day stay consists of nothing but its arrival and departure day, and a day carrying one of those markers alone counts as available, so such a stay blocked no day at all and the shop happily sold it twice. Booking rules are now checked against the whole requested range rather than each date on its own: a changeover day may be used only in the opposite role — arriving where someone leaves, or leaving where someone arrives — and a range that swallows another guest’s stay is refused in the cart, at checkout and when the reservation is saved.
- The Week and Whole range period rules are enforced on the server, not only in the calendar. A single day of an object rented in whole weeks, or a part of a Whole range period, used to pass validation when the request bypassed the calendar; it also left the rest of that week or period unsellable as a whole, because a full period then contained an occupied day.
- Back-to-back stays are possible at last. The rule the documentation has always described — one guest may arrive on the day another leaves — was never wired up: the code marking arrival and departure days was dead, so every booked day, the departure day included, stayed blocked and the object lost a day on every changeover. It now applies to the calendar, the REST price list and the cart and checkout validation alike, and a one-day booking still blocks its day whole. Rentals needing a service day between customers can keep the whole day blocked with the new Changeover day setting, plugin-wide under BookingHive – Global settings or per product in its Price List tab.
- Paging the booking calendar to another month works again on the storefront. The month loaded by the arrows was requested without a product, so every one of its days came back unbookable; the same fault made the year select in the price list empty the list instead of loading that year’s rows.
- The week start day can now be changed on a price list row that already exists. Picking the Week rule while editing a saved row reveals the Start of period select, which until now appeared only when adding a new row — changing the weekday meant deleting the row and entering it again.
- The package now ships only the English source strings and the Polish translation. The eight abandoned translation files that had been sitting in the plugin since 2022 covered less than a fifth of the interface and left the rest of it in English mid-screen; other languages now come from translate.wordpress.org, where they can actually be kept up to date.
- Fixed the misspelled month name shown in the calendar and the price list: “Febraury” is now “February”, in the English interface and in every translation catalogue.
- Rebranded to BookingHive. The Support tab now points at the BookingHive channels: kontakt@ilabs.dev and https://bookinghive.ilabs.dev, where the user manual, the FAQ and technical support live.
1.0.1
- Details of booking in notification emails.
1.0.0
- Initial release.
