Black Friday: 30% OFF on all plans, applied automatically at checkout View plans
Log in Cart

BookingWP | WooCommerce Appointments Changelog

Every recorded version, newest first, with what changed in each one.

Latest 5.5.16 versions

Undated · 6 versions

  1. 5.5.1

    Latest
    9 improvements11 fixes
    Improved
    • Storefront: selection info shows an end date or end time when the appointment spans more than one unit (e.g. Oct 28 - 29, or 08:30 - 13:00).
    • Storefront: opening with a date in another month paints that month immediately from bootstrap data (used only for the month it covers).
    • Admin panel: location and resource option labels show additional cost suffixes like the storefront (e.g. (+$20)).
    • Admin menu: Appointments uses the product a+clock glyph (WordPress 7.2 SVG Icons API; base64 SVG fallback on older WP) instead of dashicons-clock.
    • Tests: `IcsExporterStaleEntryRegressionLiveTest` locks staff DESCRIPTION single `\n` escaping (#1496); `php-date-format-escape.test.ts` locks storefront `wca_format_date` PHP escapes (#1495); `ResourcesLiveTest` covers display assignment `is_appointable` when the booking location has no location-scoped room; `TranslationAvailabilityIndexSyncLiveTest` locks original-product availability for translations.
    • `wc_appointments_get_product_id_for_availability`; removed WCML/Polylang availability cloning and unused data-store row helpers.
    • Index minute masks overlay append-only `woocommerce_appointment_get_availability_rules` deltas once per staff (`get_availability_rules_filter_delta` → `overlay_rules_on_mask`).
    • All appointment `wc_get_template` calls pass `$template_path` `woocommerce-appointments`; outdated-template notice also scans that theme folder.
    • Build: `npm run check:debug-leftovers` fails on Cursor agent ingest leftovers and stray `debug-*.log` files; wired into `build` / `build:no-test` (#1500).
    Fixed
    • Storefront: selection dates honor WordPress date-format escapes (e.g. Portuguese `l, j \d\e F, Y` shows "2 de Novembro" again) (#1495).
    • Storefront: automatic/display resources no longer block add-to-cart at a venue that has no eligible room.
    • ICS export: DESCRIPTION staff/resource/add-on line breaks show as real newlines again (no literal `\n` text).
    • Admin panel: create footer quotes and order totals include location and resource surcharges again; cost AJAX posts the selected location/resource like availability already did.
    • Admin panel: resource dropdown lists only rooms for the selected location (no fallback to the full pool when a venue has none), and create waits for a customer resource pick before quoting cost or checking availability.
    • Appointments export: CSV downloads include the column header row again, and CSV no longer double-loads every appointment before writing the file.
    • WPML / WCML / Polylang: product availability rules belong to the original product only. Translations use that schedule for slots and the Availability hub (no cloned per-language rules).
    • Availability / slots: indexed slot lists honor filter-injected availability rules (same as the dynamic path), so busy windows no longer stay bookable when the index is used.
    • Templates: theme overrides default to `yourtheme/woocommerce-appointments/` (headers and loaders aligned). `yourtheme/woocommerce/` still works via the locate filter.
    • Availability hub: product/staff/location search matches accented letters and curly quotes (e.g. étalons, d’…) (#1493).
    • Storefront: staff/resource picker no longer calls a leftover local debug endpoint (Chrome no longer prompts for access to other apps on the device) (#1500).
  2. 5.5.0

    12 improvements13 fixes
    Improved
    • Removed `WC_Product_Appointment::get_qty_input_max` and `woocommerce_appointments_quantity_input_max`. Use `get_qty_max` / `woocommerce_quantity_input_max` for the per-booking quantity ceiling.
    • Admin: Capacity is the shared label for product inventory, staff, resources (was Max at once), and availability overrides (was Spots). Minimum and Maximum stay visible for per-booking quantity even when product Capacity is 1.
    • Admin panel: Memberships discounts apply for the selected customer on create.
    • Admin: What's New leads with a hero and hub CTA, autoplays the hub story (no long sticky scrub), shows three clickable highlight cards, shortens get-started and roadmap, and keeps copy aligned with shipped 5.5 (Capacity, Fixed show/hide, Meet on the product Location tab).
    • Storefront quantity max uses `get_qty_max`; install no longer adds unused `idx_qty_max_lookup`.
    • Cost calculation no longer returns a sticky prior `WC_Appointments_Cost_Calculation::$appointment_cost` (each quote recomputes so customer_id filters apply).
    • Tests: `IcsExporterStaleEntryRegressionLiveTest` locks ICS TEXT escaping, ORGANIZER mailto sanitization (incl. CR/LF rejection), SUMMARY comma/semicolon escaping, and blogname specials in X-WR-CALNAME / ORGANIZER CN.
    • Tests: `GcalSyncOwnershipLiveTest` locks staff own-calendar start/chunk/stop/clear success and denies global/cross-staff sync AJAX without mutating progress.
    • Tests: `CreateAppointmentStatusPriceGateLiveTest` locks status allowlist, staff create paid/override with `manage_appointment_status`, and forced confirmed + ignored override without it.
    • Tests: `GcalOauthCallbackOwnershipLiveTest` locks OAuth callback denial for forged global state and `can_manage_gcal_for_staff` for staff/manager.
    • Tests: `StaffContactPiiGateLiveTest` locks calendar/SSE contact redaction, SSE staff scope, and get_customer_details soft perms (view/create/relationship).
    • Tests: `MembershipsPanelCustomerCostLiveTest` and `MembershipsGetMemberPriceTest` lock panel customer_id cost discounts and Memberships get_member_price.
    Fixed
    • Google Calendar: calendar list and event requests no longer disable TLS certificate verification; debug logs record token presence only, not the bearer value.
    • Google Calendar: stop, process-chunk, and clear-progress AJAX use the same staff ownership check as start (staff cannot wipe global or another staff sync).
    • Google Calendar: OAuth callback re-checks staff/global ownership after state parse (same rules as the connect AJAX initiator).
    • Admin panel: create validates appointment status; staff without Change Appointment Status cannot set paid/etc. or a custom price override (create still succeeds as confirmed with calculated price).
    • Admin calendar: staff without Contact Customers no longer receive customer email/phone (or billing contact) on calendar, appointment REST, or SSE; SSE also omits other staff’s appointments.
    • Admin panel: get customer details respects staff View Customers / View All / Create Appointments (and redacts email/phone without Contact Customers unless create autofill).
    • Emails: admin new-appointment HTML escapes the customer billing name.
    • ICS export: TEXT fields escape backslashes; organizer mailto uses a sanitized admin email.
    • Admin panel: customer search no longer loads unbounded WooCommerce matches for terms of 3+ characters (caps at 20).
    • Admin calendar: view panel no longer shows the creating staff as assigned Staff when the appointment has no staff assignment (creator-only visibility for list/calendar is unchanged).
    • Admin panel: create success step shrinks to fit its content instead of keeping the tall filled create-form height.
    • Admin panel: selecting a customer on create updates the preview title in place and yields in-flight cost AJAX so billing details are not stuck behind the quote (availability keeps running).
    • Admin panel: member cost quote no longer snaps back to full price after customer billing details load.
  3. 5.5.0

    3 improvements6 fixes
    Improved
    • Virtual meetings: cart and admin create call `WC_Appointments_Location::apply_to_appointment` after the appointment object exists (single write site for location + meeting_provider).
    • Tests: `MeetingsLiveTest` covers pending conference apply, static Join fallback, stable GCal requestId, meeting_provider snapshot (incl. cart create path).
    • Tests: `CartSimulationRequestLiveTest` covers PayPal simulate-cart AJAX names (incl. SDK v6 substring), Store API path, and `wc_appointments_is_cart_simulation`.
    Fixed
    • Virtual meetings: emails and order summaries use the same Join link as My Account (Meet, else location static Join URL).
    • Virtual meetings: pending Google Meet creates no longer mark failed or mint a new room on each sync (stable Calendar requestId).
    • Virtual meetings: Video meeting provider is snapshotted onto the appointment when the location is applied at booking, so later product edits do not change Meet create for existing bookings.
    • Storefront: PayPal Payments cart simulation (legacy and SDK v6) no longer creates in-cart appointments or holds slots when add-ons change on the product page (#1491).
    • Admin panel: create and edit list the same open times as the storefront for the selected room (day chips and month availability).
    • Admin panel: changing location or opening create from a calendar day keeps the date; the first open time fills after location and room are ready, and time fields stay disabled while slots load.
  4. 5.5.0

    2 new13 improvements2 fixes
    New
    • Locations: product Location mode can be Fixed (assign one venue, hide it from cart, checkout, thank-you, and customer emails), matching resource Selection → Automatic (#1488).
    • Admin panel: set the customer's timezone when creating an appointment (hidden only when Timezone Display is disabled everywhere; saved on the appointment and customer account when linked) so emails and My Account show their local time (#1490).
    Improved
    • Admin panel: create uses one Customer card (search + contact/address/timezone); payment method and transaction ID sit under Order.
    • Admin calendar: create and edit no longer book unavailable times by default. Screen Options → Allow booking unavailable times restores the confirm-and-proceed override; the date/time notice scrolls into view when out of sight (#1388).
    • Availability hub: Locations and Rooms can use Range of days (whole weekdays open or closed), matching day-duration room schedules.
    • Locations / resources: `WC_Appointments_Location` / `WC_Appointments_Resource` data objects own CPT admin + domain helpers (removed `WC_Appointments_Locations` / `WC_Appointments_Resources`); CPT data stores `appointments-location` / `appointments-resource`; helpers `get_wc_appointments_location` / `get_wc_appointments_resource`; `WC_Appointments_Resource_Data_Store::get_appointment_ids_in_range`.
    • Tests: `AdminCreateUnavailableGateLiveTest` locks default deny vs Screen Options allow for admin create outside open hours.
    • Tests: `LocationsLiveTest` covers Fixed (hidden) store + customer display omit.
    • Locations / resources: hub entity lists and Features existence probes use `WC_Appointments_Location_Data_Store` / `Resource_Data_Store::query` / `exists` (no ad-hoc `get_posts` / `$wpdb` in those callers).
    • Appointment data store: `clear_product_id` / `clear_staff_ids` / `clear_customer_id` / `mark_reminder_sent` / `clear_reminder_meta` for admin cleanup and reminder guards.
    • Availability data store: expired-cleanup candidates/mark, `get_rows_by_kind_id` plus insert/update/delete for Polylang/WCML sync and cron (no direct table SQL in those callers); PHPStan `WC_Data_Store` stub covers those methods; drop dead `is_wp_error` on `wc_appointments_get_total_available_appointments_for_range` (never returns `WP_Error`).
    • Product appointment data store: staff relationship helpers (`get_relationship_rows_for_product`, insert/replace/update/delete, panel/REST joins); `update_staff` / `remove_staff_from_product` reuse them; plus pricing/legacy availability and staff cost meta helpers for Polylang/WCML/admin/REST.
    • Appointment data store: `update_last_status` for Follow-Up Emails.
    • Tests: `DataStoreOwnershipGuardTest` also owns `wc_appointment_relationships`, staff cost meta, and `_last_status`; no registry `debt_paths`. Live: location/resource data-store meta round-trips.
    • Tests: `AvailabilityLocationResourceRulesLiveTest` locks OR-pool resource Open hours (#1487) and resource `days` Open on day-duration products.
    Fixed
    • Product edit: compact number/unit and help-tip layout applies only to appointment fields (Duration, Inventory, Availability Check), so simple and other product types keep WooCommerce select widths and tip placement.
    • Availability / slots: Automatic rooms with Open hours alone again list bookable times; seats follow each room's Open window (not only Closed blackouts) (#1487).
  5. 5.5.0

    6 improvements8 fixes1 removed
    Improved
    • Compatibility with WooCommerce 11.2.
    • Timezone: abbreviation hover tip styles match across admin and My Account; the series list When column includes the abbreviation.
    • `get_booking_form_timezone` prefers saved user timezone over the browser cookie; optional `$user_id` for customer-facing displays.
    • Night span end advances in civil days (not PHP `strtotime('+N night')`). Tests: `AvailabilitySpanEndDateNightTest` locks night span end and night duration labels.
    • Tests: `TimezoneAxisLiveTest` freezes Fake UTC evening "now" for positive-offset same-day past checks (#1478); `FakeUtcAxisGuardTest` fails the build if Fake UTC tokens are formatted with site `wp_date` / `date_i18n`.
    • Availability hub: read-only footer copy says "You can edit your own hours."
    Fixed
    • Availability hub: on small screens the WordPress admin bar stays fixed with Screen Options / Help instead of scrolling away.
    • Availability hub: staff who can only manage their own hours can browse General and assigned product / location / resource rules read-only; Save stays on their Staff layer; Edit links hide without Create & Edit Products / Locations / Resources.
    • Availability: night-duration span end dates advance in civil days, and summaries show civil When with an N night(s) label.
    • My Account and order/email series times use the viewer timezone (saved preference, then browser, then site). Recurring pattern summaries and occurrence labels stay on the series booking axis so times no longer over-shift (e.g. 09:00 CEST shown as 18:00) (#1483).
    • Storefront: same-day slots stay bookable on positive-offset stores (e.g. Australia/Sydney afternoon) (#1478).
    • Availability / admin: day summaries, slot day keys, privacy export, save notices, and admin calendar day buckets keep appointment and slot civil days correct on non-UTC stores.
    • Availability / slots: Automatic rooms Closed for a day no longer leave seats bookable; storefront and admin create require a free allocated room (name shows when Selection is Automatic, show name).
    • Admin edit appointment: Locations & rooms experimental off no longer clears the room on save; Resources stays visible from history. Location change refilters rooms (concrete pick, no Automatic). Empty title area hidden; Created on / Save / Parent ID / Qty layout cleaned up.
    Removed
    • Product Duration: Night is no longer in the Duration dropdown (it was never a merchant option). Use Day for multi-day stays.
  6. 5.5.0

    1 new14 improvements11 fixes
    New
    • AutomateWoo: `appointment.location` and `appointment.resources` workflow variables (#1460).
    Improved
    • Admin: What's New leads with the Availability hub; Locations & rooms and Meet are labeled experimental (off by default under Settings → Appointments). When the beta is off, CTAs open that setting. Mobile section tabs, topic cards with Previous/Next, and NEW/BETA title pills are clearer; copy matches menu labels and beta gates; Help → What's New is omitted on that screen.
    • Availability hub: permanent left rail (title, description, search with layer filters, nested entity tree); full-width rule editor with Other rules that apply beside Week at a glance; layer and entity rows are real links; path toggle on small screens.
    • Product Availability tab: Week at a glance (same strip as the hub, product + General) and a short Availability hub link; new products show General hours until a draft is saved.
    • Product edit: Resources tab shows only a Locations nudge until the product has a venue (when locations exist); rooms still work alone when the shop has no locations.
    • Settings → Appointments → Experimental: Locations & rooms off fully stops new booking use and hides related admin screens; past appointments still show their venue/room; product and CPT data stay for re-enable.
    • Availability hub: new Open hours / Unavailable rules insert next to matching rows (not reshuffled on save); live search under the field with layer hit counts; timezone tip matches staff Availability; Restrict start days notes product weekdays; sticky rail docks without jumping.
    • Product edit: cancel/reschedule "before the start date." aligns with the number and unit fields; help tips after Duration, Interval, Padding, Lead Time, Scheduling Window, Inventory capacity, Availability Check, and Tax status/class align with the controls.
    • Storefront: location, staff, and resource extra costs use add-on style brackets (e.g. (+$5)).
    • Admin timezone abbr: `build_timezone_indicator_html`; calendar/panel/hub inject `adminTimezoneHtml` / `tzHtml`. Removed unused short-name map API, `adminTimezoneName`, and writepanel abbr locals.
    • `WC_Appointments_Features::is_locations_resources_allowed` is the force-off filter; `is_locations_resources_active` is allowed && Experimental checkbox. Filter `woocommerce_appointments_locations_resources_active` false force-offs (CPT/meta kept) and hides the setting. Appointment snapshot display stays ungated. Removed `is_locations_resources_admin_visible`. Hub entities include `staffIds`, `locationIds`, and `resourceIds`.
    • RRULE match caches reset when store timezone identity changes mid-process. Admin settings page memoizes one settings instance. Tests: `create_location` / `create_resource` force Locations & rooms on after Features flag tests.
    • Tests: IcsExporterStaleEntryRegressionLiveTest (#1480); TimezoneTest and TimezoneEnvironmentLiveTest (DST abbreviations); SlotsTimezoneLiveTest America/Chicago compare-start; ZeroTotalCheckoutSyncLiveTest (€0 settle, idempotency, stale cache).
    • Tests: FeaturesLocationsResourcesFlagLiveTest; LocationsLiveTest staff capacity at location (#1475); MyAccountRescheduleContractLiveTest (#1474); Issue1470PriorityOverrideTest (product Open vs global full-day Closed by priority, dynamic + indexed); hub-rule-insert-index.test.ts for Availability hub new-rule insert index.
    • Series preview: `_dtstart_booking_axis` makes `normalize_preview_args` axis conversion idempotent; `payload_from_body` / cart preview skip a second normalize.
    Fixed
    • ICS export: VTIMEZONE DAYLIGHT/STANDARD use real DST transitions so EU zones keep last-Sunday March/October and strict clients no longer show events one hour late (#1480).
    • Timezone labels: short abbreviations follow DST at the appointment time (e.g. London BST/GMT, Brussels CEST/CET) in emails, cart, and admin (#1479). Offset-style PHP abbreviations (GMT+0000) and Woo `+00:00` zone IDs map to UTC/UTC±N instead of leaking into the storefront picker.
    • Storefront: Default timezone shows city and abbreviation (e.g. Default (Ljubljana - CEST)); picker Default option uses the same site timezone as the form. Calendar bootstrap keeps site today selectable on positive-offset stores (#1478).
    • Checkout: free (100% coupon / €0) appointment orders no longer re-fire completed and flood emails when object cache keeps a stale pending snapshot (#1477). Appointment Select2 styles no longer pad the country/state dropdown.
    • Availability / slots: staff capacity fully overrides product capacity again (pre-5.5). Locations no longer re-clamp staffed slots by Inventory Capacity; room limits stay on Resource Max at once. Unstaffed products still count capacity per location. Locations without a matching room stay bookable on staff/product capacity; unscoped resources still close slots while venues exist (claim the resource to a venue first). Choose-resource copy works with singular or plural labels.
    • Storefront: staff and resource SelectWoo labels show name and avatar again (#1474); after changing location, the resource list shows only rooms for that venue plus shared (#1472); resource Select2 keeps its featured image after venue filtering; changing quantity no longer clears a still-valid selected time.
    • My Account: rescheduling saves a newly selected location and resource (#1474).
    • Availability hub: Week at a glance on a room includes the linked location's open hours and closed rules; Unavailable rules at the same priority no longer get reopened by earlier Open hours; search, rail, and pills omit disabled location/room layers; search keeps results until cleared, marks the open entity, and does not clip the focus ring; rail scroll stays put on pick and pins deep-linked rows; dragging to reorder rules refreshes Save / Discard; admin notices sit in the main editor column; product duration uses plural forms.
    • Admin panel: create/edit availability checks include the selected room/resource so listed slots are no longer marked unavailable; panel notices show the server reason when a check fails.
    • Night-duration products: checkout and add-on extended spans use Fake UTC civil day tokens and the date-slot path (like day products), so availability no longer rejects valid night bookings on non-UTC stores.
    • Recurring series preview: store→booking timezone conversion on `dtstart` runs once. REST civil `dtstart` strings stay on the booking axis; repeating normalize no longer shifts weekly sessions outside open hours on non-UTC stores.

Changelog published by the developer, in their original language.