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 setupStorefront bookingCart & checkoutPay-first & balance ordersAdminMy Account

Product setup

On an appointable productGeneral 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 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)

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