{"id":386802,"date":"2026-10-16T12:45:51","date_gmt":"2026-10-16T12:45:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/calentra-booking-for-woocommerce\/"},"modified":"2026-10-16T12:45:19","modified_gmt":"2026-10-16T12:45:19","slug":"navarro-booking-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/navarro-booking-for-woocommerce\/","author":23585793,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.5.0","stable_tag":"2.5.0","tested":"7.1.3","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Navarro Booking for WooCommerce","header_author":"Dominick Navarro","header_description":"Bookings for WooCommerce: time slots, multi-day rentals and capacity. Seats are never oversold.","assets_banners_color":"37404b","last_updated":"2026-10-16 12:45:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/dominicknavarro.com\/navarro-booking-pro","header_author_uri":"https:\/\/dominicknavarro.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.5.0":{"tag":"2.5.0","author":"shirofuji00","date":"2026-10-16 12:45:19","revision":3750436}},"upgrade_notice":{"2.5.0":"<p>New name, same plugin. No database changes.<\/p>","2.4.0":"<p>Fixes double selling of a resource shared by several products. Adds a database index and counts existing resource bookings on the first request after updating.<\/p>","2.3.0":"<p>Shows Pro&#039;s resources, locked, in the product&#039;s booking options, explained only when clicked. No database changes.<\/p>","2.2.0":"<p>Developer hooks for booking against pools of resources. No change for existing shops, and no database changes.<\/p>","2.1.0":"<p>Adds a Bookings screen under WooCommerce and a setting for how far ahead customers can book. No database changes.<\/p>","2.0.0":"<p>Prevents oversold slots and fixes bookings not being recorded in 1.1.0. Back up your database before updating; existing bookings are migrated automatically.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3750436,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3750436,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3750436,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3750436,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3750436,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3750436,"resolution":"1","location":"assets","locale":"","width":1568,"height":761},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3750436,"resolution":"2","location":"assets","locale":"","width":1228,"height":681},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3750436,"resolution":"3","location":"assets","locale":"","width":1568,"height":851},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3750436,"resolution":"4","location":"assets","locale":"","width":1920,"height":932}},"screenshots":{"1":"Choosing a time slot on the product page, with the timezone shown.","2":"Booking options on a product.","3":"Global settings.","4":"Timezone diagnostics."}},"plugin_section":[],"plugin_tags":[8132,269,416,1475,286],"plugin_category":[40,45],"plugin_contributors":[287113],"plugin_business_model":[],"class_list":["post-386802","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservations","plugin_tags-woocommerce","plugin_category-calendar-and-events","plugin_category-ecommerce","plugin_contributors-shirofuji00","plugin_committers-shirofuji00"],"banners":{"banner":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/banner-772x250.png?rev=3750436","banner_2x":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/banner-1544x500.png?rev=3750436","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/icon.svg?rev=3750436","icon":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/icon.svg?rev=3750436","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/screenshot-1.jpg?rev=3750436","caption":"Choosing a time slot on the product page, with the timezone shown."},{"src":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/screenshot-2.jpg?rev=3750436","caption":"Booking options on a product."},{"src":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/screenshot-3.jpg?rev=3750436","caption":"Global settings."},{"src":"https:\/\/ps.w.org\/navarro-booking-for-woocommerce\/assets\/screenshot-4.jpg?rev=3750436","caption":"Timezone diagnostics."}],"raw_content":"<!--section=description-->\n<p>Navarro Booking turns any WooCommerce product into something customers can book: a class, an appointment, a room for a night. Customers pick a date and a time slot (or a start and end date) on the product page, and the booking goes through the normal WooCommerce cart and checkout.<\/p>\n\n<p>It is built around three problems booking plugins are known for.<\/p>\n\n<p><strong>Never oversold.<\/strong> A slot is reserved the moment a customer adds it to the cart, with a single atomic database operation, so two customers can never both take the last place. The reservation is checked again when the order is placed; if it has lapsed and someone else has taken the slot, the order is refused before any payment is taken. The plugin ships with a public concurrency test suite that races many customers for one slot and checks that exactly the right number succeed.<\/p>\n\n<p><strong>Works with page caching.<\/strong> Availability is loaded from a public, read-only REST endpoint with no nonce, so a product page served from WP Rocket, LiteSpeed Cache or Cloudflare keeps working. There is nothing to exclude from your cache.<\/p>\n\n<p><strong>Times are right.<\/strong> Bookings are stored as exact UTC instants together with your site timezone. Customers see each slot in your timezone, labelled, with their own local time alongside when it differs. A diagnostics screen shows your site, server, database and browser clocks, upcoming daylight-saving changes, and how each upcoming booking is stored.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Time-slot bookings within opening hours, or multi-day bookings priced per night<\/li>\n<li>Per-product settings layered over global defaults<\/li>\n<li>Block whole dates or individual time slots, per product or site-wide<\/li>\n<li>Cart reservations that don't depend on WP-Cron<\/li>\n<li>Works with the block cart and checkout and the classic shortcodes<\/li>\n<li><code>.ics<\/code> calendar invite attached to order emails<\/li>\n<li>Edit a booking's date and time from the order screen (capacity is still enforced)<\/li>\n<li>Bookings released automatically when orders are cancelled, failed, refunded or deleted<\/li>\n<li>Timezone diagnostics screen<\/li>\n<li>Compatible with WooCommerce High-Performance Order Storage<\/li>\n<li>Documented actions and filters for developers (see <code>docs\/extending.md<\/code>)<\/li>\n<li>Translation-ready<\/li>\n<\/ul>\n\n<h4>Navarro Booking Pro<\/h4>\n\n<p>Navarro Booking Pro is a separate, paid plugin that adds resources: book staff, rooms or equipment, chosen by the customer or assigned to whichever is free. A resource shared by several products is never booked twice for the same time, with the same atomic guarantee as the rest of Navarro Booking.<\/p>\n\n<p>This plugin is complete without it. Nothing here is time-limited, and nothing stops working if you never buy Pro. Where resources would appear in a product's booking options, a lock explains them when clicked; there are no notices or banners.<\/p>\n\n<p><a href=\"https:\/\/dominicknavarro.com\/navarro-booking-pro\">Navarro Booking Pro<\/a><\/p>\n\n<h3>Third-Party Libraries<\/h3>\n\n<ul>\n<li>Flatpickr 4 (MIT License) \u2014 https:\/\/flatpickr.js.org\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/navarro-booking-for-woocommerce\/<\/code>, or install it from the Plugins screen, and activate it.<\/li>\n<li>Under <strong>Settings \u2192 General<\/strong>, make sure your timezone is a city (for example \"America\/New_York\"), not a fixed UTC offset.<\/li>\n<li>Visit <strong>WooCommerce \u2192 Navarro Booking Settings<\/strong> for global opening hours and blocked dates.<\/li>\n<li>Edit a product and tick <strong>Enable Booking<\/strong> in the <strong>Navarro Booking Options<\/strong> box.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20exclude%20product%20pages%20from%20my%20page%20cache%3F\"><h3>Do I need to exclude product pages from my page cache?<\/h3><\/dt>\n<dd><p>No. The booking calendar loads availability from a public REST endpoint that doesn't use a nonce, so cached pages keep working.<\/p><\/dd>\n<dt id=\"how%20long%20is%20a%20slot%20held%20while%20a%20customer%20is%20in%20checkout%3F\"><h3>How long is a slot held while a customer is in checkout?<\/h3><\/dt>\n<dd><p>60 minutes by default, changeable under WooCommerce \u2192 Navarro Booking Settings. The hold is refreshed while the customer is active in the cart or checkout. If it lapses, the slot is taken again at checkout if it is still free; if someone else has booked it, checkout is refused before payment.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20multi-day%20end%20dates%3F\"><h3>What happens to multi-day end dates?<\/h3><\/dt>\n<dd><p>The end date is the departure date. A booking from the 3rd to the 6th covers the nights of the 3rd, 4th and 5th and is priced as three nights; someone else can start a booking on the 6th.<\/p><\/dd>\n<dt id=\"can%20more%20than%20one%20customer%20book%20the%20same%20slot%3F\"><h3>Can more than one customer book the same slot?<\/h3><\/dt>\n<dd><p>Each slot holds one booking by default. Developers can raise the number of places with the <code>calentra_slot_capacity<\/code> filter; everything else, including the concurrency guarantees, works with any capacity.<\/p><\/dd>\n<dt id=\"does%20it%20sync%20with%20google%20calendar%3F\"><h3>Does it sync with Google Calendar?<\/h3><\/dt>\n<dd><p>Every order email carries an <code>.ics<\/code> invite that any calendar app can import. There is no two-way sync.<\/p><\/dd>\n<dt id=\"i%27m%20upgrading%20from%201.x.%20what%20happens%20to%20my%20bookings%3F\"><h3>I'm upgrading from 1.x. What happens to my bookings?<\/h3><\/dt>\n<dd><p>They are migrated on the first page load after the update. Version 1.1.0 had a bug that stopped bookings reaching its bookings table; the migration recovers those from your orders, so slots already sold stay blocked. The old table is kept as a backup until you delete the plugin.<\/p><\/dd>\n<dt id=\"is%20there%20a%20paid%20version%3F\"><h3>Is there a paid version?<\/h3><\/dt>\n<dd><p>Yes, <a href=\"https:\/\/dominicknavarro.com\/navarro-booking-pro\">Navarro Booking Pro<\/a>, a separate plugin that adds bookable staff, rooms and equipment. Everything described above is in this free plugin and stays free.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>Change: renamed from Calentra Booking for WooCommerce to Navarro Booking for WooCommerce. Settings, bookings and developer hooks are unchanged.<\/li>\n<\/ul>\n\n<h4>2.4.1<\/h4>\n\n<ul>\n<li>Change: the bundled Freemius SDK is removed. This plugin contains no licensing, update or telemetry code. \"Learn more\" and \"Upgrade\" now link to the Navarro Booking Pro page.<\/li>\n<li>Dev: the timezone diagnostics screen now loads its script and styles as enqueued assets rather than printing them inline.<\/li>\n<li>Dev: compiled translations are no longer bundled. Translations are served through translate.wordpress.org instead.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Fix: a resource offered by several products (a teacher, a room) is now counted once across all of them. Before, each product counted it separately, so two products could both sell the last place on it for the same time. Bookings that overlap are caught even when the products' slots start at different times.<\/li>\n<li>Fix: \"Rebuild inventory\" on the diagnostics screen no longer undercounts a slot that has a lapsed cart hold.<\/li>\n<li>Dev: <code>calentra_slot_capacity<\/code> is also asked with product 0 for a resource's whole capacity. A booking on a resource may span at most about 33 hours (<code>calentra_too_long<\/code>).<\/li>\n<li>Fix: the Booking Options panel now opens in the main column instead of the narrow side column, where its times, blocked dates and resource rows were squeezed. If you have already dragged it somewhere, WordPress keeps your own arrangement.<\/li>\n<li>The update counts existing bookings on resources once, on the first request after updating. For a perfectly clean update, put the shop in maintenance mode or run the update with WP-CLI before customers reach it; otherwise use \"Rebuild inventory\" afterwards.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>New: Navarro Booking Pro's resources are shown where they would be in the product's booking options, with a lock. The lock explains itself only when clicked and is not shown once Pro is active. No notices, no dashboard widget, and nothing on activation.<\/li>\n<li>New: \"Settings\" and \"Upgrade\" links on the Plugins screen.<\/li>\n<li>Dev: <code>calentra_feature_unlocked<\/code> says whether a feature is available, and <code>calentra_upgrade_url<\/code> sets where \"learn more\" goes. It is empty by default, and then no link is shown.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Dev: <code>calentra_claim_resources<\/code> lets an extension pool resources. Core tries each candidate with the same atomic claim in turn, and the first with room wins, so \"any free member of staff\" or \"any free room\" never needs a read-then-write.<\/li>\n<li>Dev: the cart remembers which resource a hold was actually claimed on, so the customer's own hold is found again instead of a second seat being claimed.<\/li>\n<li>Dev: the date picker sends <code>resource_id<\/code> when the product form has a <code>calentra_resource_id<\/code> field, and reloads availability when it changes.<\/li>\n<li>Dev: <code>calentra_ics_summary<\/code> filters the title of the <code>.ics<\/code> invite.<\/li>\n<li>Dev: when <code>calentra_claim_resources<\/code> offers no resource at all, the claim fails with \"Choose a resource for this booking\" instead of claiming the slot was just taken, and <code>calentra_claim_failed<\/code> does not fire.<\/li>\n<li>No change in behaviour without an extension using these.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>New: WooCommerce \u2192 Bookings lists bookings with their product, resource, start and end in the site timezone, seats, status and order. Filter by product, status and date range.<\/li>\n<li>New: how far ahead customers can book is now a setting, with a global default (365 days) and an optional per-product limit. It was fixed at 365 days.<\/li>\n<li>New: the availability endpoint accepts an optional <code>resource_id<\/code> and returns it in every response, so extensions that book against resources can ask about one resource at a time. Responses without it are unchanged apart from the added <code>\"resource_id\": 0<\/code>.<\/li>\n<li>Dev: <code>calentra_resource_label<\/code> filter names resources in the bookings list.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New: slots are reserved atomically when added to the cart, and confirmed atomically at checkout. A slot can no longer sell more seats than it has, including under heavy concurrent traffic.<\/li>\n<li>New: the date picker loads availability from a public REST endpoint, so it works on cached pages.<\/li>\n<li>New: bookings are stored as UTC instants with the site timezone; slots are labelled with their timezone and the customer's local time.<\/li>\n<li>New: timezone diagnostics screen.<\/li>\n<li>New: cart hold duration setting.<\/li>\n<li>New: <code>.ics<\/code> invites built from the stored UTC time, with a stable UID; temporary files are removed after sending.<\/li>\n<li>New: actions and filters for extensions, documented in <code>docs\/extending.md<\/code>.<\/li>\n<li>Fix: requested dates and times were not checked when added to the cart, so blocked, past or out-of-hours slots could be bought.<\/li>\n<li>Fix: bookings from 1.1.0 were never saved to the bookings table, and <code>.ics<\/code> invites were never attached. Existing orders are migrated.<\/li>\n<li>Fix: global blocked dates and blocked time slots could not be saved.<\/li>\n<li>Fix: booking options are saved only for products, with nonce and capability checks. 1.x wrote empty booking settings onto every page and post you saved; these are removed.<\/li>\n<li>Fix: invalid blocked dates are reported instead of silently ignored.<\/li>\n<li>Fix: multi-day availability no longer loads every order on every request.<\/li>\n<li>Fix: \"Hide Quantity Field\" now applies on the shop front end.<\/li>\n<li>Fix: multi-day price display no longer assumes the Philippine peso.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Multi-day bookings.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Time-slot and multi-day bookings for WooCommerce: real capacity, a cache-safe calendar and timezone-correct times. Seats are never oversold.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/386802","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=386802"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/shirofuji00"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=386802"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=386802"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=386802"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=386802"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=386802"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=386802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}