Skip to main content

Recurring Appointment Packages

Recurring appointment packages (5.4+) let customers book a series of sessions in one checkout — for example, 8 weekly yoga classes or a 12-session treatment plan.

Which feature do I need?​

You want…UseRequires
Fixed session pack (e.g. 8 weekly classes), prepaid or pay-firstRecurring packages (this page)Appointable product, WooCommerce Appointments 5.4+
Ongoing subscription with X bookings per billing periodMembership creditsWooCommerce Subscriptions
Both — members use credits; everyone else buys packsRecurring packages and membership creditsWCS + appointable products (separate product types)
Same store, two products

Recurring packages live on an appointable product (Repeat this appointment). Membership credits live on a subscription product (Appointments tab). A product cannot be both types — use two products when you need both models.

Terminology
TermMeaning
PackageMerchant-facing label — what the customer buys (e.g. “8-class pack”)
SeriesCode and REST entity (WC_Appointment_Series, /v2/series) — one RRULE schedule + payment record
Session / occurrenceA single appointment in the series
Before you begin

How it works

Customers pick a slot, enable Repeat this appointment, choose a pattern (daily, weekly, or monthly) and session count, then checkout once. The plugin creates a series record and materializes each session as its own appointment (RRULE scheduling).

What you need

  • WooCommerce Appointments 5.4+
  • An appointable product with Can be recurring? enabled
  • Availability for the previewed sessions (partial checkout may apply when allowed)

What you get

  1. ✅ Multi-session packages in one checkout (prepaid or pay-first)
  2. ✅ Repeat picker with live preview on the booking form
  3. ✅ Pay-first balance orders for remaining sessions
  4. ✅ Admin panel series view and My Account → View series
  5. ✅ Appointments in package pricing rules and once-per-series add-ons

Not this

  1. ❌ Open-ended subscriptions on appointable products — use Membership credits
  2. ❌ WooCommerce Deposits on the same recurring checkout line (pay-first uses balance orders)

Important

  • Package / series = the purchase; session / occurrence = one appointment in the list
  • Prepaid = full package charged at checkout; Pay-first = first session now, remainder on a balance order
  • Enabled site-wide by default — disable with wc_appointments_recurring_enabled
  • Settings → Appointments → Recurring packages was removed in 5.4; defaults use filters (see Pay-first section)

Setup order: Product setup → Storefront booking → Cart & checkout → Pay-first & balance orders → Admin → My Account

Product setup​

On an appointable product → General tab, below reschedule options:

Appointable product — Can be recurring, session limits, and payment model

Can be recurring?​

Enable Can be recurring? to show the Repeat this appointment picker on the storefront.

Repeat frequencies​

Choose which patterns customers may use:

  • Daily
  • Weekly
  • Monthly

Session limits​

Set minimum and maximum occurrences (sessions) per package. Filters can adjust limits per product:

  • wc_appointments_recurring_min_occurrences
  • wc_appointments_recurring_max_occurrences
  • wc_appointments_recurring_min_billable_sessions

Payment model​

SettingStorefront behavior
Pay for all appointments nowPrepaid only
Pay for first appointment onlyPay-first only
Customer chooses on booking formCustomer picks prepaid or pay-first

Filters:

  • wc_appointments_recurring_payment_options — limit offered models
  • wc_appointments_recurring_default_payment_model — pre-selected option

Package pricing​

Use Pricing tab rules with Appointments in package to discount longer series (adjusts package subtotal). See Pricing Rules.

Storefront booking​

After the customer picks a date/time (and staff, add-ons, etc.):

  1. Check Repeat this appointment
  2. Choose frequency, interval, and number of sessions
  3. Review the live preview of upcoming sessions and totals
  4. Choose prepaid or pay-first when the product allows both

Booking form — Repeat this appointment with live session preview

The cost footer shows:

  • Prepaid: full package total due at checkout
  • Pay-first: first session due now + remaining balance summary
note

WooCommerce Deposits is hidden during recurring checkout. Pay-first packages use balance orders for the remainder, not deposit rules on the same line.

Partial checkout: if some preview sessions are unavailable, checkout may proceed with available sessions when wc_appointments_recurring_allow_partial_checkout allows it (default: true).

Cart & checkout​

The cart line describes the package (product, pattern, session count) rather than a single slot.

Cart — recurring package line showing session count and package total

On order confirmation (when the order reaches on-hold, processing, completed, or partial-payment):

  • Prepaid: series is created; all occurrence appointments are materialized
  • Pay-first: first session is paid on the parent order; balance order is created for the remainder (see below)

Offline gateways that leave the order on-hold (cheque, BACS) still create the series and appointments. Pending payment alone does not.

Membership credits: one credit per billable session in the series at checkout when credits apply. See Membership credits.

Pay-first & balance orders​

Where to add code

Add filters in your child theme's functions.php or a small site-specific plugin — not in the plugin files (updates will overwrite them). See Where to add code.

When the customer chooses pay-first:

  1. Checkout charges the first session (plus once-per-series add-ons, etc.)
  2. On confirmation, a balance order is created for the remaining package total
  3. Customer pays via Pay remaining balance (My Account, order emails, or staff actions)

Automatic balance order​

Balance orders are created automatically when the series is confirmed at checkout (default). Opt out:

add_filter( 'wc_appointments_recurring_auto_create_balance_order', '__return_false' );

Balance invoice timing​

// Default: 'manual' — staff/customer triggers balance invoice
add_filter( 'wc_appointments_recurring_balance_invoice_timing', function () {
return 'on_balance_order_created'; // send when balance order is created
}, 10 );

Staff actions​

On the WooCommerce order edit screen for a pay-first series, staff can create or manage the balance order (HPOS-safe links).

Removed settings (5.4)

Settings → Appointments → Recurring packages was removed. Auto balance creation and invoice timing use code defaults overridable by the filters above.

Admin management​

Appointments list​

Filter by series or open individual occurrences. Package rows link to the parent series where applicable.

Admin appointment panel​

When viewing a series appointment on the calendar:

  • Series badge and sessions list
  • Apply to scope: this / following / all for status changes, cancel, skip, reschedule
  • Package balance section for pay-first (pay link, mark paid offline)
Scoped actions

Confirm Apply to (this / following / all) before cancel or skip — multiple sessions can change at once.

See Admin Appointment Panel.

Classic edit screen​

Full WordPress appointment edit remains available for deep edits.

Customer My Account​

Appointments list​

Shows individual sessions and series summaries. Membership credit balance may appear when applicable.

My Account — appointments list with series summary and Pay remaining balance

View series​

My Account → Appointments → View series (view-series) for package detail:

  • Pattern, session count, payment status
  • List of occurrences with status
  • Pay remaining balance (pay-first)
  • Cancel future, Skip session, scoped Reschedule (per product rules)

My Account view-series — session list, pattern, and pay-first balance actions

Scoped actions match admin Apply to behavior: change this session only, this and following, or entire series where allowed.

Emails​

Configure under WooCommerce → Settings → Emails:

EmailWhen
Appointment SeriesPackage confirmed; bulk cancel/update on scoped series changes
Balance / processing emailsPay-first balance order created or paid (uses order email flow)

Per-session Appointment Reminder and Appointment Confirmed still apply to individual occurrences. See Email Notifications.

Product add-ons​

Per add-on option: Use once per recurring series — price and duration apply once for the whole package, not every session. Ideal for setup fees or equipment rental on class packs.

See Product Add-ons.

Virtual occupancy​

While a package is in the cart or awaiting payment, the plugin reserves capacity for previewed sessions so slots are not double-booked during checkout.

Site-wide configuration (filters)​

Settings → Appointments → Recurring packages was removed in 5.4. Use filters instead (see Hooks — Recurring & series after developer login):

FilterPurpose
wc_appointments_recurring_enabledDisable recurring packages site-wide
wc_appointments_recurring_payment_optionsLimit prepaid / pay-first per product
wc_appointments_recurring_default_payment_modelDefault payment model on the form
wc_appointments_recurring_min_occurrences / _max_occurrencesSession count limits
wc_appointments_recurring_min_billable_sessionsMinimum billable sessions in a package
wc_appointments_recurring_allow_partial_checkoutCheckout when some preview sessions are unavailable
wc_appointments_recurring_auto_create_balance_orderAuto-create pay-first balance order
wc_appointments_recurring_balance_invoice_timingWhen to send balance invoice email