Skip to main content

Appointments Changelog

Recent releases for WooCommerce Appointments. Older versions live in the changelog archive.

[5.4.10] - August 20, 2026

Latest

Focused on Google Calendar, Storefront, and Admin panel. 1 improvement and 4 fixes.

Improvement

  • Compatibility with WordPress 7.1.

Fixes

  • Storefront: changing staff with auto-select on keeps the selected date and time when still available; otherwise shows Show first available next to No slots available.
  • Google Calendar: appointments from another site on a shared calendar import as busy rules (foreign site_url). Editing that busy rule no longer overwrites the Google appointment event.
  • Google Calendar: restored woocommerce_appointments_gcal_sync_updated_description on event updates (dropped in the 5.0 sync rewrite).
  • Admin panel: changing day or a duration add-on no longer jumps the form scroll back to the top of the mini calendar.

[5.4.9] - August 15, 2026

Focused on Admin panel, Storefront, and Cart (+2 more). 2 improvements and 6 fixes.

Improvements

  • Admin panel create: WooCommerce Deposits uses the same outlined card as billing, with pay-deposit guidance and payment plans only while paying a deposit.
  • Admin panel browse: month availability includes the day’s time slots in one request; open browse joins the in-flight prefetch.

Fixes

  • Cart: logging back in during checkout restores the in-cart hold; abandoned-cart cleanup no longer deletes a hold already linked to an order.
  • Admin panel: mini calendar marks a day available only when at least one slot has enough capacity for the quantity field (same rule as the time list).
  • Storefront: time slots refresh for the full add-on duration (longer or shorter), so late starts that no longer fit are removed from the list.
  • Emails: custom theme subclasses of appointment emails no longer fatal on PHP 8 when they override trigger() or init_form_fields() without a : void return type.
  • Storefront: add-ons after the calendar appear once a date (or month) is chosen, so extras that change duration stay visible when no times are left.
  • Admin calendar: third-party admin notices no longer push the grid down; calendar errors still show flush under the toolbar.

[5.4.8] - August 8, 2026

Focused on Appointable product, Admin panel, and Admin calendar (+2 more). 1 feature, 6 improvements, and 12 fixes.

Feature

  • Appointable product: set Padding Before and After separately on one row. Existing padding stays Before; After defaults to 0.

Improvements

  • Availability / slots: the gap between appointments uses After from the earlier booking plus Before from the later one (timed, day, and shared staff). With only Before set (the default after upgrade), identical products keep the same handoff gap.
  • Admin panel: create/edit recurring uses the same outlined card as billing and add-ons; schedule fields use compact floating labels in one row.
  • Admin calendar: on narrow screens the period title opens a month or date picker (prev/next hide); week and list show a month label; tapping a month day opens Day view and Back returns to that month.
  • Admin panel: create opens upper-biased on narrow screens; tighter floating-label insets; availability dims while checking; status chips match border to label on create/edit; customer search drops the clear control; overnight +Nd sits beside the End date floating label.
  • Admin calendar: Screen Options/Help tuck with a peek and hide the toolbar when open; toolbar stays fixed under the admin bar; borderless period/view controls; wider padding on large screens.
  • Storefront: Customizer Selection color skips inline CSS when it matches the default.

Fixes

  • Storefront: multi-day day-duration products again highlight the booking span after picking a start day; timezone abbr shows one tip; the form still initializes when page optimizers delay jQuery or script params.
  • Availability / slots: 24h duration with an hourly grid again lists each hour when the next day is also appointable.
  • Admin panel: Select2 aligns on create from Add New; focused fields scroll above the mobile keyboard; mini calendar fits narrow panels; edit keeps Update in the footer (disabled until dirty).
  • Admin panel create: Product Add-Ons date picker no longer closes the panel; footer cost refreshes when add-on prices change without duration.
  • Admin panel: product dropdown lists appointable products again on non-calendar screens; customer search and Customer label translate on standalone create/edit.
  • Admin panel: Pick from calendar keeps the selected day for staff timezones; day/all-day edit availability uses civil dates; mini calendar refreshes when product, staff, or quantity changes; switching product on edit updates date/time for the new type without jumping the panel.
  • Admin panel: staff on unstaffed products is optional for managers only and ignored in availability checks.
  • Admin calendar: Order Total after panel create is correct; narrow layouts keep the filter panel, month cells, and timed events in bounds; day headers stay flush under the fixed toolbar with admin notices below.
  • Admin calendar: midnight appointments show when staff timezone differs from the site; opening a view scrolls to now or 08:00 in week/day, and to the top in month/list.
  • Admin calendar: Screen Options and Help are usable again for admins and staff (WooCommerce sticky header no longer covers them).
  • Admin: legacy Create as a Customer again books for the selected customer; configuration notices no longer appear on non-appointable products.
  • Appointable product: Padding Before/After keeps equal gap when the unit wraps and no longer sits flush against the field above.

[5.4.7] - August 3, 2026

Focused on Admin panel, Admin calendar, and Availability / slots (+2 more). 9 improvements and 15 fixes.

Improvements

  • Admin panel: create/edit fields use outlined floating labels (Checkout-style); status uses compact filter chips; attendance is hidden on create, editable on edit, and muted text on view; Pick from a calendar stays a compact trigger until opened.
  • Admin calendar: sticky toolbar and day headers under admin chrome with one page scrollbar; the toolbar docks under the admin bar while you scroll.
  • Admin: calendar/panel product list loads with a light id/title/color query instead of hydrating up to 200 full product objects on every admin load.
  • Admin panel browse: day availability evaluates each rule once; all-day RRULEs reuse the in-request path instead of rebuilding minutes every civil day.
  • Admin panel: primary form controls use 14px body text; series list shows date and time ranges on separate lines.
  • Admin panel create: browse no longer auto-opens when a slot is unavailable; Add New without calendar prefill leaves date/time empty (date-only calendar picks still auto-select the first time).
  • Admin panel: product select uses preloaded products (instant); clear (x) removed on create/edit; duplicate titles append SKU or #id; duration sits on the When row; line Total shows only when it differs from order total.
  • Admin calendar: compact one-row toolbar; Add New is a leading filled button (label on wide screens, icon-only on narrow); filter button shows an active-count badge only (selections stay in the filter panel).
  • Admin calendar: hovered and selected events use a white ring plus lift; selected events rise above overlaps.

Fixes

  • Admin calendar (staff): appointments you create for products without assigned staff stay on the calendar immediately (creator matches the locked staff filter, same as after reload).
  • Admin panel create: real midnight slots (00:00), including admin-TZ midnight, keep a timed calendar preview and availability checkmark (slot timestamp distinguishes them from date-only placeholders).
  • Admin panel: narrow view fills the viewport; series uses panel scroll; customer timezone and cost lines stack; series rows are date | status | open.
  • Admin calendar: switching the appointment panel from view to edit no longer flickers the calendar event (preview ghost only appears after the draft schedule changes).
  • Admin calendar: full-day unavailable stripes stay on the civil day (not shifted by admin timezone); stripe tips on hover/tap instead of a modal; tapping a stripe no longer opens create; empty cells open create again.
  • Admin calendar: sticky WooCommerce header chrome scoped to the calendar page only; staff Screen Options/Help no longer inflate Firefox scroll; empty preload ranges still seed so first paint skips REST; availability rules load again when indexed cache is enabled.
  • Admin calendar SSE: after a recurring series materializes, the view panel gets the full occurrence list and package pricing; one series create snackbar with customer and pattern.
  • Admin calendar SSE: new appointments stay after month navigation (cache insert); payloads build only when queued and flush once per request; burst creates/bookings collapse to one snackbar count.
  • Admin calendar/panel (staff): product preload respects Create Appointments for Any Product; create auto-selects the logged-in staff when assigned; toolbar Add New uses the same path as slot-pick (no full reload).
  • Admin panel create: required date/time errors show under those fields and clear when valid; hourly auto-select no longer rolls the form date forward when staff timezone differs from the site.
  • Admin panel: Staff field shows or hides from product preload (same as add-ons); create availability responds faster; day-duration checks use the correct civil day when staff timezone differs; timed availability keeps slot timestamps when site and admin browse days differ.
  • Admin panel browse: skeleton cells under a kept header; day click and view toggles reuse in-memory data; SSE invalidates browse caches while open; product switch reloads the open mini-cal.
  • Availability / slots: overnight RRULE blocks (e.g. weekly Fri 22:00-02:00) again split across civil days (evening on the start day, morning on the next).
  • Storefront recurring: create the series when the order reaches on-hold (cheque/BACS), not only processing/completed, so offline payment checkouts still materialize appointments.
  • ICS export: offset-based store timezones (e.g. +01:00 from gmt_offset) no longer fatal VTIMEZONE generation when DateTimeZone::getTransitions() returns false.

[5.4.6] - July 30, 2026

Focused on Admin panel and Indexed availability. 2 fixes.

Fixes

  • Admin panel: product configuration probe scans the booking horizon in capped chunks (14/30/60 days) instead of only the next two weeks, so global rules or RRULEs with a later start do not trigger false "no bookable times" notices.
  • Indexed availability: index readiness and multi-staff slot generation align with fetch guards (malformed scope rows no longer mark the index ready; empty indexed batch falls back to dynamic/global rules); fixes global-only rules not applying and false product config notices after 5.4.5.

[5.4.5] - July 30, 2026

Focused on Admin panel, Storefront, and Indexed availability (+1 more). 2 improvements and 5 fixes.

Improvements

  • Admin panel: Product edit shows configuration notices at the top when saved settings may prevent bookable slots; notices distinguish misconfiguration from fully booked inventory (slots engine diagnostics) and link to the matching Appointments tab.
  • Admin panel: Clearer help tips on duration, interval, availability check, and rule quantity fields.

Fixes

  • Indexed availability: product- or staff-scoped rules with an empty kind_id no longer leak as global rules (read-side scope guard, write-side skip on index); manual re-index reports skipped malformed rules; get_title() returns empty string for NULL legacy titles (avoids PHP 8 TypeError on re-index).
  • Admin panel: Configuration check and probe use the slots provider only (indexed availability, staff merge, index fallback): no false duration-vs-window warnings on full-day or weekday rules; priority-based engine diagnostics; Availability check mismatches when slots exist but none qualify as bookable starts.
  • Admin calendar: month view highlights today with the same badge as week and day views; legacy calendar falls back to week view when the saved view is List (React-only).
  • Storefront time picker: getInstanceContext() works when passed the form element (legacy theme markup); empty-day and AJAX error notices use consistent slot_row / ul / li.slot markup (full width, no bullet).
  • Storefront date picker: multi-staff autoselect uses staff-aware calendar day_data (async month load); autoselect products skip full-range default-date scan; non-autoselect uses chunked first-slot for the pre-selected provider.

[5.4.4] - July 27, 2026

Focused on Product Add-ons integration and Admin calendar. 2 fixes.

Fixes

  • Product Add-ons integration: decode jQuery .serialize() form payloads with wp_unslash() before parse_str() in legacy cost filter.
  • Admin calendar: guest customer labels on HPOS stores read billing from wc_order_addresses (not legacy _billing_* order meta), restoring "Name (Guest)" on calendar preload and SSE updates.

[5.4.3] - July 26, 2026

Focused on Admin calendar, ICS export, and Admin panel (+6 more). 4 improvements, 10 fixes, and 1 deprecation.

Improvements

  • Admin calendar preload: eligible-ID query plus batched postmeta hydration; batched order meta (no per-order WC_Order hydration). Recurring series package summary on bulk fetch (get_panel_preload, one load per series id); full appointment panel still loads on open.
  • Admin panel: remove Cancel from create/edit footer (close via X / backdrop).
  • Admin calendar: Google-style grid (horizontal week lines only in month, stacked week/day headers, centered month dates); neutral toolbar chrome (admin body text/borders), segmented view switcher, primary + Add New beside Filters (icon-only; label on hover/aria).
  • ICS export: log a warning when unloadable entries are skipped (WooCommerce → Status → Logs).

Fixes

  • Admin calendar: toolbar spans full wrap width below Screen Options/Help; staff without WooCommerce header get Add New in the toolbar; staff/creator filter uses EXISTS (not INNER JOINs); Fake UTC civil preload range and YmdHis row parsing (not strtotime); shared excluded-status list (cancelled visible; holds/trash/drafts hidden) on SQL query, legacy API, and frontend; orphan/deleted post_parent order IDs pre-filtered before batch order load; availability rule background stripes reload when switching months.
  • REST API: appointments get_item_schema() extends the parent schema instead of starting from null.
  • Security: sanitize/unslash POST/GET at origin across storefront AJAX, data stores, cart, SSE, cron, widget, admin (AJAX, settings, calendar, list table, exporters, meta boxes, product edit), WPML, Google Calendar, and integrations; prepared SQL for lookups and migrations; escape output in admin views; guest-only rate limit preserved for cached pages with optional nonces.
  • Storefront/admin AJAX: parse jQuery .serialize() form payloads before per-field sanitization (not sanitize_text_field() on the encoded string — destroys %XX sequences for timezones, times, and add-on text).
  • SSE: preserve dotted event names (appointment.created) in the stream; sanitize_key() stripped dots and broke admin calendar live updates.
  • Availability rules JSON: decode unslashed payloads first (callers pass wp_unslash( $_POST )); double-unslash broke rule titles containing quotes.
  • Admin calendar: week/day column headers use browser-local date (not UTC parts); legacy week/day data-time and calendar_day= links use site timezone (not gmdate); batched order line item meta resolves global attribute term names (not raw slugs) in the appointment panel.
  • Add Appointment and My Account series actions: read REQUEST_METHOD from $_SERVER (not filter_input( INPUT_SERVER ), unreliable under some SAPIs).
  • Legacy install migration: delete product availability post meta by key after table migration (not a single rule value).
  • ICS export: skip unloadable appointment entries so stale IDs do not fatal calendar generation.

Deprecation

  • WC_Product_Appointment_Rule_Manager::get_minutes_from_rules() remains as a compatibility shim; use WC_Appointment_Slots_Rule_Resolver::build_minute_mask() instead.

[5.4.2] - July 18, 2026

Focused on Indexed availability and Google Calendar. 2 fixes.

Fixes

  • Indexed availability: RRULE expansion follows range_type (same as dynamic); orphan rrule on non-rrule rules uses the non-RRULE path and purges legacy expand rows on background passes.
  • Google Calendar: inbound sync clears rrule when an event is stored as non-recurring (custom / custom:daterange).

[5.4.1] - July 16, 2026

Focused on Indexed availability, Storefront, and Google Calendar (+3 more). 3 improvements and 5 fixes.

Improvements

  • PHPStan: level 2 with a clean baseline — expanded plugin and integration stubs plus PHPDoc/type fixes across core.
  • Indexed availability: occupancy reads from appointment cache when healthy (live fallback during backfill; in-cart recurring holds merged); backfill batches gap-only missing appointments.
  • Storefront calendar: data-engine reports rules/occupancy source (1 indexed, 2 dynamic, 3 indexed + appointment cache).

Fixes

  • Indexed availability: weekday time:N rules count only matching days; re-enable no longer wipes inline indexing; backfill pending flag clears/re-queues stale jobs and stops on zero-gap batches.
  • Google Calendar: scheduled sync is forward-only unless admin full re-sync; inbound sync skips stale events (event ID / site_url mismatch).
  • Availability / slots: overlap day keys use Fake UTC civil midnight so 00:00 wall slots stay on the correct day on negative-offset stores.
  • Orders: order-scoped line-item lookup ($order_id on get_appointment_ids_from_order_item_id) — orphaned _appointment_order_item_id no longer shows another customer’s appointment; line delete clears the link before ID reuse.
  • Cart: session load removes holds tied to terminal orders or past start dates and releases in-cart appointments to was-in-cart.

[5.4.0] - July 10, 2026

Focused on Pricing, Storefront, and Settings (+18 more). 4 improvements and 20 fixes.

Release highlights

  • Recurring prepaid packages — series checkout with RRULE, REST v2 /series, storefront preview, cart, and My Account; min/max sessions, partial checkout when some dates are unavailable.
  • Recurring pay-first — first session paid at checkout; balance order for the remainder with storefront and My Account pay links, staff actions, and package-focused emails.
  • Recurring package pricingSessions in package rule on the series subtotal (per-session adjust; ×/÷/= on package total).
  • Product Add-ons for series — per add-on Use once per recurring series (price/duration once vs every session); wired through preview, cart, pay-first, and admin create.
  • Scoped reschedule & cancel — apply to this appointment, following, or all (admin panel and My Account); batch conflict errors name the blocking occurrence.
  • Membership credits — apply at add-to-cart for recurring packages; credited appointments in View Subscription; compact membership summary in My Account.
  • Indexed availability performance — DB indexes on rule tables; occupancy reads from appointment cache when healthy; combined Settings → Indexing intro.
  • Storefront & admin polish — recurring preview loading states; live admin calendar SSE updates; REST availability filter SQL allowlist (security).

Improvements

  • Settings → Indexing: combined section intro with scannable structure (benefit, when to use, warning, maintenance).
  • Pricing: display-only quotes can skip is_appointable() in calculate_appointment_cost() (filter/post flag); add-to-cart still validates.
  • Recurring package footer: single cost summary, session count under hero price, deposits excluded from preview; removed deprecated checkout_footer_html.
  • Removed ~1 MB of unused Moment.js from storefront scripts.

Fixes

  • REST API: allowlist availability filter column keys before SQL (closes unauthenticated injection on public /availabilities).
  • Storefront timezone Default: persists via appointments_use_site_timezone; custom zones still use appointments_time_zone.
  • Storefront: unavailable ?time=HHMM shows selected time with "(Selected time is unavailable)" instead of auto-picking first slot.
  • Availability / slots: past-date guard and legacy timed storage use Fake UTC civil day; day/month add-to-cart omits _time after midnight.
  • Availability rules: fix rule id assignment and $rule_val init; priority input fills column on global and staff tables.
  • Pricing: multi-day day-unit totals sum each civil day (matches slot preview; PAO duration flats skipped when billed per day).
  • Per-day inventory: in-cart recurring session_starts occupancy included when marking civil days sold out.
  • Admin add appointment: reject missing posted date before parsing year/month/day.
  • Admin panel: create panel anchors to calendar slot when Add New is opened first, then a time is picked.
  • Admin product staff panel: fix assign-staff AJAX scope and staff view self:: call.
  • Admin calendar: preload spans prev/current/next month grids so view switches use cached appointments.
  • Google Calendar: sync errors log exception messages; HTTP backoff returns explicit error when retry loop exits without a response.
  • Partial refunds: each reduced-qty appointment keeps the correct per-line-item $remaining_qty.
  • Series My Account: invalid action redirect no longer leaves $result / $notice undefined.
  • Helpers: remove undefined $gmt_offset / $cart_item reads in timezone and addon duration helpers.
  • Privacy: exporter registration returns exporters array from register_exporters().
  • CRM integration: initialize note strings before appending comment HTML.
  • Webtomizer deposits: check $appointment_ids array before updating partial-payment status.
  • Product Vendors integration: declare global $wp_roles before role cap setup.
  • Follow-Up Emails: pass null appointment to variable-replacement filter when queue item has no appointment context.

[5.4.0-beta6] - June 28, 2026

Pre-release

Focused on Recurring, Checkout validation, and Storefront (+2 more). 3 improvements and 9 fixes.

Improvements

  • Minimum WordPress raised to 5.9 (Requires at least) so str_starts_with() is polyfilled by core on PHP 7.4; aligns the declared requirement with the existing Requires PHP: 7.4 matrix.
  • Recurring: add-to-cart preview cache and request helpers on WC_Appointment_Series_Request (cart trait and integrations call it directly).
  • Recurring storefront: per-occurrence reschedule suggests nearest available slots across a frequency-aware window (one RRULE step before and after the target day) instead of a fixed same-day-only 3-day span, so weekly/monthly series now offer adjacent same-weekday/week slots; the reschedule action is a labeled pill (not an icon-only glyph) and the alternatives list is headed "Nearest available slots" for discoverability. Shared by the admin create panel.

Fixes

  • Checkout validation: per-day inventory no longer counts the customer’s own in-cart hold when re-checking availability (same overlap-exclude scope as slot occupancy), fixing false “slot no longer available” at checkout on qty-per-day products.
  • Storefront: [appointment+_form] shortcode and Appointment Form block post add-to-cart to the embedding page (same as WooCommerce [product_page]) so product permalink redirects no longer drop booking data.
  • Recurring storefront: frequency and payment chips stack in a single left-aligned column below 36em (same breakpoint as Every/For).
  • Membership credits: recurring packages no longer emit PHP 8.1+ deprecation notices on add-to-cart (subscriptions integration no longer calls static trait methods).
  • Recurring pay-first: balance orders are created when the pay-first series is confirmed at checkout (next sequential order id); opt out with wc_appointments_recurring_auto_create_balance_order.
  • Recurring pay-first: balance orders get custom order numbers on create (same hook as other programmatic WooCommerce orders; default pending status from first save).
  • Recurring pay-first: balance pay links read the stored payable balance order only (get_balance_pay_url() no longer creates orders on read; staff/customer actions use ensure_payable_balance_order()).
  • Recurring pay-first: balance order staff actions on the WooCommerce order edit screen use nonced admin links (no nested forms or JavaScript); HPOS-safe order edit redirect after balance actions.
  • Pricing: day/month bookings on the Fake UTC axis set _slot_token_timestamp so range-of-days rules use gmdate weekday (not wp_date), fixing a one-day shift on non-UTC stores (e.g. America/Chicago).

[5.4.0-beta5] - June 21, 2026

Pre-release

Focused on Membership credits, Storefront, and Recurring (+4 more). 3 improvements and 11 fixes.

Improvements

  • i18n: merge generic admin confirms, errors, and required-field messages to shared strings; fix post-status _x() context bug; caching horizon months use _n(); align AutomateWoo status labels; normalize All Staff / Export Appointments / Edit product casing.
  • Membership credits: View Subscription Credited appointments reuses myaccount/appointments.php (pagination, newest first); credits show as X of Y remaining.
  • My Account templates: consolidate series list into appointments.php; rename series-detail.phpview-series.php (matches endpoint).

Fixes

  • Membership credits: shift stored _wca_credit_balance on linked subscriptions when a plan product's appointments-per-period changes (product save).
  • Order lines: get_appointment_ids_from_order_item_id() uses appointment _appointment_order_item_id only by default; order-line _appointment_id cache is opt-in via woocommerce_appointments_use_order_item_appointment_cache.
  • Membership credits: consume on payment or when a paid order links an appointment; skip lines with no linked appointment.
  • Storefront: Product Add-ons show again after a time slot is selected — revert 5.4.0 show/hide to wc-appointments-appointment-hook-after (matches CSS and theme overrides); remove unused wc-appointments-appointment-extra class.
  • Storefront: recurring Repeat this appointment checkbox shows again after slot selection — toggle .wc-appointments-recurring-hook with the same cost-calculation show/hide as add-ons (without restoring wc-appointments-appointment-extra).
  • Storefront: recurring series price quote updates when WooCommerce Deposits pay-deposit / pay-in-full (or plan) options change.
  • Admin panel: Add New opens the creation panel again — only defer visibility for calendar-anchored create; restore preview fallback dropped in 5.4.0-beta4.
  • Google Calendar: disconnect clears sync tokens and cached access tokens; connected UI follows refresh token; upgrade removes legacy pre-5.0 gCal transients; global inbound sync no longer skipped when staff sync for the same calendar failed; 404 on calendar fetch clears sync token and surfaces re-select calendar.
  • Recurring pay-first: balance orders are payable only when pending/failed (no read-time line sync or status reset); series balance settles on partial-payment as well as processing/completed; due occurrences marked paid when the balance order is paid online.
  • Recurring storefront: order-received and My Account use the compact balance block again — email balance table stays on emails only.
  • Recurring pay-first: balance order emails and order views label only the first session as paid on the original order; later sessions show balance-due/confirmed labels; My Account series detail lists original and balance orders; pay-balance link on the order line series display (processing email uses the same order instance as series creation); balance payment links due occurrences to the balance order; series confirmation email no longer embeds the parent order table; staff balance actions stay on the order edit screen only (not in admin order emails).

[5.4.0-beta4] - June 16, 2026

Pre-release

Focused on Recurring, Membership credits, and Admin panel (+4 more). 1 feature, 9 improvements, and 5 fixes.

Feature

  • Recurring packages: Product Add-ons per add-on Use once per recurring series (default: price and duration on every session); series preview, cart, pay-first, admin panel create, and Add-ons product tab.

Improvements

  • AutomateWoo: verified compatibility with 6.4.0; appointment time variables use AutomateWoo core AbstractTime (removed duplicate).
  • Recurring: scoped reschedule (Apply to: this appointment, following, or all) in admin panel and My Account; fixes series datetime edits that bypassed EXDATE/RDATE. My Account skip/cancel routes through the same scope layer as admin status changes. Batch reschedule conflict errors name the blocking occurrence.
  • Recurring pay-first: balance payment request email reuses the shared balance-summary block and package-focused intro (paid-on-original-order and package total above the order table) instead of generic “order created” copy.
  • Admin panel: pay-first Package balance section reuses pricing Cost/Tax row styling; bordered action chips and icon-only feedback.
  • Membership credits: booking-form picker applies credit at add-to-cart (single get_booking_context() resolver); checkout is confirm-only with compact fallback opt-in.
  • Membership credits: cart shows strikethrough covered value with $0 due; membership credit row shows plan, covered amount, and balance (orders too); credit lines stay $0 after other cart pricing hooks.
  • Membership credits: checkout opt-in uses the same markup and styles as the booking form footer.
  • Membership: subscribe thank-you Book appointment CTA; _wca_first_booking_product_id stored at grant time.
  • My Account → Appointments: compact membership summary card (replaces full credits table); empty-state Book links to stored first-booking URL when available.

Fixes

  • Recurring storefront: package preview via wc-ajax (shared WooCommerce session) — no stale REST nonce / “Cookie check failed”; preview stays public like slots AJAX.
  • Recurring pay-first: repair incomplete pay-first meta when series totals are missing on the series row.
  • Admin panel: recurring series orders use the preview package total — set unit price before add_product() so the order line is correct at creation.
  • My Account: cancelling a recurring appointment from the appointments list now updates the series (EXDATE) instead of orphaning the occurrence.
  • Membership credits: recurring packages can use membership credits — one credit per billable appointment in the series (cart $0, validate balance, consume/restore on order); cart and booking UI show remaining credits after cart reservations.

[5.4.0-beta3] - June 9, 2026

Pre-release

Focused on Recurring, Admin panel, and AutomateWoo (+1 more). 2 improvements and 8 fixes.

Improvements

  • Recurring pay-first: balance orders as appointable line items with in-item series summary (legacy fee orders upgraded on repair); mirror parent balance block and occurrence labels.
  • Admin panel: preset last-used appointment status on create.

Fixes

  • Recurring storefront: qty/add-on/payment refresh pricing only; balanced reschedule suggestions; Fake UTC session_starts for TZ-aligned cart/checkout; guest preview no login; no double-charge when inventory > 1.
  • Recurring pay-first: Mark paid offline completes balance order; balance admin mirrors parent block; parent qty/tax/shipping before totals; incl-tax catalog as ex-tax nets; materialization no longer overwrites line subtotals.
  • Recurring / emails & My Account: View series 404 — register view-series query var; permalink flush.
  • Recurring series: occurrences inherit checkout inventory/qty at create.
  • Recurring / product admin: Repeat frequency checkboxes no longer overlap (plugin admin CSS).
  • Admin panel: view/edit qty from calendar inventory; create form browse-on-focus, debounce, day-slots spinner, auto-pick success.
  • AutomateWoo: appointable type on product_type_selector outside wp-admin for Action Scheduler product queries.
  • Admin calendar: live SSE storefront updates via admin-ajax (EventSource cannot auth REST cookies).

Older releases (2015–2026) →


Generated from the plugin changelog on build.