Appointments Changelog
A comprehensive record of all changes, improvements, and fixes made to the WooCommerce Appointments plugin across all versions.
Badges:LatestCurrent stable releasePre-releaseBeta, RC, or alpha version
[5.3.1.2] - April 8, 2026
LatestFixes
- Admin panel: resolved "Call to unknown method: WC_Product::get_staff_ids()" by ensuring it is only called on valid appointment products with the missing method check.
- Product Add-Ons duration + padding: storefront cost/availability checks for time-based products now include padding in extended-range slot coverage, preventing false "Sorry, the selected slot is not available." when add-ons extend duration across slot boundaries.
[5.3.1.1] - April 8, 2026
Fixes
- Storefront time slots: full selected calendar day in the customer timezone as UTC bounds, not server-default
strtotime(Y-m-d); interval padding uses minutes, not seconds. - Slots provider: store-local range via
wp_date/DateTimeImmutable, with ±1 day widening for timezone hour/minute products and a higher widen cap so boundary-crossing slots are not clipped. - Storefront time-slot list: day filter uses
wp_datein the display timezone (anchored onfrom) so widened slot queries do not show adjacent calendar days. - Multi-day day-unit products: picker reads bottleneck capacity from the start date only, matching checkout instead of treating continuation days as fully unavailable.
[5.3.1] - April 7, 2026
Fixes
- WooCommerce Deposits: paying the balance on a follow-up order no longer forces the original (parent) appointable order to Processing; order status is left to the deposits extension, matching simple-product behavior.
- Product Add-Ons (duration): add-on minutes extending past the last full grid step no longer invalidate the slot when the booking still fits before close; engine clips to appointable hours and grouped time-slot lists omit partial starts.
- Multi-day day-unit products: storefront and admin pickers no longer allow starts that span into a fully blocked day; slot capacity,
day_datamerge rules, and multi-day calendar checks align with checkout validation. - “Per day” quantity (hour/minute products): after daily capacity is reached, the rest of that calendar day is unavailable in storefront slots and admin get-slots AJAX, without changing core overlap math.
- “Per day” + multiple staff: staff-assigned appointments are no longer duplicated into the aggregate (no-staff) day bucket, so one staff hitting daily capacity does not clear the whole day for every other staff.
- Admin panel: WooCommerce
admin.cssis now enqueued on every panel load so WC form/select styling is present on non-WooCommerce admin screens.
[5.3.0] - April 7, 2026
Improvements
- Admin panel: integrated WordPress admin color schemes for consistent styling across management interfaces.
- Code quality: expanded static analysis coverage to resolve linting warnings, translation placeholder clarifications, and PHP 8.1+ deprecation notices.
Fixes
- Admin panel: editing an appointment no longer marks its own date/time as unavailable; AJAX now passes appointment ID and excludes it from overlap/booked counts when editable and product-matched.
- Admin panel browse slots (edit mode): selected-date slots now include the current appointment's own slot (
editing_appointment_idpassed to day-slots AJAX with overlap exclusion). - Month duration products: month iteration now uses store timezone via
wp_date()instead of UTCDateTime('@timestamp'), and usesend_ts - 1for exclusive-end month boundary alignment. - Storefront timezone picker: timezone changes now update
wc_appointments_timezoneuser meta for logged-in staff/managers too; booking form prioritizes user meta over cookie to prevent stale zone reloads. - Frontend calendar (hour/minute products):
wc_appointments_find_scheduled_day_slotsnow resolves customer timezone from product timezone anddisplay_timezonePOST before cookie fallback. - Frontend date picker: customer timezone now resolves from
#wc_appointments_field_timezonefirst, then cookie; calendar AJAX sendsdisplay_timezoneand month cache key includes it. - Slots collection / legacy adapter: offset-shifted hour/minute customer-day bucketing now uses site-timezone
wp_date()and site-local midnight anchors (not UTC/strtotime('Y-m-d')) with stable legacy keys. - Admin panel: Product Add-Ons file upload in create flow now sends real FormData file (
$_FILES) instead of fake input path (C:\fakepath\...). - Admin panel: product AJAX search now stores plain labels for React/options while Select2 templates render styled product ID and assigned-to-you hints with shared CSS classes.
- Admin panel (create/edit, timed products): when display timezone differs from site timezone,
get_day_slotsno longer includes prior-day slots for selected date; filtering aligns withadmin_time/admin_dateconversion path. - Appointment slots: resolved future-date (e.g., Aug 2026) 2-hour timezone shift by aligning engine time-snapping anchor with plugin Fake UTC architecture.
- Appointment slots: aligned slot indexer and engine handling so UTC timestamps are treated as neutral wall-clock hours, preventing DST drift.
- Availability rules: corrected RRule boundary calculations to use site-local timezone context, fixing false-unavailable future slots.
- Admin panel: resolved PHP 8.1+ "Using null as an array offset" deprecation warning in order item table via targeted interception around internal WooCommerce templates.
- SCSS: resolved "Unknown property: 'speak'" linter warning in admin management styles.
- Admin management: resolved all-day appointment end-date saving issues where durations were incorrectly adjusted by site offsets.
- Day-unit appointments: overlap indexing now aligns multi-day bookings to site-local midnights for whole-day durations, preventing next-day false full-booked state.
- Admin panel browse (timed products): when display timezone differs from site timezone,
get_month_availabilitynow rebuckets day summaries in that timezone and mini-calendar day selection followshasDifferentTzkey space. - Admin panel:
get_day_slotsnow returnstimematching displayed wall clock in admin timezone mode; live preview uses selected slotstart_tswhen available. - Admin panel: availability timezone helpers no longer call string methods on missing dates; date-range availability uses a consistent end-range anchor date.
- Admin panel: browse opening no longer causes slow height motion; shell transitions only opacity/transform, inline top/max-height updates apply immediately, and ResizeObserver delta is fixed.
- Admin panel: bottom-anchored contextual panel no longer clips footer actions when browse opens; max-height/min-height/scroll floor constraints now keep full panel visible.
- Admin panel (outside admin calendar): view panel no longer opens with tiny max-height near viewport bottom; anchored shells now use viewport-capped max-height and preserve anchor-relative positioning.
- Admin calendar: drag-drop/resize now sync saved start/end into event
extendedPropsand open panel data (wcaPanel.updateApptData) without full event refetch. - Admin panel (day/all-day edit): end-date input now normalizes both stored end formats (exclusive midnight and inclusive
23:59:59) to consistent inclusive display. - Admin calendar toast messages: all-day updates now render date-only schedule text with semantic all-day dates (no timezone-adjusted clock/day shift) for cross-timezone staff edits/moves.
[5.3.0-rc3] - April 3, 2026
Pre-releaseImprovements
- Admin panel: optimized vertical space with increased maximum height (800px) and smart adaptive positioning that maintains header stability when browsing availability.
- Admin panel: smoother expansion/contraction animations with removed vertical shifting and scaling for a cleaner initial opening experience.
- WordPress 7.0 compatibility fixes, mainly UI changes.
- Admin panel: renamed the "Find available slot" browse button to "Pick from a calendar" and updated its icon to a calendar with a clock face for better clarity of its toggle functionality.
- Admin calendar: optimized real-time toast notifications with a 3-toast display limit and smart grouping of similar, rapid-fire events into translatable bulk messages to reduce UI clutter.
Fixes
- Admin panel: edit panel for overnight/multi-day timed appointments (e.g. 12h base + 12h addon = 24h) now correctly shows [startDate] [startTime] → [endDate] [endTime] layout instead of hiding time inputs. Browse availability now loads and displays time slot chips for these appointments. Fixed BrowsePanel day click handler that skipped slot loading when showDateRange was true.
- Admin panel: time slots were incorrectly shifted by 2 hours on non-UTC sites due to double timezone conversion of site-local timestamps.
- Admin panel: available slots now correctly converted to staff member's local timezone in the day picker by utilizing the centralized timestamp converter.
- Admin panel: month availability dots now correctly reflect shifts when slots cross day boundaries in staff/admin timezones; expanded query range to capture boundary-crossing slots.
- Admin panel: fixed input height and vertical alignment in appointment edit panel CSS to prevent layout shifting.
- Addon duration not applied correctly on frontend: product with 12h duration + addon for extra 12h (720h) would only have the base 12h duration after checkout. Availability now checked against full addon-extended duration by default; _end_date uses duration_total (includes addons via appointment_form_posted_total_duration filter). New get_extended_range_available_capacity() validates ranges spanning multiple consecutive slots. Respects availability_span product setting ('start' checks only starting slot as before).
- Admin panel: addon duration not applied when creating appointments. Addon duration was not passed to wc_appointments_get_posted_data(), so _end_date only reflected base product duration. Also fixed: staff slot validation now handles extended ranges spanning multiple slots; JS now sends addon duration in availability check AJAX and force-recomputes end time when addons change.
- Admin panel: overnight appointments (duration extending past midnight via addons or late slots) now display a "+Nd" badge next to the end time, show correct multi-day calendar preview, and no longer trigger a false "Start and end times cannot be the same" validation error. Server correctly computes end timestamp using explicit days offset.
- Admin panel: Missing Order note when making changes in the new "edit appointment" view. Note formatting now matches calendar drag-and-drop actions.
- Admin panel: Added option to change end date for all-day appointments in admin edit panel.
- Admin calendar: dragging or resizing overnight appointments (timed events spanning multiple days) in Month view now correctly preserves original start and end times instead of altering them to midnight.
- Midnight (00:00) time slot missing when product is configured for 24/7 availability due to timezone mismatch in slot generation engine.
- Frontend slot renderer: disabled mandatory in-memory caching to ensure real-time accuracy. The renderer now respects the
disable_slots_cacheparameter (true by default), ensuring fresh availability is fetched on every day/month navigation. - Use of undefined constant 'MINUTE_IN_SECONDS' in new AJAX handler: added safety-net definitions for all standard WordPress time constants in the main plugin file to ensure compatibility across all environments.
- Static analysis: resolved "void" assignment error with absint() core function by using explicit (int) abs() casts for product and staff IDs in AJAX requests.
- Admin panel: resolved "Call to unknown method: WC_Product::get_staff_ids()" by ensuring all appointable product objects are correctly instantiated via get_wc_product_appointment(); also fixed incorrect esc_html() usage in AJAX handlers.
- Admin panel: resolved "Argument '1' passed to set_taxes() must be of type array, bool given" TypeError in AJAX handler.
- SCSS: removed redundant 'vertical-align' properties from block-level elements across admin and frontend styles to resolve linter warnings.
- Admin panel: removed redundant 'float' from date and week selectors in the calendar navigation header.
- Admin calendar: added translators comments to clarify %d placeholders in toast notification strings.
[5.3.0-rc2] - March 28, 2026
Pre-releaseImprovements
- Admin panel: Staff members can now view appointments they created in the admin calendar, even when no staff is assigned. This allows creators to track their own administrative work while maintaining restricted access to others' appointments.
- Admin panel: Product selection switched to AJAX-based search with infinite scrolling (perfect for sites with many products).
- Admin panel: Products without assigned staff are now visible to restricted staff users.
- Admin panel: "Create as a Customer" dropdown option added to the create panel header (enabled via Screen Options).
- Admin panel: Enabled by default. Use
wc_appointments_admin_panel_enabledfilter to disable it.
Fixes
- Admin panel: staff-less product availability now correctly ignores admin-selected staff filters (e.g., from a previously viewed calendar). Added server-side validation and React-side state synchronization.
- Admin panel: robust timezone synchronization for daily slots and availability check.
- Admin panel: prioritized Unix timestamps for server-side validation to avoid timezone drift.
- Admin panel: improved day boundary filtering for non-UTC site timezones.
- Admin panel: time slots incorrectly spanned into adjacent days on non-UTC sites. Slots V3 engine and AJAX handlers now consistently use site-timezone midnight for snapping, indexing, and display.
- Admin panel: "To" time input failed to auto-populate upon slot selection or manual start-time change when staff timezone differed from site timezone. Refactored duration calculators with robust time parsing and switched to atomic React state updates.
- Admin panel: staff users were incorrectly blocked from fetching product details for items they could select, causing synchronization failures.
- All-day appointments: availability check incorrectly reported "unavailable" for multi-day ranges. Slots V3 engine and Data Normalizer now anchor to site-local midnight instead of UTC, ensuring accurate slot generation and indexing on non-UTC sites.
- Admin panel: appointment edit preview incorrectly removed one day from multi-day all-day durations due to DST-unsafe millisecond arithmetic. Refactored to use robust date-component incrementing.
[5.3.0-rc1] - March 26, 2026
Pre-releaseImprovement
- PHP 8.6 compatibility fully tested.
Fixes
- PHP 8.3+: prevent fatal TypeError when WP passes
nulltoadmin_footer_textfilter. - Admin panel: prevent
panelStatus is not definedconsole error on sites that concatenate scripts into a wrapper scope (read panel sub-modules fromwindow.*and ensure extracted modules exposewindow.panelStatus/window.panelBrowse). - Day/month duration products: slots showed as available but returned "unavailable" on non-UTC sites — slot engine was anchoring day slots to UTC midnight instead of site-timezone midnight, causing a timestamp mismatch with the form submission.
- Day/month duration products: admin panel browse calendar showed no available dates and availability check always returned unavailable —
get_month_availabilityandcheck_availabilitywere building timestamps withstrtotime()(UTC midnight) instead of site-timezone midnight, mismatching the engine-generated slots. - Day/month duration products: checkout availability validation blocked bookings due to form
_end_datediverging from the slot generator's end date by an hour when the timezone spanned across a Daylight Saving Time shift. Replacedstrtotime()with timezone-awareDateTimemodifiers. - Month duration products: past months were unconditionally generated and showed on the frontend calendar instead of being skipped.
- Month duration products: controller aggressively overwrote
end_datewithstrtotime('+1 month')breaking custom duration selections and causing UTC drift. - Timezone display: Replaced static Australia/Oceania timezone abbreviation map to allow PHP's native, DST-aware timezone display labels (e.g. AEDT instead of AEST during Daylight Saving Time).
- Order emails showed appointment status as "Unpaid" instead of "Paid" for full-payment orders. WooCommerce fires customer emails during order save() (inside payment_complete), before the woocommerce_payment_complete action where appointments were previously marked as paid. Fixed by running publish_appointments at hook priority 1 on woocommerce_order_status_processing/completed, ensuring appointments are marked paid before WooCommerce dispatches emails at priority 10.
- Frontend: selecting an unavailable date showed empty time columns with dashes instead of the "No slots available" notice. This happened when the slot collection included adjacent-day slots (due to timezone range widening) which were correctly filtered out by date, but left the outer HTML structure intact. Controller now returns an empty string if no slots match the requested day.
[5.3.0-beta6] - March 24, 2026
Pre-release✨ Feature
- Indexing staleness tracking - we need to track index at all times, even when disabled so it works fine, backfill the stale indexes.
Improvements
- Admin calendar: week/day time grid uses 30-minute default selection and preview (matches slot hover); create preview and FC select mirror styled like the slot hover overlay for less visual jump.
- Admin panel: customer, order, billing, and status row/section icons use the same SVG assets as WooCommerce Blocks (
customer-account,bag,check-payment,product-filter-statusinplugins/woocommerce/client/blocks/assets/js/icons/library/), not generic Dashicons-style substitutes. - Admin panel: product icon SVG aligned with WooCommerce core Product Collection block (
product-collection/icon.tsx), not@wordpress/iconsbox. - Admin panel: staff row uses person silhouette (
comment-author-avatarfrom@wordpress/icons); duration uses clock (scheduled). Replaces institution building + post-date glyph. - Admin panel: Dashicons replaced with WordPress Icons –style SVGs (same 24×24 system as the block editor) for a minimal, modern look; new
panel/wp-icons.jsbundle and.wca-wp-iconstyling. - Admin panel: modularized into sub-modules (panel-helpers, panel-status, panel-browse, panel-form) with proper script dependencies for better maintainability and caching.
- Admin panel: unified header across view/edit/create modes with timezone abbreviation always visible.
- Admin panel: edit and view mode-switch buttons promoted from dropdown to icon-only header buttons (before the more icon) with title tooltips for quicker access.
- Admin panel: "Edit in WordPress" link in more menu opens WP edit screen.
- Admin panel: inline price override editing in create footer with excl-tax flag for correct base cost calculation.
- Admin panel: SCSS refactored with shared mixins (cal-day-states, wp-icon-size, skeleton-bg) to eliminate duplicated calendar day state styles.
- Admin panel: create success step — no footer; centered checkmark; "Appointment created successfully." heading; product / schedule / IDs on separate lines; single header-style pencil button loads the new appointment into panel edit mode (REST).
- Admin panel: new i18n keys for date/month range unavailability messages, slot selection prompts, and info-level slot notices.
- Admin panel: addons read-only display (wca-addons-list) in view/edit modes.
- Admin panel: collapsible section toggle arrow sizing matched to select2 dropdown arrows for visual consistency.
- PHP 8.5 compatibility fully tested.
Fixes
- Bundled php-rrule (rlanvin/php-rrule, already at latest v2.6.0 on Packagist): patched
RRule.phpto assign return values fromsetTimezone/setTimeZonesoDateTimeImmutableis handled correctly (fixes PHP 8.x “return value should be used” warnings and ensures timezone conversion actually applies). - Admin panel: calendar live preview title for create/edit now shows the customer display name only (WooCommerce customer search labels often append email and user id).
- Admin calendar + panel: changing appointment time/date scrolls every relevant vertical scroll container (not only the first
.fc-scroller) and the document when needed, so the live preview event stays in view and the panel repositions next to it; panelupdateTriggerruns after layout viarequestAnimationFrameinstead of waiting on smooth scroll. Preview scroll keeps ~100px viewport padding and centers the event vertically in the viewport when page scroll is needed (aligned with the panel, which is centered on the event). - Admin panel: day-based and month-based products — browse calendar now highlights the selected start date/month from
dateFrom/monthFrom(not a staledatefield), keepsdatein sync when picking days, recenters the strip on the correct day, and reloads availability when the product changes so dots/cells match the selected product. - Admin panel: day/month-range create — calendar prefill often sets start and end to the same day/month; multi-day/month products now recompute the inclusive end when that happens, and cost/availability checks are skipped until the range matches duration (avoids a false “date range is not available” until re-selecting dates).
- Admin panel:
globeandinfoSVG paths inwp-icons.jswere invalid (React console errors on<path d>); replaced with paths from@wordpress/iconsv12. - Admin panel: tax handling for price override — panel sends appointment_override_price_excl_tax flag so override is used as base cost directly, while modal path retains existing tax-display-aware logic.
- Admin panel: SelectWoo/Select2 labels showed raw HTML entities (e.g. –) for customer/order AJAX search and static enhanced selects — labels are now stripped of tags and entity-decoded for display.
- Admin panel: Product Add-Ons duration options now update end time / end date (and hidden PAO qty stays in sync with appointment quantity), matching the create appointment modal.
- Admin panel + create modal: unselecting add-ons that added day/month duration no longer leaves the extended end date in place; time-based end time also updates when clearing add-on minutes (modal previously skipped recalculation when addon duration was 0).
- Admin panel: create panel not opening from WP submenu "Add New" link on non-calendar admin pages — panel JS now enqueued globally when the panel feature is enabled, so its click interceptors are available on all admin pages.
- Corrected @since version tags (5.4.0/5.5.0 → 5.3.0) across panel JS, AutomateWoo integration, and timezone helper files.
- Frontend date picker: calendar AJAX now uses
dataType: 'json'and normalizes string or double-encoded JSON payloads before merging, avoiding jQuery$.eachTypeError when proxies or misconfigured responses leave the body unparsed. - Make sure date picker ajax calls define json output to avoid server-side caching issues.
- Frontend date picker: multi-day and multi-month products no longer treat later span days' "fully scheduled" (as booking starts) as blocking the day before a booking; calendar matches server day-slot logic (e.g. 2-day product with a Wed start blocks Wed–Thu, not Tue–Thu).
- Slots engine (dynamic / non-indexed path): overlap index for existing day/month appointments no longer extends
get_end()by an extra day; that matched indexed-cache behavior and frees the first calendar day after the booking (exclusive end is already correct). - Add to cart redirect should server product permalink by default.
- Timezone change spanning to prev/next day should show include slots for that day. Issue #1320.
- Guard against 'wc_appointments_sync_with_padding' $product type, so it does not return fatal error. Issue #1323.
- Pricing rules need array check to prevent fatal error when not defined correctly.
- gCal recurring event that ends on date bug. Issue #1322.
- gCal allday event syncs extra day in 5.3.0-beta-5. Issue #1321.
- Add missing rrule to ICS export generation. Issue #1317.
- Date should not be translated inside admin metabox page for editing appointments.
- React warning for appointment-admin-panel.js: mountPanel() always called wp.element.render(), which in React 18 still goes through the legacy ReactDOM.render() path and triggers that console message.
[5.3.0-beta5] - March 16, 2026
Pre-releaseImprovements
- Admin calendar: dedicated side panel assets (appointment-admin-panel CSS/JS) and build integration for the create/view/edit panel.
- Updated translations for all shipped locales (de_DE, es_ES, fr_FR, he_IL, it_IT, nl_NL, sl_SI).
Fixes
- Multi-day duration not working in 5.3.0-beta4. Issue #1312.
- Google Calendar sync for staff deactivating: OAuth access token was not renewed automatically because no cron ran to refresh it. Added recurring Action Scheduler job (every 50 minutes by default) to refresh GCal tokens for global and all staff with a stored refresh token. Interval is filterable via woocommerce_appointments_gcal_token_refresh_interval.
- Indexer did not save days rules where start and end are the same correctly, but should have bound it to midnight. Issue #1246.
[5.3.0-beta4] - March 11, 2026
Pre-release✨ Feature
- Admin calendar: new side panel (create/view/edit appointments, filters), disabled by default; enable via wc_appointments_admin_panel_enabled filter.
Improvements
- Added acquire_refresh_lock() / release_refresh_lock() + lock logic around the refresh path.
- Rewrote increment_auth_strikes() / reset_auth_strikes() to use wp_options with a 30s cooldown.
- Added $payload['refresh_token'] persistence in the refresh path.
- Added store_access_token() / get_durable_access_token() using wp_options + user_meta.
- handle_deauthorize() no longer deletes calendar_id / twoway for staff.
- Added $access_token_cache instance property.
- Compatibility with WooCommerce 10.6.
- Snippet for shared capacity between products doesn't work in 5.x.
- Updated Product Add-ons to 8.2.0.
Fixes
- Use the same end convention as the slots engine (midnight of the next day) when building posted data for day/month products. Issue #1312.
- Validation issue in admin modal and the new panel returns error, but should not.
- Unavailable slots can be clicked (but not booked) in 5.x, reintroduced with 5.3.0-beta1. Issue #1246.
- Overnight rules not respected for dynamic minute mask extension before data normalization, works fine for indexed rules. Issue #1083.
- Missing slots in 5.2.8 - can only be reproduced on old products. Issue #1307.
[5.3.0-beta3] - March 9, 2026
Pre-releaseImprovements
- REST API v2 slots endpoint (get_items) always uses Provider; legacy use_legacy code path and duplicate slot-generation logic removed. Category filtering moved into get_items_via_provider().
- Admin AJAX: time-slot and day-slot handlers use WC_Appointment_Slots_Provider only; legacy Controller fallbacks removed. On Provider failure, time-slot request returns user-facing error message; month summary returns empty array.
- Admin create/edit appointment: staff slot validation and max-quantity-for-selection use Provider::get_time_slots_collection() directly instead of get_cached_slots_in_range + get_cached_time_slots.
- Cart manager checkout overbooking check uses Provider::get_time_slots_collection() instead of Controller cached-slot pipeline.
- WC_Product_Appointment::get_available_slots() and get_first_available_slot() use Provider::get_time_slots_collection() as primary path; indexed/horizon branch removed in favor of Provider.
- Month picker get_appointment_slots() uses Provider::get_slots() with summary level directly instead of Controller::get_cached_slots_in_range().
- Controller legacy slot methods and debug helpers: find_scheduled_day_slots_orig(), dbg_enabled(), dbg_log(), and remaining deprecated cached-slot/rule methods (merge_rules_for_staff, derive_availability_ranges_from_rules, get_cached_slots_in_range variants, get_cached_time_slots, get_cached_available_slots, get_cached_time_slots_html, etc.). Provider is the single source of truth for slot generation.
- Ajax date picker check should not run indefinitely when an exception occurs; the response is no longer empty and has the expected keys.
Fix
- Same-day all-day (day-based) appointments were incorrectly removed from the cart when loading from session: past-date check now compares all-day appointments against the start of the current day instead of the current time, so bookings for today remain in cart.
[5.3.0-beta2] - March 8, 2026
Pre-release✨ Features
- Inline slot pricing: discounted prices displayed on date picker and time slots when pricing rules apply. New WC_Appointment_Slots_Pricing engine computes per-slot preview prices during generation with multi-layer caching (rule compile cache, staff cost cache, format dedupe cache).
- Rule Resolver (WC_Appointment_Slots_Rule_Resolver): builds per-day minute-mask from parsed in-memory availability rules, replacing per-slot check_availability_rules_against_time() calls for the Dynamic Engine path.
- Rule Minutes helper (WC_Appointment_Slots_Rule_Minutes): self-contained rule-to-minute computation extracted from Rule Manager, handles all rule types (days, weeks, months, custom, rrule, time ranges including overnight).
- Performance logger (WC_Appointment_Slots_Perf_Logger): toggleable zero-overhead timing instrumentation via WCA_SLOTS_PERF_LOG constant for pipeline profiling.
- Upgrade routine (WC_Appointment_Slots_Upgrade): one-time covering index optimization for the Index Engine's 2-query pattern on the availability cache table.
- Native time-slots HTML renderer (WC_Appointments_Controller::render_time_slots_html): consumes WC_Appointment_Slot objects directly from Collection — no legacy format conversion needed.
Improvements
- Data Normalizer 3-phase staff merge: index path minute-mask now mirrors Rule Resolver's staff mask accumulation and union semantics for consistent results across Index and Dynamic engines.
- Collection grouping for time-slot display (get_grouped_for_time_slots_display): multi-staff "no preference" aggregates capacity across all staff per unique start_ts, with pre-computed availability messages and price badges.
- Admin AJAX time-slot handler now uses Provider → Collection → render_time_slots_html as primary path, with legacy get_cached_time_slots_html as emergency fallback only.
- Slot price preview shows WooCommerce-style sale price format (strikethrough original + discounted) only when slot is actually discounted below base price.
- Legacy Filter Bridge register_hooks() intentionally disabled — documented rationale for avoiding circular shadow pipeline. Legacy filters now fire within Provider pipeline via apply_available_slots_filter() and apply_time_slots_filter().
- Controller::find_scheduled_day_slots_orig() — emergency fallback only, Provider handles day-slot generation.
- Controller::merge_rules_for_staff() — only used by deprecated cached slot methods; engine handles internally.
- Controller::derive_availability_ranges_from_rules() — only used by deprecated cached slot methods; engine minute-mask replaces this.
[5.3.0-beta1] - March 6, 2026
Pre-release✨ Features
- Slots V3 architecture: new slot generation pipeline with WC_Appointment_Slots_Provider as the single source of truth.
- Unified Slots Engine (WC_Appointment_Slots_Engine): single engine replaces separate Index and Dynamic engines. Data Normalizer (WC_Appointment_Slots_Data_Normalizer) abstracts the data source (SQL cache table vs in-memory rules) so the algorithm is identical regardless of path.
- Rule Resolver (WC_Appointment_Slots_Rule_Resolver): builds per-day minute-mask from parsed availability rules, replacing per-slot check_availability_rules_against_time calls.
- Engine Helpers trait (WC_Appointment_Slots_Engine_Helpers): shared algorithms (cap_end_date, minute_mask_to_ranges, count_overlapping, should_skip_slot, compute_slot_count).
- Immutable WC_Appointment_Slot value objects with capacity tracking (total, booked, available, occupancy percentage).
- WC_Appointment_Slots_Collection with hierarchical day/month summaries and per-staff breakdowns.
- Modern day_data format: pre-computed per-day availability data (status, occupancy_pct, remaining_bucket, per_staff breakdown) sent alongside legacy format in AJAX responses for declarative date picker rendering.
- Date picker occupancy indicators: days with bookings display visual occupancy bars via partial_scheduled + remaining_scheduled_N CSS classes driven by day_data.
- REST API v3 endpoint: GET /wc-appointments/v3/slots with product_id, start_date, end_date, staff_id, level params.
- New AJAX endpoint wc_appointments_get_slots for modern slot queries with summary/days/slots/full response levels.
- Legacy filter bridge: deprecated filters (wc_appointments_product_get_available_slots, woocommerce_appointments_time_slots) applied externally for backward compatibility.
- Future-proof WC_Appointment_Slot with nullable location_id, resource_id, recurrence_id properties for upcoming features.
Improvements
- Beta release for 5.3.0 slots architecture. API and code versioning remain 5.3.0.
- Controller delegation: find_scheduled_day_slots(), get_cached_time_slots(), get_cached_slots_in_range(), get_cached_available_slots() all delegate to Provider.
- Simplified AJAX handlers: eliminated redundant Provider + Controller dual-path fallbacks.
- Cache warmup wired directly to Provider for faster slot pre-generation.
- Centralized index availability check: WC_Appointment_Slots_Provider::is_index_available() replaces duplicated checks.
- Occupancy display fix: uses slot counts instead of cumulative capacity sums for accurate day-level occupancy.
- Timezone-aware restricted_days check in date picker: adjacent-day check prevents days from being incorrectly disabled when customer timezone differs from site timezone.
- Cleaned up debug artifacts (timing vars, counters) from active code paths.
- Controller::cache_horizon_ts() — Provider handles horizon checks internally.
- Controller::should_use_indexed_availability() — Provider routes to engine internally.
- Controller::get_cached_slots_in_range_for_month/day/hour_or_minutes() — Provider generates slots directly.
- Controller::get_cached_appointments() — Provider engine fetches appointment data via own queries.
- Controller::dbg_log()/dbg_enabled() — only used by deprecated methods.
- WC_Product_Appointment::get_slots_in_range() — use WC_Appointment_Slots_Provider::get_slots() instead.
- WC_Product_Appointment::get_slots_in_range_lazy() — use WC_Appointment_Slots_Provider::get_slots() instead.
- WC_Product_Appointment::get_slots_in_range_for_hour_or_minutes() — engine generates time slots directly.
- WC_Product_Appointment::get_slots_in_range_for_day() — engine generates day slots directly.
- WC_Product_Appointment::get_slots_in_range_for_month() — engine generates month slots directly.
- WC_Product_Appointment::get_appointable_minute_start_and_end() — use minute_mask_to_ranges() trait method.
- WC_Product_Appointment::get_appointable_minute_slots_for_date() — engine slot-chunking loop replaces this.
- WC_Product_Appointment::get_unavailable_minutes() — overlap index in engine handles capacity deduction.
- WC_Appointment_Slots_Index_Engine — merged into unified WC_Appointment_Slots_Engine.
- WC_Appointment_Slots_Dynamic_Engine — merged into unified WC_Appointment_Slots_Engine.
[5.2.8] - March 3, 2026
Improvements
- Clear date, time, addons and cost on month/year switching on the date picker.
- Remove all transient caching from the slot generation, actually slows down loading with indexing enabled.
- Add a fail-safe approach to "woocommerce_appointments_time_slots" filter by adding back the 10th arg.
Fixes
- all-day appointments are timezone agnostic, treat them like that in admin calendar and elsewhere.
- edge case when indexing is disabled, indexing rules and appointments should not add them to the cache table.
- Failed Schedule Action wc-appointment-reminder (Twilio SMS connection). Issue #1305.
- Rule priority order should be respected from DB query. Issue #1306.
- When timezones are disabled for frontend do not account for the timezone cookie, which might remain from previous state.
- Admin datepicker header navigation SCSS is slightly off.
- Recurring time rule lasting till midnight does not show day as available on the calendar.
[5.2.7] - February 28, 2026
Fixes
- Staff availability rules are now indexed to the availability cache during save (synchronously), same as global rules, so availability is correct immediately after saving.
- Staff rule indexing was previously deferred to async jobs and could result in corrupted or missing cache entries; indexing now runs in the same request after the transaction commit.
[5.2.6] - February 28, 2026
Improvement
- Clear the date selection when switching months, so users start fresh in the new month without a confusing half-selected state.
Fixes
- Google Calendar sync is not converting to timezone properly when syncing back from the calendar in utc time zone.
- When main calendar is disconnected, leave staff sync intact, should work uninterrupted.
[5.2.5] - February 26, 2026
✨ Features
- Add timezone enable/disable setting, not just the filter. Filter overrides the setting.
- Add much more context to admin/staff when customer books in different timezone.
- Add timezone context to admin and staff separately, when in different timezone for all involved: admin, staff and customer.
Improvements
- Remove "—" before time selection in date-time form.
- Gcal sync should not deuthorize instantly and should deuthorize only after 3 failed attempts.
- Stale appointments shown from cache briefly and then hidden. Issue #1301.
- Add a setting to disable the timezones inside Appointment WooCommerce settings.
- Updated all translations. Added translations for the General product settings.
- FOUC fixes applied to availability rule settings, which did not render nice from initial load.
- Show uploaded files in addon fields as links in appointment viewing modal in admin.
- Centralize cart simulation for testing, so any plugin can hook in, woocommerce default factored in.
- Snippet to show month/year dropdown on frontend booking form doesn't work. Issue #1300.
Fixes
- date and time format should never use localize version for internal checking. 3-layer fix applied.
- gcal_availability_rules() calls set_sync_token() without user context.
- sync_from_gcal should return after the staff loop to avoid re-running the global sync with a potentially corrupted context.
- date and time format should never use localize version for internal checking. 3-layer fix applied.
- When staff disconnects the sync with gcal, it disconnects the main calendar sync. clear local tokens only. Issue #1298.
- When staff disconnects the sync with gcal, it should clear their calendar as well as gcal config to avoid stale data.
- PayPal sandbox testing can cause overbooking. Not a live example, but still should not do that.
- Fix already_indexed_in_request guard to track status — allow re-index on status change.
- Count of synced rules includes expired rules, but shouldn't.
- Yellow background highlighting availability rows should be removed when out of input focus.
- Timezones strtching to other days when switched do not open those days for certain availability rule types.
[5.2.4] - February 21, 2026
✨ Feature
- Added a 'woocommerce_appointments_show_timezone' filter that allows disabling timezone coversions plugin-wide. More in developer docs.
Improvements
- Disable datepicker caching, can lead to false date disabling and doesn't add much to rendering speed.
- Also show timezone shortname and description for product and global availability rules.
- Show customer's timezone in their admin profile and in staff shown Customers admin page.
- Updated all translations. Merged some almost the same strings for translation.
Fixes
- Double-counting in booked_qty_per_day_by_staff where specific-staff appointments are incorrectly pushed into the [0] aggregate bucket.
- Staff selection in product edit screen needs CSS fix.
[5.2.3] - February 21, 2026
Fixes
- Appointments with month duration not showing slots.
- Display error earlier in slot generation so it does not get caught in loading loop.
- No preference availability should not be overwritten with empty array.
- Handle overnight rules better, availability rule with same start and end should apply 24/7 availability.
[5.2.2] - February 20, 2026
✨ Feature
- Staff permissions: Rules set by staff now sectioned into minimal, standard and full, staff doesn't need that many options.
Improvements
- ICS export not working for other calendars (only works for gCal). Issue #970.
- Updated all translations. Staff permission settings missing translations.
- Appointments edited in admin calendar should instantly sync to the Google calendar, when connected.
- Appointment creation modal now has slightly polised UX, less autoclosing/autoopening, better timing and spacing.
- Appointment creation modal and viewing modal should have a simple link to appointment edit page, no fancy redirects.
Fixes
- Staff permission for editing and creating products not working, but should grant staff access to all products.
- Automatically assigned staff together issue when no staff assigned. Issue #1292.
- Patch non-indexed path where showing sold out slots could trigger fatal error through filter.
- Minimal CSS patch to prevent transition effect (added elsewhere) on datepicker back/forward buttons.
- Patch to show status drodown correctly on appointment viewing modal when statuses have long translations.
- Timezone change to UTC on frontend not working. Issue #1294.
- Timezone text on frontend not changing when selecting default. Issue #1295.
- Timezone overnight change not reflected on the calendar date picker. Issue #438.
- Appointment vierwing modal shows wrong duration for daily or monthly duration types. Issue #1296.
- Timezone should also be added to daily and monthly durations during creation or editing in admin calendar. Issue #1296.
- When product is selected in modal, end date/time is not adjusted based on product duration.
- When staff creates appointment in modal, they should be assigned to the product, not any other staff member.
- When staff is logged in, admin calendar should server preload appointment for the staff, but loads the via API (slower).
- Fix get_slots_availability to expand DB query range by padding. Issue #1256.
- Fix indexed path to include padded range more strictly. Issue #1256.
[5.2.1] - February 17, 2026
Improvements
- Remove JS hover effect for back/forward buttons on the frontend date picker, CSS styling only. Issue #1276.
- Add back option for Add as customer in modal for creating appointment, needs Screen options enabling. Issue #1290.
- Add better error feedback notice for quantity in admin modal for creating appointments.
- Refactored responsiveness and mobile UX for viewing and creating appointment modals in admin.
- Admin modal for viewing appointments status changing for more statuses, moved into conntent from modal footer.
- Updated all translations.
Fixes
- Admin modal for creating appointments should refresh mini date picker when quantity or staff chanage. Issue #1289.
- Staff dashboard link to availability section in their profile is broken.
[5.2.0] - February 16, 2026
✨ Features
- Staff dashboard: Migrated from custom submenu page to native WordPress dashboard widgets using wp_add_dashboard_widget().
- Staff dashboard: 8 individual widgets — Overview, Appointment Trends, Upcoming Appointments, Insights, This Week, Monthly Schedule, Top Products, Quick Actions.
- Staff dashboard: 3-column layout with automatic widget placement for staff users on first visit.
- Staff dashboard: Pending appointments alert rendered as native WP admin notice at the top of the dashboard.
- Refactored email timezone approach so each recipient will receive appointment times in separate email in their own timezone.
- Refactored admin calendar filtering system to work much better.
Improvements
- Staff dashboard: Removed forced redirect from WP dashboard (index.php) to custom page — staff now land on the native dashboard.
- Staff dashboard: WordPress Dashboard menu item now visible for staff users.
- Staff dashboard: Admin bar "Dashboard" link points to WP dashboard instead of old custom page.
- Staff dashboard: Default WP/WooCommerce widgets removed for staff to keep dashboard focused on appointments.
- Staff dashboard: Split monolithic template into 8 widget partials in views/dashboard-widgets/.
- Remove extra week addded to month view in admin as it adds confusion.
- Missed cached/indexed path are now patched: slots API, availability widget and block, finding default date.
- Add timezone in my-account, so customer always know which timezone appointment time is displayed in.
- Update all translations. Fixed mistranslated strings.
- When panel in admin modal for creating appointments is toggled gently scroll to the content if outside the viewport.
- Make past appointments faded, but not semi-transparent.
- Faster product preload for appointment creation modal.
- Add a legend to the footer of admin calendar, indicating stripped background meaning.
- Timezone setting for staff should include current timezone suggestion, same as customer setting does in my-account on frontend.
- Add appointment ID to toast messages in admin calendar.
- Staff dashboard should align more with the profile color scheme staff selects.
- Staff dashboard: Removed old html-staff-dashboard.php template, add_dashboard_page(), render_dashboard(), and redirect_staff_dashboard() methods.
- Staff dashboard: Updated all references from old page slug (wca-staff-dashboard) to admin_url('index.php').
Fixes
- Staff can create appointments with any product if permission allows it, otherwise not.
- Staff control panel live update/refresh does not work.
- Availability check in modal wrongly allowed manually entered time that wasn't available with selected staff.
- Are you sure not translatable in admin modal prompt.
- When product is selected in admin calendar filter, preselect it when creating appointment from calendar with name set, not just ID.
- Current week widget for staff did not account for timezone.
- Admin modal for creating appointments has slightly bigger font now, 13->14px.
- DST adjustments on all levels, use wall-clock-based conversion instead of offset, time conversion should follow exact date as well.
- Email order summary timezone conversion not working for admin and staff and still shows times in customers timezone.
- Some email templates are falsely flagged as not-admin email types, but they are, timezone conversion suffers in some cases.
- "appointment_time_from" validates input incorrectly inside modal for creating appointments.
- Toast message in admin calendar should only appear once for single action.
- Current time and day in week and day view should also be timezone aware in admin calendar.
- Invalidate cache selectively in admin calendar when appointments change to update stale cache and prevent double rendering.
- Recurring rules display also needs to account for the timezone of user.
- When admin is editing staff profile, edit in admin's timezone, but still show what timezone staff has set.
[5.2.0-beta5] - February 12, 2026
Pre-release✨ Features
- Admin modal: Month-duration products now show a 4×3 month-picker grid in the mini calendar with per-month availability.
- Admin modal: New "Browse availability" toggle button for on-demand calendar/slots display instead of always-visible. Issue #1278.
- Admin modal: Progressive disclosure — details, staff, and calendar sections hidden until product is selected, with reveal animation.
- Admin calendar: Semantic Dashicons (calendar, clock, user, staff) replace text labels in the viewing modal.
- Admin calendar: Product color dot indicator shown next to product name in the viewing modal.
Improvements
- Admin modal: Replaced WooCommerce Backbone modal shell with custom wca-appointment-modal (own positioning, backdrop, header, footer).
- Admin modal: All event selectors scoped to .wca-appointment-modal--create to prevent bleeding into React viewing modal.
- Admin modal: Staff field moved to its own section row, shown/hidden based on whether product has staff.
- Admin modal: Select2 dropdowns restyled with underline inputs, custom arrow icon, and minimalist dropdown via wca-modal-dropdown class.
- Admin modal: Billing and add-ons sections use border-top separator with dashicon icons instead of grey background.
- Admin modal: Billing fields switched to placeholder-based inputs with screen-reader-text labels.
- Admin modal: Human-readable duration label returned from get_product_data AJAX endpoint.
- Admin modal: Month-based products navigate by year in mini calendar (prev/next year arrows).
- Admin modal: Removed showPriceLoading/hidePriceLoading functions and price spinner element.
- Admin modal: Removed dead initOrderSearch(), initCustomerSearch(), and onCustomerTypeChange() functions.
- Admin modal: Deduplicated customer-row and order-row flex layout into shared selector.
- Admin modal: Addons validation notice styling consolidated with shared notice design.
- Admin calendar: Viewing modal narrowed from 500px to 420px with auto-width key column grid.
- Admin calendar: Product calColor stored in extendedProps for consistent color propagation.
Fix
- Admin modal: get_month_availability endpoint now returns actual per-month availability for month-duration products instead of marking all unavailable.
[5.2.0-beta4] - February 9, 2026
Pre-release✨ Features
- Admin modal: Availability-first UX with inline mini calendar showing day-level availability indicators.
- Admin modal: Slot chips panel displaying available time slots with capacity badges and staff counts.
- Admin modal: New get_day_slots AJAX endpoint returning per-slot availability with capacity and staff data.
- Admin modal: New get_month_availability AJAX endpoint returning lightweight day-level availability summary.
Improvements
- Admin modal: Selecting a date now proactively loads and displays available time slots.
- Admin modal: Mini calendar navigates months with prev/next arrows and highlights today, selected date, and availability dots.
- Admin modal: Clicking a slot chip auto-fills the from/to time inputs with correct duration.
- Admin modal: Staff and quantity changes refresh the availability-first UI in real time.
- Admin modal: Shimmer loading animations for calendar and slot panel during AJAX requests.
- Admin modal: Client-side caching for month availability (60s TTL) and day slots (30s TTL) to reduce server load.
- Admin modal: Add locale to mini calendar in modal for creating appointments.
- Admin calendar: Do not add timezone conversion in month view to avoid rendering issue when staf is in different timezone.
- Admin calendar: Truncate very long rule title displayed inside unavailable rule tooltip.
- Staff should be redirected to their dashboard when they log in.
Fix
- Product default color should be #0073aa, not black.
[5.2.0-beta3] - February 9, 2026
Pre-releaseImprovements
- Compatibility with WooCommerce 10.5.
- Managing rules in admin should work great on mobile.
- Increase same-time stacked appointments to 10 from 4. Issue #1288.
- UNavailable rule shown in admin caledar should show more context. Issue #1285.
- Remove cancelled appointments from admin calendar. Issue #1287.
- Removed double indexing run on every rule when re-index is selected.
Fixes
- JS error appears due to invalid recurring rule, which should be handled better. Issue #1280.
- Bug with default Addon checkbox. Issue #1277.
- Old "show sold out times" snippet causes Internal server error in 5.x. Issue #1284.
- Create order for past date on frontend. Issue #1274.
- Overbooking could occur if inventory changes or sold out option is enabled in final checkout. Issue #1275.
- Include sold out was hardcoded to false, show them with a filter "woocommerce_appointments_include_sold_out" set to true.
[5.2.0-beta2] - February 6, 2026
Pre-release✨ Features
- Staff Portal: Comprehensive staff permissions system with granular permissions across multiple categories.
- Staff Portal: Dedicated staff dashboard with appointment stats, quick actions, and upcoming appointments.
- Staff Portal: Permission presets (Minimal, Standard, Advanced) for quick staff permission setup.
- Staff Portal: Simplified admin menu for staff users showing only relevant items.
- Staff Portal: New "Staff Permissions" settings section under WooCommerce > Settings > Appointments.
Improvements
- Performance optimization. Patched the slow calendar query.
- Admin calendar displays gray stripes for past days in month and week views.
- Admin calendar should only show toast messages for approved status changes.
- Admin calendar should use staff members selected language for all translatable strings, including date_i18n.
- Admin calendar should batch together messages for multiple same-rule updates.
- Admin calendar bg events (unavailable slots) should be more apparent.
- Rebuild new js files to vanilla js if jquery is not required.
- When staff is logged in, preselect the staff in admin calendar and show their rules as unavailability striped bg events.
- Do not show account creation checkbox if selected customer is already registered.
- Permission for staff to export their appointments, when enabled.
- Update all translations. Added more than 150 new strings for each language.
Fixes
- Several languages had wrongly translated strings, broken HTML and singular/plural nouns mistranslated.
- Admin calendar does not show staff "custom" rule type.
- Admin calendar does not show staff availability rules in staff members timezone.
- Order notes api not working when staff is logged in admin calendar, permission issue.
- Admin calendar, switching from month to week view does not load unavailable rules.
[5.2.0-beta1] - January 30, 2026
Pre-release✨ Features
- Timezone displays now use short abbreviations (CET, PT, JST, EAT, etc.) for standalone display.
- New WC_Appointments_Rate_Limiter class for centralized rate limiting with IP detection and whitelist support.
- New WC_Appointments_Timezone_Helper class for centralized timezone handling.
- Customer timezone preference in My Account > Account Details with browser detection prompt.
- Staff timezone preference in admin user profile for staff members.
- Appointments now tagged with creation timezone metadata (_creation_tz) for accurate DST handling.
- Timezone selector now includes "Default" option that dynamically reflects site timezone.
Improvements
- BREAKING: Timezone support now always enabled site-wide (product-level "Customer Timezones?" setting deprecated).
- Timezone dropdown shows city names with short abbreviations appended (e.g., "Berlin — CET (UTC+1)").
- Hover on timezone options shows full timezone identifier with short name.
- All timezone indicators across admin and frontend use short names with UTC offsets.
- Booking form auto-populates timezone from user preference (Priority: User preference > Cookie > Default/site timezone).
- Enhanced email timezone display with fallback to customer's account timezone preference.
- Timezone cookie now also saves to user meta for logged-in users (persistent preference).
- Added more email hooks for timezone display (woocommerce_email_before_order_table, woocommerce_email_order_details).
- Discrete timezone indicator shown next to dates in admin when timezone differs from site timezone.
- Admin appointment list shows timezone indicator in "When" column for cross-timezone appointments.
- Admin appointment details meta box shows timezone indicator with site timezone reference.
- Admin calendar modal shows timezone indicator when customer timezone differs from site timezone.
- Staff availability rules editor shows timezone indicator confirming what timezone rules are edited in.
- Appointment edit screen Date/Time section shows timezone indicator confirming editing timezone.
- Timezone dropdown now properly shows "Default (City)" as selected when no preference is saved..
- Rate limiter defaults increased to 60 requests/minute for moderate traffic handling (filterable via hooks).
- Rate limiter now supports IP whitelist filter and context-specific limit overrides.
- Empty timezone preference now correctly uses site timezone dynamically (follows site changes).
- Cart/checkout shows timezone indicator on date/time fields when customer timezone differs from site.
- Browser timezone auto-detection always active with timezone selector shown on all appointment products.
- Browser auto-detection no longer overrides logged-in user's saved timezone preference.
Fixes
- Added legacy fallback timezone conversion when timestamp field not available.
- Fixed double timezone conversion bug: slots now store original timestamp to prevent conversion on both display AND submission.
- Popover with lots of appointments displayed needs limited max height to prevent spilling outside viewport in admin calendar.
- Optimize saving of hundreds or rules at a time in staff profile page.
Securitys
- Added rate limiting to public AJAX endpoints (calculate_costs, get_time_slots_for_date, find_scheduled_day_slots) to prevent abuse.
- Removed unnecessary nopriv hook from SSE endpoint (admin capability already required).
- Improved input sanitization in AJAX handlers with consistent use of wp_unslash() and sanitization functions.
- Added conditional nonce verification for find_scheduled_day_slots with stricter rate limiting on failure.
[5.1.2] - January 26, 2026
✨ Feature
- Admin calendar toast notifications: Real-time updates when appointments are created, updated, cancelled, or rescheduled via SSE.
Improvements
- Customer contact icons in appointment modal: Email and phone icons appear on hover with click-to-action (mailto/tel).
- Appointment needs to use staff_ids as single source of truth, added comprehensive checks to ensure this.
- Guest appointment that leaves name/surname should display it in admin calendar even if not registered.
- Update all translations.
- Show Guest name in Calendar view + change default calendar view. Issue #1271.
- Appointment modal has all content filterable through React/JS.
- Ensure plugin installation does not happen too early and everything hooks after 'init' call to avoid potential issues.
- Deposits with one full and one part payment appointment in the same order. Issue #1270.
Fixes
- Resolved double notification issue when cancelling appointments by improving SSE event deduplication.
- SSE not updating admin calendar for appointments created via shortcode checkout (deduplication was blocking status change events in same request).
- Fix NL translation.
- Staff 2-way sync doesn't work fine with multiple calendars sync (staff + global). Issue #1268.
- Sync issue: when parent recurring event was deleted, modified instance availability rules remained orphaned. Issue #1216.
[5.1.1] - January 22, 2026
Fixes
- Staff permissions in admin calendar: Staff members without 'manage_others_appointments' capability can now only see their own appointments. Issue #1265.
- Add-on price not calculated correctly with product quantity (flat fee, quantity-based, percentage-based). Issue #1266.
- WCML 5.5.x compatibility: Restored version checking logic for WCML_Product_Addons constructor. Issue #1264.
- Google Calendar 2-way sync: Changes made in gCal were not reflecting in WP due to overly aggressive date comparison check blocking updates. Issue #1263.
[5.1.0] - January 21, 2026
Improvements
- Updated What's New admin page with better styling and to include clear roadmap, updates with improved release notes.
- Refining admin calendar hover effects, turn past appointments grayscale and unavailable time ranges into stripes.
Fixes
- Non-recurring rules could expire same day, before the 30 days grace period. Issue #1261.
- Cart persistence: Rewrote cart_loaded_from_session with whitelist approach to prevent premature cart clearing with any payment plugin.
- Only removes items from cart when order is definitively paid (processing/completed/partial-payment).
- Removed delete_in_cart_appointments_before_empty method as it was too unpredictable.
[5.1.0-rc2] - January 19, 2026
Pre-release✨ Feature
- Create new Calendar API, used internally to power the new admin calendar.
Improvements
- Instantly load appointment modal and all data when selected in admin calendar.
- Show hover effects in admin calendar.
- Show admin calendar times in WordPress time format set by user.
- Remove automatic redirect to what's new admin page after update/installation. Issue #1260.
- Update all translations.
Fixes
- Error with "autoselect first slot" in 5.1.0-rc1. Issue #1259.
- Appointments sync back as availability rules in 5.1.0-rc1. Issue #1258.
- When syncing back from google calendar, make sure modified date is processed correctly. Issue #1253.
- PayPal Payments plugin compatibility: Disable smart buttons on appointment product pages to prevent cart issues.
- "Requires confirmation" with 100% discount coupon now correctly completes order after confirmation. Issue #1254.
- Make sure 'checkout-draft' doesn't clear appointments from cart/checkout with persistent sessions.
[5.1.0-rc1] - January 15, 2026
Pre-release✨ Feature
- Export system refactoring: Implemented unified exporter interface for CSV and ICS formats.
Improvements
- Added Export Manager class to centralize exporter registration and routing.
- Reorganized all exporter files under includes/admin/export/ for better organization.
- Added format selection (CSV/ICS) to admin export page.
- ICS export now respects all filter options (date range, products, staff, add-ons).
- Renamed WC_Appointment_CSV_Exporter to WC_Appointments_CSV_Exporter for consistency.
- Update all translations to account for updated and new strings.
- Interval should start from first available slot. Issue #1214.
Fixes
- Staff with gCal sync issue 5.1.0-beta2.
- WooCommerce Deposits not working ok on any more. Issue #1250.
- Do not mark global calendar unavailable, when availability rule doesn't cover all days.
- Indexing turned on makes produce Interval start from midnight instead of inside each available range. Issue #1252.
- When there are available gaps but not long enough for the whole appointment, the day is clickable, still not available. Issue #1252.
- Appointment remains in cart as order is created too late in some cases.
[5.1.0-beta3] - January 9, 2026
Pre-releaseImprovements
- Optimized slow appointment queries by adding composite index on (post_id, meta_key) to postmeta table.
- Query optimization: Use INNER JOIN instead of LEFT JOIN when meta values are required (used in WHERE or ORDER BY).
- Query optimization: Use EXISTS subqueries for filtering conditions instead of JOINs when meta is not used in ORDER BY (significantly faster).
- Query optimization: Only JOIN meta keys that are needed for ORDER BY, use EXISTS for pure filtering (reduces JOIN overhead).
- Optimized get_qty_input_max() query: Replaced OR conditions with UNION for better index usage and performance.
- Added composite index on availability_cache table (source, qty, appointable, scope, product_id, staff_id, source_id) for get_qty_input_max() queries.
- Added automatic index creation for appointment postmeta queries on plugin activation/update.
- Added index verification and logging to ensure indexes are created successfully.
- Phase 3: Single Responsibility Refactoring - Extracted booking logic into dedicated classes.
- Created WC_Appointment_Booking_Lock class with exponential backoff retry mechanism.
- Created WC_Appointment_Booking_Handler class to centralize booking operations.
- Refactored create_wc_appointment() and add_appointment_from_cart_data() to use booking handler.
- Updated booking lock functions to use WC_Appointment_Booking_Lock class with backward compatibility.
- Admin modal customer creation now saves all billing fields to user account, matching checkout.
- Admin modal now saves billing data for existing customers when provided.
- Admin modal staff selection properly handles multiple staff scenarios and "No preference" option.
- Admin modal "Create account" checkbox automatically hides when customer is selected.
- Added comprehensive timezone architecture documentation across codebase. See docs/TIMEZONE_ARCHITECTURE.md.
- Significantly improved performance of get_appointment_ids_by() queries, especially for customer appointment lookups with date filters. Reduced from 3 JOINs to 1 JOIN + 2 EXISTS subqueries for typical queries.
- Improved get_qty_input_max() query performance by using UNION instead of OR conditions, allowing MySQL to use indexes more efficiently.
Fixes
- Fixed staff selection field not being enabled when multiple staff available.
- Fixed array to string conversion warning when creating appointments in admin modal.
- Admin modal staff selection only disables when "all staff assigned together", not when staff data is temporarily empty.
- Admin modal now randomly selects staff when "no preference" is selected, matching frontend behavior.
- Fixed timezone handling where selecting a day showed 23:00 for previous day. Changed to local methods in timestamp extraction.
[5.1.0-beta2] - January 8, 2026
Pre-releaseImprovements
- Document the whole code base properly. PHPDoc was missing or wasn't done correctly for a lot of cases.
- Querystring date/month/time selections now use direct function calls instead of triggering click events.
- Optimized WC_Appointments_Cache::set() to avoid unnecessary database writes when values haven't changed.
- License activation, when limit is reached now displays the notice that reflects this.
Fixes
- REST API v2 slots endpoint now correctly returns WP_REST_Response instead of array.
- REST API v2 slots endpoint date-only max_date parameter now correctly includes all slots on the day.
- "Use legacy calendar temporarily" option does not work.
- Programmatic clicks from date/month/time picker now stop propagation to prevent theme conflicts.
- Unavailable slots are no longer displayed when staff rules make them unavailable.
- Latest WooPayments (10.4.0) causes Internal server error on wc_appointments_calculate_costs.
[5.1.0-beta1] - January 5, 2026
Pre-releaseImprovements
- event.stopPropagation() on time slot click.
- PHP modernization: Added 5 interfaces for better code contracts and type safety.
- PHP modernization: Created 2 traits to eliminate code duplication across 8 classes.
- PHP modernization: Refactored 3 meta box classes to use shared trait, eliminating ~45 lines.
- PHP modernization: Implemented exporter interface in CSV and ICS exporters.
- PHP modernization: Refactored 5 manager classes to use shared manager trait.
- PHP modernization: Updated integration classes to implement integration interface.
- Modernization of integrations usage and dependencies.
Fix
- License management refresh shows notice and deactivation doesn't hide it.
[5.0.2] - January 4, 2026
Improvement
- Speed up loading of avatar, staff and order in admin calendar appointment modal.
[5.0.1] - January 3, 2026
Improvements
- Update documentation suggestions to the new docs.bookingwp.com site.
- Re-index up to retention date, do not index all appointments.
- Speed up re-indexing and avoid logging deletion, truncate instead.
Fixes
- Re-indexing large amounts of data should not result in PHP timeout.
- Next suggest time in admin modal for creating appointment should not use timezone conversion twice.
[5.0.0] - January 2, 2026
Improvements
- Compatibility with WooCommerce 10.4.
- Deprecation of wc_enqueue_js() in WooCommerce 10.4 addressed.
- Add animation to license activation button to avoid confusion, when modal doesn't open instantly.
- Updated all translations.
- Abandoned cart should not send the cancelation email.
Fix
- WooCommerce Payments multicurrency functionality now correctly converts currency in cart/checkout.
[5.0.0-rc3] - December 12, 2025
Pre-releaseImprovements
- Add option to apply/limit inventory/quantity per day instead of per slot (default).
- Add back the deprecated/misspelled hook for BC 'wc_apointments_check_appointment_product'.
- Add Billing option to create new account for a Guest customer in modal for adding new appointments.
- Make What's New page under Appointments in admin permanent, hide it in later smaller updates.
- Hide notice after the license is successfully activated for the plugin.
- Initial admin calendar view is for the week, preload appointments for the whole month regardless.
- Appointments API v2 should load faster by reducing meta queries and eliminating N+1 queries.
Fixes
- Force open "Product data" tab that in some cases always stays collapsed.
- WP 6.9 Command Palette doesn't work - creates empty appointment.
- Appointment not saved in final checkout step. Add comprehensive logging and fallbacks to prevent this.
- Pagination for Appointments in My Account page broken after WooCommerce update.
[5.0.0-rc2] - December 10, 2025
Pre-releaseImprovements
- Create internal rest api to cover all plugin aspects from a single source of truth.
- When appointment is edited in admin, add detailed changes to order note.
- Add Screen Options for admin calendar, where user can switch to legacy calendar temporarily.
- Make all API text strings not translatable to reduce translation workload, end user does not see them.
- Speed up front calendar loading.
- Use same loading animation for the new admin calendar and front-end calendar.
- Complete front calendar ajax call quick with daily buckets.
- Front calendar staff in querystring now performs only 1 ajax call.
- Updated Product Add-ons to 8.1.2
- Add what's new page for the 5.0.0 release in admin when user updates to 5.0.0 or activates it.
- Inventory maximum will be enforced through validation with cost calculations.
- Update license key activation process.
- Updated all translations.
- Apply user selected color scheme in admin across appointment pages
Fixes
- Front calendar does not have product ID properly set on init.
- Do not show notice to add appointable product on plugin activation if any already exist.
- All staff assigned together issue fix applied to multiple levels for future reference.
[5.0.0-rc1] - December 4, 2025
Pre-releaseImprovements
- Adding a function to ensure postmeta indexes exist for appointment date queries. Plugin reactivation/update needed.
- Add daily fail check for the appointments indexed health to make sure they are in check at all times.
- Make backfill for indexing fail proof by saving progress by each batch processed.
- Update readme file in root with new build instructions.
- Add warning in admin calendar when REST API is disabled for the site.
- Make front-end calendar resilient to errors in external scripts so it loads at all times.
Fixes
- ESbuild corrupts JS during minification and removes dependencies so minified JS files are not working as expected.
- Indexed path does not consider global rules correctly.
- Generate slots for days that are booked out, to avoid skipping days when checking for availability.
- Backwards compatibility with PHP 7.4 to ensure compatibility with older configurations.
- Admin calendar not rendering unavailability for date based rules.
- Hide normal dropdown before select2 dropdown renders for staff selection.
[5.0.0-beta9] - December 2, 2025
Pre-release✨ Feature
- Updated and modernized build process, pure NPM without Grunt and complexities, no compiles from crap like Webpack.
Improvements
- Named constants over magic values, created WC_Appointments_Constants.
- Make sure NPM does not execute git commands without approval.
- Added plugin hook validation for all hooks so we do not push broken actions/filters.
- Added PHPUnit test to run tests on functionality automatically.
- Load appointments to admin calendar instantly and preload all views dynamically.
- Structure code with better semantics for input/output expectations.
- Document main code functions better with better explanations.
- Linted all translation strings and translations comments and fixed all remaining issues.
- Linted all CSS and JS files with updated rules and fixed the remaining issues.
- Add better fail checks and validation so rules reach horizon at all times.
- Make sure SSE works on multisite installations fine and resets last event ID correctly.
- Reduced plugin delivery code size by 20% due to optimizations and removal of redundancy.
Fixes
- Fixed all hooks with own script that validates them automatically during build process now.
- Make sure appointment status is not null at any point.
[5.0.0-beta8] - November 27, 2025
Pre-release✨ Feature
- Atomic reservation operations that handle race conditions and prevents double appointments at high traffic.
Improvements
- Updated v2/appointments and v2/availabilities API to use indexed path when within horizon and enabled.
- Updated v2/appointments and v2/availabilities API to use scope(s) to return available/unavailable range.
- Admin calendar should not only show unavailability from rrules, but also consider exceptions.
- Admin calendar filters should sort product and staff alphabetically.
- Admin calendar filter for staff should show avatar/gravatar.
- Admin calendar appointment view modal should show avatar/gravatar for customer.
- Admin calendar has ability to confirm/cancel appointment instantly.
- Admin calendar loads appointments slightly faster on initial load.
- Admin calendar appointment view popup should show skeleton until elements are loaded inside.
- Admin calendar Should load appointments and availabilities once and avoid double fetching.
- Admin calendar should show reload button when 403 API error is shown.
- Admin calendar should follow the same rules hierarchy server side uses.
- Integrate WooPayments multi-currency with new appointment creation modal in admin.
- Use indexed results for the appointments API when in range and enabled.
- Updated all translations.
- Admin modal for creating appointments should use formatted dates that are easily readable.
Fixes
- Bug fix #1014, Admin calendar not showing rules in the background.
- Unavailability not showing ok in admin calendar when switching views.
- Do not update duration in appointment creation modal, when selecting add-on that has no duration.
- Unavailability not showing ok in admin calendar in month view.
- Bug fix #839, Appointment card in the calendar doesn't show the discounted price of the appointment.
- SSE should reconnect after errors and work reliably at all times.
- Bug fix #1225, Admin calendar should not duplicate appointments/rules when they are updated.
- Account for tax when creating appointments in admin modal and make sure to calculate order totals correctly.
- Appointments API should return appointments that overlap with the requested date range, not just those completely within it.
[5.0.0-beta7] - November 22, 2025
Pre-release✨ Features
- Live real-time Admin Calendar where user can create/move/cancel appointments from the calendar.
- Live real-time Admin Calendar works 2-ways and shows appointments/rules instantly after being created/edited anywhere.
- Introducing WebHooks, initially for appointments and availabilities.
- Introducing SSE, used for live stream of updated appointment and availabilities.
Improvements
- Add order note when editing appointment in admin calendar.
- Admin calendar appointment should be represented with the set appointable product color.
- Admin calendar should load appointments as first paint and availabilities concurrently.
- Admin calendar changes should add order note for every change.
- Cancelled appointment in admin calendar have reduced opacity, same as past appointments.
- Updated all translations.
- Move external scripts to /vendor folder and only registere minimized versions.
Fixes
- Make sure appointment does not stay in cart, status transitions and order ID is queried after DB cache.
- Add availability rule validation to block empty availability saves.
- Add guards to prevent multiple same-time openings of appointment creation modal in admin.
- Price calculations with add-ons selected is off in some cases, negative price must be properly included.
- Fix translations in file templates\order\admin\appointment-display.php, escaping dropped translations.
[5.0.0-beta6] - November 17, 2025
Pre-releaseImprovements
- Compatibility with WordPress 6.9.
- Added downloadable items to the confirmation email.
- Compatibility with WooCommerce Twilio SMS Notifications 1.19.3.
- Updated Product Add-ons to 8.1.1.
- Time zone calculations fallback to UTC when timezone is not set.
- Make indexed path very fast and avoid appointment-day bucketing.
- Make Rest API /slots indexed path very fast with option to combine staff and pagination.
- Rest API for /slots can be used as paged_stream with fast track to slots.
- Rest API for /staff show show all staff, when product isn't set.
Fixes
- Modal for creating appointment price editing styling issue.
- Modal for creating appointment not loading correctly on some pages in admin.
- REST API /appointments cancelled status doesn't work.
- Staff assignment not working, when all staff are assigned together.
- Some slots for staff are shown, but are not available.
- When changing the appointment quantity, it doesn't update it in the order.
- Memcached might cause multiple new order email. Prevent same status set multiple times.
- Memcached might cause appointments to not be tied to order.
- Memcached might revert changes in 2-way gcal sync.
- Memcached might cause appointments to not go to 'paid' status.
[5.0.0-beta5] - November 13, 2025
Pre-release✨ Feature
- REST API v2 added with full support for GET, POST, PUT, DELETE and PATCH.
Improvements
- REST API uses WooCommerce’s permission check in public read endpoints.
- Do not duplicate Confirmation email if sent at the same time to same email address (customer and admin).
- All API calls fully documented in code.
- Appointments API returns start_utc and end_utc in ISO 8601 format.
- Updated all translations.
Fixes
- Add include_sold_out option to indexed path.
- Product with no staff does not show occupancy indicators in calendar correctly.
- Undefined variable $is_next_day in rule manager.
[5.0.0-beta4] - November 10, 2025
Pre-release✨ Feature
- Add COGs for appointment edit screen (WC 10.3 feature). Internal price of goods/services to monitor.
Improvements
- Modal for creating appointments should only use time dropdown instead of html5 time selection.
- Use date_i18n() instead of date() when editing appointment in admin.
- Compatibility with WooCommerce 10.3.
- Creating appointment in modal includes simple actions after appointment has been created.
- Modal for creating appointments now includes payment methods.
- Modal for creating appointments should trigger actions selectively and only when needed.
- Modal for creating appointments opens product search instantly after being opened.
- Appointment form block change/edit/view buttons moved to block toolbar.
- When manual re-indexing, first flush all the cache and drop the indexed results, do not overwrite.
- When manual re-indexing, finish in one go until your reach the horizon.
Fixes
- Modal not saving day and month duration appointments correctly.
- Re-index untrashed appointments.
- Add-ons image swatch does not keep preselected value.
- Add-ons called twice which corrupted the output in some cases.
- Confirmed appointments trigger multiple actions unnecessarily.
- Bug fix #1021, overnight appointment not checking availability for next day.
- Bug fix #1218, multiple appointment forms not working with auto-select on same page.
- Bug fix #1203, same staff on different products not working ok with hour/minute duration.
- Bug Fix #1215, shows non-bookable slots and end is not enforced in rules correctly.
- Bug Fix #1194, added safeguards to prevent scheduled notifications being sent in a loop.
- Bug Fix #1212, padding from product in the appointment not taken into account.
- Bug Fix #1195, was-in-cart appointments created and added to order .
- Stop Sync same multievent creation by combining a short-lived atomic lock and an idempotent preflight search.
- When no staff selected, slots do not have correct quantity computed or are missing.
- Deleting availability rules does not delete them from index instantly.
- Product auto-select skips current day.
[5.0.0-beta3] - October 30, 2025
Pre-release✨ Feature
- Creating appointments in admin through modal.
Improvements
- Custom pricing rules: base cost applies if appointment is within rule range by part or as a whole.
- Custom pricing rules: slot cost applies for each slot calculated by intervals.
- Allow creating new appointments in admin that are not available.
- Manual re-indexing shows gradual progress and runs in small chunks of 50 items per run.
Fixes
- Fixed issue #1208, where showing slots that are not available.
- When interval is longer than available time, it shows no slots for that day.
- Indexing custom:daterange rules might add additional day.
- time:range and custom:daterange overnight rules not working fine.
- Default add-on header text in product edit screen wrongly wrapped with <p></p>.
- Indexing could skip current time if start date/time was in the past.
- custom:daterange rule until midnight blocks the whole next day.
- Add 30 days grace period for rules to be :expired and hidden from admin.
[5.0.0-beta2] - October 18, 2025
Pre-release✨ Features
- Introduce Availability Filter block.
- Introduce Appointment Form block.
Improvements
- Max quantity available normalization across product/staff/rules.
- Re-indexing indicators should be more apparent.
- Manually saving lots of availability rules is now possible without server adjustments.
- Updated all translations and added strings for new features.
- Updated analytics code rendering for Staff selection.
Fixes
- Staff sync not working correctly for new users.
- Normalize hooks with typos and make sure it works both ways.
[5.0.0-beta1] - October 15, 2025
Pre-release✨ Feature
- Introduce indexing or availability rules and appointments.
Improvements
- Improved default date selection when you opt for first available slot selection.
- Updated Product Add-ons to 8.1.0.
- Product Add-ons display control over heading for each section.
- Compatibility with WooCommerce 10.2.
- Google Calendar sync now works with better logic.
- Sync cancelled instances or recurring events as exceptions.
Fixes
- Automatically assigned (all staff together) doesnt check all staff's availability.
- WP update handling metaboxes collapses whole product edit screen on staff toggle.
- Remove persistent notice when appointment has been removed from cart.
- Month picker querystring not updating.
- RRule should block the whole days with time range for daily duration products.
- Availability from not working ok with daily duration for custom:daterange rules.
- Products that go overnight can be overbooked - no check for actual availability.
- Google Sync is slowing down Appointments and Check out process.
- Padding not working fine in some occasions, when duration and intervals are different.
- Fixed Cart Coupon not working ok when canceling an appointment.
- interval larger than duration might cause issues.
- Monthly duration doesn't jump to the first available month.
- Make sure get_cart is not called before wp_loaded action.
[4.26.4] - August 23, 2025
Fix
- Return $appointments to filters to avoid breaks with custom code.
[4.26.3] - August 22, 2025
Fix
- Exclude expired availability and cost rules.
[4.26.2] - August 22, 2025
Improvement
- Compatibility with WooCommerce 10.1.
Fixes
- Updated compatibility with WooCommerce Sequential Order Numbers Pro.
- Make sure expired availability rules are not included.
[4.26.1] - August 21, 2025
Fix
- Caching start/end times breaks capacity rules.
[4.26.0] - August 20, 2025
Improvements
- Avoid multiple appointments query and cache the query.
- Updated php rrule to 2.6.0.
- Clean up old availability rules. Old rules have '%:expired' added to 'range_type'.
- RRules loading times are faster.
- Optimize function get_appointment_ids_by for better performance.
Fixes
- Make sure appointments query skips false objects from DB (caching issue).
- Mislabeled months availability rule with week count (52) instead of month count (12).
- 'jquery-tiptip' script missing 'dompurify' dependency.
- Syncing custom statuses to Google Calendar not working.
[4.25.2] - July 20, 2025
Improvements
- Compatibility with WooCommerce 10.0.
- Updated Product Add-ons to 7.9.1.
Fix
- Clear appointments from cart even ifWooCommerce hold stock options are set to zero.
[4.25.1] - June 16, 2025
Fix
- Filter typo 'wc_apointments_sync_with_padding' is written as 'wc_appointments_sync_with_padding'.
[4.25.0] - June 15, 2025
✨ Feature
- Add revenue/sales by staff in WC Analytics.
Improvements
- Option to apply product padding to synced rules with a filter 'wc_appointments_sync_with_padding'.
- Updated Product Add-ons to 7.9.0.
- Compatibility with WooCommerce 9.9.
- Option to filter timezone options with filter 'woocommerce_appointments_wp_timezone_choice'.
- Added new action hook 'woocommerce_after_' . $this->object_type . '_object_save'.
- Added new action hook 'woocommerce_appointment_maybe_schedule_event'.
- Added new action hook 'woocommerce_appointment_clear_cron_hooks.
- Added new filter hook 'woocommerce_appointments_stop_order_delete'.
- Added new filter hook 'woocommerce_appointments_stop_order_update'.
- Added new filter hook 'wc_appointments_staff_display_name'.
- Added product padding info to synced event.
Fixes
- Undefined variable $wp_button_class.
- Filtering by appointment product type in WC Analytics not working correctly.
- Navigation compatibility with WC 9.9.
- Missing param in woocommerce_appointments_gcal_sync_order_meta.
- Addons with Images are missing the "none" option.
[4.24.0] - April 26, 2025
Improvements
- Compatibility with WordPress 6.8.
- Privacy compatibility with WooCommerce.
- Updated compatibility with Polylang for WooCommerce 2.1.4.
- Added duration variable for AutomateWoo.
- Add order related variables to AutomateWoo.
- PHP 8.4 compatibility for implicitly defined variables.
- Updated all translations.
- Minimum PHP requirement bumped to 7.4.
Fixes
- Some translations loading too early since WordPress 6.8.
- Fatal error when removing staff from appointment.
- Time slots not available for staff, when they should be.
[4.23.1] - April 14, 2025
✨ Feature
- WooCommerce Email Preview full integration.
Improvements
- Make sure email classes are not redeclared with external extensions.
- Updated Product Add-ons to 7.8.1.
Fix
- Missing $product object for WooCommerce Payments extension.
[4.23.0] - April 12, 2025
Improvements
- Compatibility with WooCommerce 9.8.
- WooCommerce minimum supported is 9.6.
- Updated integration with WooCommerce Deposits 2.3.7.
- Updated integration with WooCommerce Deposits by Webtomizer 4.6.9.
- Updated integration with WooCommerce Payments 9.2.0.
[4.22.8] - March 13, 2025
Improvements
- Updated Product Add-ons to 7.7.0.
- Max capacity can now be defined above inventory limit to suit availability rules defined capacity.
Fix
- Cancelled appointments do not get deleted for staff in synced calendar.
[4.22.7] - March 10, 2025
Improvements
- Product add-ons CSS fixes.
- Updated php rrule to 2.5.2.
Fix
- Custom pricing rules not saving correctly.
[4.22.6] - March 8, 2025
Improvements
- Updated Product Add-ons to 7.6.0.
- Hide appointment add-on options in admin different product types.
- Make sure 'require confirmation' payment method is always available.
- Updated all translations.
- Added missing plural forms for Hebrew translations.
- PHP 8.4 compatibility for custom pricing fields.
Fix
- Cancelled appointments do not get deleted in sync in some cases.
[4.22.5] - March 5, 2025
Improvement
- Deprecated 'wc_appointment_get_timezone_string' in favor of 'wc_timezone_string'.
Fix
- Cancelled appointments do not get deleted in sync in some cases.
[4.22.4] - February 27, 2025
Improvements
- Backwards compatiblity with WooCommerce Twilio SMS Notifications extension.
- Make sure appointment quantity cannot be set as zero in admin.
Fixes
- WCML not working if multicurrency is disabled.
- Ensure that the 'WooCommerce Appointments' gateway remains hidden on the new WooCommerce Payments settings page.
- Do not run sync of cancelled appointment twice.
- Canceling an appointment doesn't remove it from staff's synced gCal.
[4.22.3] - February 19, 2025
Improvement
- WooCommerce Twilio SMS Notifications 1.19.0 not calling get_cart() correctly.
[4.22.2] - February 19, 2025
Improvements
- Reset selected time slots when switching months or years on the calendar.
- Compatibility with WooCommerce Twilio SMS Notifications 1.19.0.
- Updated all translations and improved plural forms for Hebrew.
Fix
- Error with WooCommerce Multilingual & Multicurrency (5.4.0).
[4.22.1] - February 16, 2025
Improvements
- Compatibility with WooCommerce 9.7.
- WooCommerce Multilingual 5.4.0 compatibility.
- Updated Product Add-ons to 7.5.0.
- All formated order meta data now synced with Google calendar event.
Fix
- Deleting synced event in staff's gCal doesn't cancel it on the site.
[4.22.0] - February 13, 2025
Improvements
- Updated Product Add-ons to 7.4.0.
- Remove additional unnecessary strings for gcal event sync.
- Log errors on appointment / appointable product query.
- Compatibility with WooCommerce 9.6.
- Compatibility with AutomateWoo 6.1.5.
- Compatibility with WooCommerce Multilingual 5.3.9.
- WPML multicurrency for addons not working.
- Compatibility with WPML Multilingual CMS 4.6.15.
- Updated code build process to match PHP 8.3.
- Updated all translations and added new add-ons strings.
- Better file loading structure.
Fixes
- Analytics translation for filtering by Appointable products.
- TM Extra Product Options not syncing to gCal.
- Removed redundant 'notranslate' class as it is added on fields directly.
- Google calendar sync can offset time for 1 hour unintentionally.
- iOS and Firefox issue with too many addons.
- Changing time of synced app in gCal syncs it back with wrong time.
- Changing staff won’t syn to Gcal.
- Staff 2-way sync for multiple staff doesn't work properly.
- Make sure different time zones on website and Google calendar work ok together in all cases.
- Reminder email before send checking uses UTC instead of local time.
[4.21.8] - December 3, 2024
Improvements
- Updated Product Add-ons to 7.2.1.
- Compatibility with WooCommerce 9.5.
Fix
- Product Add-ons quantity field not updating price.
[4.21.7] - December 2, 2024
Improvements
- Move core plugin functions to load earlier.
- Add-ons plugin activation loading for both admin/frontend.
- Updated moment-timezone-with-data.js lib to v0.5.45.
- Updated moment-with-locales.js lib to v2.30.1.
Fixes
- PHP 7.4 error correction. Though PHP 8.2+ is required.
- REST API: usort fix for PHP 8.0+.
[4.21.6] - November 29, 2024
Fix
- Final correction in 4.21.+ saga.
[4.21.5] - November 28, 2024
Improvements
- Load integrations early after plugins are loaded.
- Remove Select2 scripts and styles and only use Select2 from WooCommerce.
Fix
- Google calendar sync PHP error.
[4.21.4] - November 27, 2024
Improvements
- Filter ‘get_appointment_products_args’ includes all args.
- Move $qrey_vars in get_appointments_for_user function.
Fix
- Appointable product edit screen broken.
[4.21.3] - November 26, 2024
Improvements
- Updated Product Add-ons to 7.2.0.
- Updated Slovenian translation.
Fixes
- Google calendar sync not working.
- Exporting appointments not working.
- Email notifications not working.
- Appointments permalink in my-account not working.
- Requiring confirmations not working.
[4.21.2] - November 22, 2024
Improvement
- Remove 2 metadata fields in synced gCal.
Fix
- Appointments shortcodes not working.
[4.21.1] - November 20, 2024
Improvements
- Remove deprecated WooCommerce Admin plugin menus.
- Updated Product Add-ons to 7.1.2.
- Compatibility with WordPress 6.7.
- Compatibility with WooCommerce 9.4.
- Added additional 'notranslate' class to prevent plugin from transating fields.
- Filter ‘get_appointment_products_args’ should include ‘author’.
Fix
- Translations not working (for non English sites).
[4.21.0] - October 7, 2024
Improvements
- Clear cache only when post object is defined for the appointments.
- Improved compatibility with Polylang for WooCommerce.
- Fixed strings to Hebrew translation.
- Updated Product Add-ons to 7.1.0.
- Updated all translations and adjusted add-ons strings.
- Compatibility with WooCommerce 9.3.
- Use pretty uniform pretty time duration display.
- SMS "Customer Confirmation message" missing info.
- Removed option to edit order inside appointment edit screen in admin.
- Added filter to allow not updating gCal description on appointment update.
- Updated php rrule to 2.5.1.
Fixes
- PHP 8.2 error when empty array present.
- Recurring events in gCal not blocking out times.
- gCal recurring event blocking out the wrong time.
[4.20.0] - June 29, 2024
✨ Features
- Added WC Payments multicurrency support.
- Added Appointable product to Analytics for filtering.
Improvements
- Better integration with WooCommerce Payments gateway.
- Add-ons integration added earlier, better compatibility with external plugins.
- Updated Product Add-ons to 6.8.4.
- Handling failed orders with appointments added back with additional validations.
- Bump "WC requires at least" to version 8.7.
- Compatibility with WooCommerce 9.0.
Fixes
- Add-ons work with WC Payments for appointable products.
- Updating manually added Appointment in Order can create critical error.
- Timezone visible in admin for non-timezone appointments.
[4.19.1] - May 22, 2024
✨ Feature
- Integration with Official WooCommerce Stripe Gateway.
Improvements
- List WooCommerce plugin as a requirement for Appointments to work properly.
- Updated Product Add-ons to 6.8.3.
- Compatibility with WordPress 6.5.
- Compatibility with WooCommerce 8.9.
Fixes
- Uncaught Error: Class ‘WC_PAO_Admin_Notices’ not found.
- Report dashboard count translation error.
[4.19.0] - March 26, 2024
✨ Features
- Add a DATE add-on custom field.
- Appointments saved with a site's timezone and customer's set timezone (optional).
- Integration with AutomateWoo extension.
Improvements
- Updated all translations.
- Updated and added strings to Hebrew translation.
- Updated Product Add-ons to 6.8.0.
- Revert Appointment status to "in-cart" when order fails to enable re-payment.
- Compatibility with WooCommerce 8.7.
Fixes
- Importing addons globally does not work.
- Missing View cart button on individually sold appointments.
- Clear cache when appointment is trashed/untrashed.
- Can't reorder addons.
[4.18.2] - February 22, 2024
Improvement
- Simplified each order item ID call to speed the query.
Fixes
- Blocks for appointments not loading, remove version checking as core supports it.
- Exporting admin created appointments with tax is wrong.
[4.18.1] - February 16, 2024
Improvements
- Updated Product Add-ons to 6.6.0.
- PHP 8.3 compatibility.
- Updated all translations.
- Compatibility with WooCommerce Deposits 2.2.5.
- Compatibility with WooCommerce 8.6.
- DB length of the calendar event ID in availability rules set from 100 to 255.
- Improved loading times for the time slots.
Fixes
- Product Add-ons import not working.
- Manual appointment with customer not working.
- WooCommerce Deposits stutus set as paid for non-deposit appointments.
- Adding appointments in admin with WooCommerce 8.6+.
[4.18.0] - November 10, 2023
Improvements
- Compatibility with WordPress 6.4.
- Include quantity field as hidden even when customer cannot choose the qty.
- Removed excessive caching that could cause query issues.
- gCal additonal staff ID checks when syncing.
- Updated all translations.
Fixes
- Free products status stays in-cart instead of paid.
- Big issue when booking multiple appointments in one order with 100% discount.
- Addons add a + sign even if the value is negative - fix it.
- Skip staff ID's on sync attempt when empty.
- Cannot assign appointments to existing orders with COT enabled.
- WooCommerce TM Extra Product Options not working, when product quantity is missing.
[4.17.4] - November 7, 2023
Improvements
- Compatibility check with WooCommerce TM Extra Product Options 6.3.2.
- Compatibility with WooCommerce 8.2.
- Updated Product Add-ons to 6.5.0.
- Better integration with Product Add-ons blocks.
- Updated all translations. Added lots on new strings.
- Compatibility with WordPress 6.3.
- PHP 8.2.8 compatibility.
- Updated Product Add-ons to 6.4.5.
- Radio Addons add a "none" feature people don't want.
- Updated php rrule to 2.4.1.
- Compatibility with WooCommerce 8.0.
- Hidden input forms don't need a label.
- Prevent quantity editing for appointable products.
- Unnecessary call to constructor of extended WC_Appointment_CSV_Exporter class.
- Do not cancel appointments with failed payments, unpaid status is sufficient.
- Added filter 'woocommerce_appointments_gcal_remove_from_gcal'.
- Updated php rrule to 2.3.2.
- Updated rrule.js to v2.7.1.
- Updated Product Add-ons to 6.4.3.
- Compatible with PHP 8.1.9.
- Removed Action Scheduler library since it is included with WooCommerce since 3.0.
- Compatibility with WordPress 6.2.
- Compatibility with WooCommerce 7.8.
- Updated all translations. Added lots on new strings.
- Updated Moment.js timezone lib to v0.5.43.
Fixes
- Additional checks to make sure only appointments are rendered in templates.
- Some addons missing closing DIV element - breaks layout of the site.
- gCal for staff not working.
- Addons checkbox missing closing DIV element - breaks layout of the site.
- Adding appointment in admin to existing order not working.
- Adding appointment in admin redirect is wrong.
- Customer cancelled appointment does not cancel the TAX.
- Cart block product quantity editing disabled.
- Bug with untrash_post.
- unneccessary pao_ids in gCal event after.
- FUE (Follow Ups) integration update.
- Fix Hebrew translation.
- Restore trashed Appointment triggers FATAL ERROR.
[4.16.1] - November 28, 2022
Fix
- Do not cancel unpaid orders.
[4.16.0] - November 28, 2022
✨ Features
- Support for High-performance Order Storage ("HPOS"), also known as Custom Order Tables, "COT".
- Structure to support WooCommerce blocks.
- Ability to checkout appointments that require confirmation with the new WooCommerce blocks.
Improvements
- Simplified appointment page for customer accounts.
- Pricing override slot rule redundant.
- Updated Product Add-ons to 5.0.2.
- Set minimum PHP version to 7.0.
- Set minimum WordPress version to 5.6.
- Set minimum WooCommerce version to 6.0.
- Compatibility with WooCommerce 7.1.
- Remove redundant cost calculation for overrides.
- Hide appointments payment gateway in the admin as it has no configuration.
- Mark the confirmed appointments order as complete if the total is zero.
- Removed legacy code for appointable product setup.
- Option to register scripts as the type of 'module'.
- Renamed gateway name/ID from 'wc-appointment-gateway' to 'wcappointmentsgateway'.
- Updated all translations.
Fixes
- Avoid PHP warnings when adding appointment manually.
- Delete transient of appointment removed from cart to free up the product slots.
- Do not change a failed order to "pending" when the appointment goes to "unpaid".
- Appointments list API results count inconsistent.
- Show category in API only if it has a appointable product.
- REST API returns days that are not appointable.
- Hide products from the
/slotendpoint if their catalog visibility is set tohidden.
[4.15.0] - October 21, 2022
Improvements
- Beginning the switch to ES6 in JS files.
- Remaining chars in add-on fields duplicated.
- Compatibility with WooCommerce 7.0.
- Compatibility with WordPress 6.0.
- Updated Product Add-ons to 5.0.0.
- Filtered statuses for the Follow up emails.
Fixes
- Inventory not taken into account when rescheduling in frontend - overbookings possible.
- The tax string on single product page is displayed twice for Appointable products.
[4.14.8] - May 3, 2022
Improvements
- Updated Product Add-ons to 4.9.0.
- Compatibility with WooCommerce 6.4.
- Updated all translations.
Fixes
- was-in-cart status not removed and can build up in the backlog.
- German, Dutch and French translation issues.
- WPML availability rule quantity not copied.
[4.14.7] - January 27, 2022
Fix
- Product Add-ons Subtotal never shown in 4.14.5.
[4.14.6] - January 27, 2022
Improvements
- Replaced all dashicons for the calendar with HTML character.
- Appointment number can now also accept strings from external plugins.
Fixes
- Product Add-ons Subtotal never shown in 4.14.5.
- TM Product Extra Product Options plugin and Add-ons positioning issue in cart.
[4.14.5] - January 26, 2022
Improvements
- Compatibility with WordPress 5.9.
- Updated compatibility with Polylang for WooCommerce 1.6.2.
- Updated Product Add-ons to 4.5.0.
Fixes
- Polylang staff costs and quantity erased on translated products.
- Datepicker in admin shows html instead of icon from WP 5.9.
- WC product Addons translation not working.
[4.14.4] - January 2, 2022
Improvements
- Added 'woocommerce_appointments_product_defaults' to filter product defaults.
- Added better compatibility with the Square payment plugin.
- Compatibility with WooCommerce 6.1.
- Updated Product Add-ons to 4.4.0.
Fix
- Pagination at My Appointments account section.