Appointments Changelog
Recent releases for WooCommerce Appointments. Older versions live in the changelog archive.
[5.4.15] - September 4, 2026
Focused on Product Add-ons and Cart. 1 improvement and 4 fixes.
Improvement
- Compatibility with WooCommerce 11.1.
Fixes
- Product Add-ons: "Use once per recurring series" follows Can be recurring? on existing and newly added fields, including when the checkbox is toggled before save.
- Product Add-ons: day/month/night products always include duration add-on fees (zero-base packages and priced bases); extended days still bill at the product rate. Duration-only options stay available: set the option price to 0 so the span grows and only the product rate applies.
- Product Add-ons: a required Quantity (input multiplier) with min 0 again accepts 0 (base duration only; no add-on cart line).
- Cart: deleting a draft (or any) order as cron/Action Scheduler again releases linked in-cart holds; abandoned-cart cleanup no longer treats a missing order ID as a live exemption.
[5.4.14] - September 3, 2026
Focused on Admin calendar, Google Calendar, and Checkout. 3 improvements and 4 fixes.
Improvements
- Admin calendar: availability SSE snackbars name the change again (saved or deleted; bursts still collapse to a count).
- Admin calendar: reorder-only availability rule saves no longer show an SSE snackbar.
- Updated all translations for new and changed strings.
Fixes
- Checkout: two or more separate cart appointments for the same product and time slot no longer fail availability when their combined quantity still fits capacity.
- Google Calendar: cancelling or trashing an appointment now removes the event from staff calendars when only staff calendars are connected (no site calendar or no site event).
- Google Calendar: successful event DELETE clears the stored site/staff event IDs; inbound staff detach drops that staff’s event ID (staff event ID map merge no longer blocks removals or updates).
- Admin calendar: fixed toolbar and day headers use locked SCSS spacing (no JS height measure); left tracks the admin menu via WP folded breakpoints so Chrome and Firefox stay flush.
[5.4.13] - September 2, 2026
Focused on Storefront. 1 fix.
Fix
- Storefront / cart: Product Add-ons that lengthen or shorten duration book the same times shown in the list, including starts right after another appointment ends and late starts that only fit a shortened length.
[5.4.12] - August 28, 2026
Focused on Product Add-ons, Storefront, and Admin panel. 3 improvements and 5 fixes.
Improvements
- Updated Product Add-ons to 8.4.1 (validation, Store API batch, global add-ons search/sort, upload index.html, WordPress Abilities).
- WooCommerce minimum supported is 10.6; WordPress minimum is 6.8 (aligned with Product Add-ons).
- Updated all translations for new and changed strings.
Fixes
- Product Add-ons: radio/checkbox options with the same label as a hidden seasonal duplicate can be purchased again; cart uses the visible option’s price (not the hidden one).
- Product Add-ons: hide price and duration labels work again on the storefront after the 8.4.1 update (including image swatch tooltips); option prices no longer wrap onto their own line.
- Storefront: add-on Title (Label/Heading from the product editor) shows again for checkbox, radio, and image fields; fieldset/legend styles match upstream so titles do not collapse.
- Product Add-ons: cart again skips TM Extra Product Options items when addons carry
epo, so both extensions can coexist after the 8.4.1 sync. - Admin panel: header/footer scroll shadows match the calendar chrome and appear from the first pixel of overflow, drawing over fields scrolled under the edges.
[5.4.11] - August 26, 2026
Focused on Product Add-ons and Orders. 1 improvement and 1 fix.
Improvement
- Product Add-ons: addon name font size and weight are no longer
!important, so themes and custom CSS can restyle them; display stays!importantso poorly styled themes do not break legend/label layout.
Fix
- Orders: paying a previously Failed order restores an order-linked appointment stuck as Was In Cart (e.g. Apple Pay retry after Auth Denied).
[5.4.10] - August 20, 2026
Focused on Google Calendar, Storefront, and Admin panel. 1 improvement and 4 fixes.
Improvement
- Compatibility with WordPress 7.1.
Fixes
- Storefront: changing staff with auto-select on keeps the selected date and time when still available; otherwise shows Show first available next to No slots available.
- Google Calendar: appointments from another site on a shared calendar import as busy rules (foreign
site_url). Editing that busy rule no longer overwrites the Google appointment event. - Google Calendar: restored
woocommerce_appointments_gcal_sync_updated_descriptionon event updates (dropped in the 5.0 sync rewrite). - Admin panel: changing day or a duration add-on no longer jumps the form scroll back to the top of the mini calendar.
[5.4.9] - August 15, 2026
Focused on Admin panel, Storefront, and Cart (+2 more). 2 improvements and 6 fixes.
Improvements
- Admin panel create: WooCommerce Deposits uses the same outlined card as billing, with pay-deposit guidance and payment plans only while paying a deposit.
- Admin panel browse: month availability includes the day’s time slots in one request; open browse joins the in-flight prefetch.
Fixes
- Cart: logging back in during checkout restores the in-cart hold; abandoned-cart cleanup no longer deletes a hold already linked to an order.
- Admin panel: mini calendar marks a day available only when at least one slot has enough capacity for the quantity field (same rule as the time list).
- Storefront: time slots refresh for the full add-on duration (longer or shorter), so late starts that no longer fit are removed from the list.
- Emails: custom theme subclasses of appointment emails no longer fatal on PHP 8 when they override
trigger()orinit_form_fields()without a: voidreturn type. - Storefront: add-ons after the calendar appear once a date (or month) is chosen, so extras that change duration stay visible when no times are left.
- Admin calendar: third-party admin notices no longer push the grid down; calendar errors still show flush under the toolbar.
[5.4.8] - August 8, 2026
Focused on Appointable product, Admin panel, and Admin calendar (+2 more). 1 feature, 6 improvements, and 12 fixes.
Feature
- Appointable product: set Padding Before and After separately on one row. Existing padding stays Before; After defaults to 0.
Improvements
- Availability / slots: the gap between appointments uses After from the earlier booking plus Before from the later one (timed, day, and shared staff). With only Before set (the default after upgrade), identical products keep the same handoff gap.
- Admin panel: create/edit recurring uses the same outlined card as billing and add-ons; schedule fields use compact floating labels in one row.
- Admin calendar: on narrow screens the period title opens a month or date picker (prev/next hide); week and list show a month label; tapping a month day opens Day view and Back returns to that month.
- Admin panel: create opens upper-biased on narrow screens; tighter floating-label insets; availability dims while checking; status chips match border to label on create/edit; customer search drops the clear control; overnight +Nd sits beside the End date floating label.
- Admin calendar: Screen Options/Help tuck with a peek and hide the toolbar when open; toolbar stays fixed under the admin bar; borderless period/view controls; wider padding on large screens.
- Storefront: Customizer Selection color skips inline CSS when it matches the default.
Fixes
- Storefront: multi-day day-duration products again highlight the booking span after picking a start day; timezone abbr shows one tip; the form still initializes when page optimizers delay jQuery or script params.
- Availability / slots: 24h duration with an hourly grid again lists each hour when the next day is also appointable.
- Admin panel: Select2 aligns on create from Add New; focused fields scroll above the mobile keyboard; mini calendar fits narrow panels; edit keeps Update in the footer (disabled until dirty).
- Admin panel create: Product Add-Ons date picker no longer closes the panel; footer cost refreshes when add-on prices change without duration.
- Admin panel: product dropdown lists appointable products again on non-calendar screens; customer search and Customer label translate on standalone create/edit.
- Admin panel: Pick from calendar keeps the selected day for staff timezones; day/all-day edit availability uses civil dates; mini calendar refreshes when product, staff, or quantity changes; switching product on edit updates date/time for the new type without jumping the panel.
- Admin panel: staff on unstaffed products is optional for managers only and ignored in availability checks.
- Admin calendar: Order Total after panel create is correct; narrow layouts keep the filter panel, month cells, and timed events in bounds; day headers stay flush under the fixed toolbar with admin notices below.
- Admin calendar: midnight appointments show when staff timezone differs from the site; opening a view scrolls to now or 08:00 in week/day, and to the top in month/list.
- Admin calendar: Screen Options and Help are usable again for admins and staff (WooCommerce sticky header no longer covers them).
- Admin: legacy Create as a Customer again books for the selected customer; configuration notices no longer appear on non-appointable products.
- Appointable product: Padding Before/After keeps equal gap when the unit wraps and no longer sits flush against the field above.
[5.4.7] - August 3, 2026
Focused on Admin panel, Admin calendar, and Availability / slots (+2 more). 9 improvements and 15 fixes.
Improvements
- Admin panel: create/edit fields use outlined floating labels (Checkout-style); status uses compact filter chips; attendance is hidden on create, editable on edit, and muted text on view; Pick from a calendar stays a compact trigger until opened.
- Admin calendar: sticky toolbar and day headers under admin chrome with one page scrollbar; the toolbar docks under the admin bar while you scroll.
- Admin: calendar/panel product list loads with a light id/title/color query instead of hydrating up to 200 full product objects on every admin load.
- Admin panel browse: day availability evaluates each rule once; all-day RRULEs reuse the in-request path instead of rebuilding minutes every civil day.
- Admin panel: primary form controls use 14px body text; series list shows date and time ranges on separate lines.
- Admin panel create: browse no longer auto-opens when a slot is unavailable; Add New without calendar prefill leaves date/time empty (date-only calendar picks still auto-select the first time).
- Admin panel: product select uses preloaded products (instant); clear (x) removed on create/edit; duplicate titles append SKU or #id; duration sits on the When row; line Total shows only when it differs from order total.
- Admin calendar: compact one-row toolbar; Add New is a leading filled button (label on wide screens, icon-only on narrow); filter button shows an active-count badge only (selections stay in the filter panel).
- Admin calendar: hovered and selected events use a white ring plus lift; selected events rise above overlaps.
Fixes
- Admin calendar (staff): appointments you create for products without assigned staff stay on the calendar immediately (creator matches the locked staff filter, same as after reload).
- Admin panel create: real midnight slots (00:00), including admin-TZ midnight, keep a timed calendar preview and availability checkmark (slot timestamp distinguishes them from date-only placeholders).
- Admin panel: narrow view fills the viewport; series uses panel scroll; customer timezone and cost lines stack; series rows are date | status | open.
- Admin calendar: switching the appointment panel from view to edit no longer flickers the calendar event (preview ghost only appears after the draft schedule changes).
- Admin calendar: full-day unavailable stripes stay on the civil day (not shifted by admin timezone); stripe tips on hover/tap instead of a modal; tapping a stripe no longer opens create; empty cells open create again.
- Admin calendar: sticky WooCommerce header chrome scoped to the calendar page only; staff Screen Options/Help no longer inflate Firefox scroll; empty preload ranges still seed so first paint skips REST; availability rules load again when indexed cache is enabled.
- Admin calendar SSE: after a recurring series materializes, the view panel gets the full occurrence list and package pricing; one series create snackbar with customer and pattern.
- Admin calendar SSE: new appointments stay after month navigation (cache insert); payloads build only when queued and flush once per request; burst creates/bookings collapse to one snackbar count.
- Admin calendar/panel (staff): product preload respects Create Appointments for Any Product; create auto-selects the logged-in staff when assigned; toolbar Add New uses the same path as slot-pick (no full reload).
- Admin panel create: required date/time errors show under those fields and clear when valid; hourly auto-select no longer rolls the form date forward when staff timezone differs from the site.
- Admin panel: Staff field shows or hides from product preload (same as add-ons); create availability responds faster; day-duration checks use the correct civil day when staff timezone differs; timed availability keeps slot timestamps when site and admin browse days differ.
- Admin panel browse: skeleton cells under a kept header; day click and view toggles reuse in-memory data; SSE invalidates browse caches while open; product switch reloads the open mini-cal.
- Availability / slots: overnight RRULE blocks (e.g. weekly Fri 22:00-02:00) again split across civil days (evening on the start day, morning on the next).
- Storefront recurring: create the series when the order reaches on-hold (cheque/BACS), not only processing/completed, so offline payment checkouts still materialize appointments.
- ICS export: offset-based store timezones (e.g.
+01:00fromgmt_offset) no longer fatal VTIMEZONE generation whenDateTimeZone::getTransitions()returns false.
[5.4.6] - July 30, 2026
Focused on Admin panel and Indexed availability. 2 fixes.
Fixes
- Admin panel: product configuration probe scans the booking horizon in capped chunks (14/30/60 days) instead of only the next two weeks, so global rules or RRULEs with a later start do not trigger false "no bookable times" notices.
- Indexed availability: index readiness and multi-staff slot generation align with fetch guards (malformed scope rows no longer mark the index ready; empty indexed batch falls back to dynamic/global rules); fixes global-only rules not applying and false product config notices after 5.4.5.
[5.4.5] - July 30, 2026
Focused on Admin panel, Storefront, and Indexed availability (+1 more). 2 improvements and 5 fixes.
Improvements
- Admin panel: Product edit shows configuration notices at the top when saved settings may prevent bookable slots; notices distinguish misconfiguration from fully booked inventory (slots engine diagnostics) and link to the matching Appointments tab.
- Admin panel: Clearer help tips on duration, interval, availability check, and rule quantity fields.
Fixes
- Indexed availability: product- or staff-scoped rules with an empty kind_id no longer leak as global rules (read-side scope guard, write-side skip on index); manual re-index reports skipped malformed rules;
get_title()returns empty string for NULL legacy titles (avoids PHP 8 TypeError on re-index). - Admin panel: Configuration check and probe use the slots provider only (indexed availability, staff merge, index fallback): no false duration-vs-window warnings on full-day or weekday rules; priority-based engine diagnostics; Availability check mismatches when slots exist but none qualify as bookable starts.
- Admin calendar: month view highlights today with the same badge as week and day views; legacy calendar falls back to week view when the saved view is List (React-only).
- Storefront time picker:
getInstanceContext()works when passed the form element (legacy theme markup); empty-day and AJAX error notices use consistentslot_row/ul/li.slotmarkup (full width, no bullet). - Storefront date picker: multi-staff autoselect uses staff-aware calendar
day_data(async month load); autoselect products skip full-range default-date scan; non-autoselect uses chunked first-slot for the pre-selected provider.
[5.4.4] - July 27, 2026
Focused on Product Add-ons integration and Admin calendar. 2 fixes.
Fixes
- Product Add-ons integration: decode jQuery
.serialize()form payloads withwp_unslash()beforeparse_str()in legacy cost filter. - Admin calendar: guest customer labels on HPOS stores read billing from
wc_order_addresses(not legacy_billing_*order meta), restoring "Name (Guest)" on calendar preload and SSE updates.
[5.4.3] - July 26, 2026
Focused on Admin calendar, ICS export, and Admin panel (+6 more). 4 improvements, 10 fixes, and 1 deprecation.
Improvements
- Admin calendar preload: eligible-ID query plus batched postmeta hydration; batched order meta (no per-order WC_Order hydration). Recurring series package summary on bulk fetch (
get_panel_preload, one load per series id); full appointment panel still loads on open. - Admin panel: remove Cancel from create/edit footer (close via X / backdrop).
- Admin calendar: Google-style grid (horizontal week lines only in month, stacked week/day headers, centered month dates); neutral toolbar chrome (admin body text/borders), segmented view switcher, primary + Add New beside Filters (icon-only; label on hover/aria).
- ICS export: log a warning when unloadable entries are skipped (WooCommerce → Status → Logs).
Fixes
- Admin calendar: toolbar spans full wrap width below Screen Options/Help; staff without WooCommerce header get Add New in the toolbar; staff/creator filter uses EXISTS (not INNER JOINs); Fake UTC civil preload range and
YmdHisrow parsing (notstrtotime); shared excluded-status list (cancelled visible; holds/trash/drafts hidden) on SQL query, legacy API, and frontend; orphan/deletedpost_parentorder IDs pre-filtered before batch order load; availability rule background stripes reload when switching months. - REST API: appointments
get_item_schema()extends the parent schema instead of starting from null. - Security: sanitize/unslash POST/GET at origin across storefront AJAX, data stores, cart, SSE, cron, widget, admin (AJAX, settings, calendar, list table, exporters, meta boxes, product edit), WPML, Google Calendar, and integrations; prepared SQL for lookups and migrations; escape output in admin views; guest-only rate limit preserved for cached pages with optional nonces.
- Storefront/admin AJAX: parse jQuery
.serialize()form payloads before per-field sanitization (notsanitize_text_field()on the encoded string — destroys%XXsequences for timezones, times, and add-on text). - SSE: preserve dotted event names (
appointment.created) in the stream;sanitize_key()stripped dots and broke admin calendar live updates. - Availability rules JSON: decode unslashed payloads first (callers pass
wp_unslash( $_POST )); double-unslash broke rule titles containing quotes. - Admin calendar: week/day column headers use browser-local date (not UTC parts); legacy week/day
data-timeandcalendar_day=links use site timezone (notgmdate); batched order line item meta resolves global attribute term names (not raw slugs) in the appointment panel. - Add Appointment and My Account series actions: read
REQUEST_METHODfrom$_SERVER(notfilter_input( INPUT_SERVER ), unreliable under some SAPIs). - Legacy install migration: delete product availability post meta by key after table migration (not a single rule value).
- ICS export: skip unloadable appointment entries so stale IDs do not fatal calendar generation.
Deprecation
WC_Product_Appointment_Rule_Manager::get_minutes_from_rules()remains as a compatibility shim; useWC_Appointment_Slots_Rule_Resolver::build_minute_mask()instead.
[5.4.2] - July 18, 2026
Focused on Indexed availability and Google Calendar. 2 fixes.
Fixes
- Indexed availability: RRULE expansion follows
range_type(same as dynamic); orphanrruleon non-rrulerules uses the non-RRULE path and purges legacy expand rows on background passes. - Google Calendar: inbound sync clears
rrulewhen an event is stored as non-recurring (custom/custom:daterange).
[5.4.1] - July 16, 2026
Focused on Indexed availability, Storefront, and Google Calendar (+3 more). 3 improvements and 5 fixes.
Improvements
- PHPStan: level 2 with a clean baseline — expanded plugin and integration stubs plus PHPDoc/type fixes across core.
- Indexed availability: occupancy reads from appointment cache when healthy (live fallback during backfill; in-cart recurring holds merged); backfill batches gap-only missing appointments.
- Storefront calendar:
data-enginereports rules/occupancy source (1 indexed, 2 dynamic, 3 indexed + appointment cache).
Fixes
- Indexed availability: weekday
time:Nrules count only matching days; re-enable no longer wipes inline indexing; backfill pending flag clears/re-queues stale jobs and stops on zero-gap batches. - Google Calendar: scheduled sync is forward-only unless admin full re-sync; inbound sync skips stale events (event ID /
site_urlmismatch). - Availability / slots: overlap day keys use Fake UTC civil midnight so 00:00 wall slots stay on the correct day on negative-offset stores.
- Orders: order-scoped line-item lookup (
$order_idonget_appointment_ids_from_order_item_id) — orphaned_appointment_order_item_idno longer shows another customer’s appointment; line delete clears the link before ID reuse. - Cart: session load removes holds tied to terminal orders or past start dates and releases
in-cartappointments towas-in-cart.
Generated from the plugin changelog on build.