Skip to content

Aucip Book documentation

Appointment booking for WooCommerce · version 1.1.7

  • Requirements
  • Installation
  • Configuration
  • Feature usage
  • FAQ
  • Test suite
  • Changelog

Requirements

Component Minimum
WordPress 6.6 or later (tested up to 7.1)
PHP 8.1 or later
WooCommerce 9.0 or later, tested up to 11.2 (required; the plugin declares Requires Plugins: woocommerce)
Database MySQL or MariaDB with GET_LOCK() named locks (standard on both)
PHP extensions sodium for license-signature checks (WordPress' bundled sodium_compat is used as a fallback)
Payments At least one WooCommerce payment method. Automatic refunds need a gateway that supports refunds; otherwise a manual refund is recorded on the order.
Timezone Site timezone set to a city (Settings → General), not a UTC offset, so daylight saving is handled.
Scheduler Action Scheduler (bundled with WooCommerce) for reminders and hold cleanup

Compatibility

  • WooCommerce High-Performance Order Storage (HPOS): declared compatible.
  • WooCommerce Cart & Checkout blocks: declared compatible. Classic (shortcode) checkout also works.
  • Block themes and classic themes: the blocks work in the block editor; shortcodes are available for classic themes and page builders.

Page caching: exclude the booking page, cart, checkout and /wp-json/aucip-book/* from any page cache. Slot responses are sent no-store.

Installation

  1. Install and activate WooCommerce (9.0+).
  2. In Plugins → Add New → Upload Plugin , upload aucip-book-1.1.7.zip and click Activate. On activation the plugin creates its database tables (services, staff, staff services, staff hours, days off, bookings, holds), adds the Booking Staff role and creates a hidden virtual "Appointment" product used to carry bookings through the WooCommerce cart.
  3. Go to Bookings → License , paste your aucip.com license key (AUCIP-XXXXX-XXXXX-XXXXX-XXXXX) and click Activate. The key is only used for update checks; the plugin works fully without it.
  4. Create your services (Bookings → Services) and staff (Bookings → Staff). See Configuration.
  5. Create a page (e.g. "Book") and insert the Booking Form block, or the [aucip_booking_form] shortcode.
  6. Optionally add a "My appointments" page with the My Appointments block. Logged-in customers can also use My Account → Appointments.
  7. Exclude the booking page, cart, checkout and /wp-json/aucip-book/* from your page cache.

Setup wizard

After first activation, Bookings → Setup wizard walks through: shop check → first service → first staff member and hours → booking rules → booking page. Every step except the first (shop check) can be skipped, and you can return to the wizard later. It can also install a demo salon, which you can remove from the same screen.

Activate your licence

Bookings → License → paste the key → Activate. See Configuration → Licence for the daily check and grace period.

Updating

Free updates while licensed and 6 months of support (renewable). Installation is a paid add-on, sold separately. Updates pause if the licence is still unverified after the 14-day grace period. Updates appear in Dashboard → Updates like any other plugin once the license is active. Packages are downloaded from aucip.com and checked against a SHA-256 checksum.

Uninstalling

Deleting the plugin keeps all booking data unless you tick Settings → Uninstall → Delete all booking data first. With that option on, the plugin drops its tables, deletes its options and the hidden Appointment product, removes the Booking Staff role and capabilities, and unschedules its Action Scheduler jobs.

Configuration

Services (Bookings → Services)

Field Notes
Name, Category, Description Category groups services in the Booking Form and Service List.
Duration (min) In steps of 5 minutes.
Buffer before / after (min) Blocks time around the appointment for staff (cleanup, prep).
Price Default price. Per-staff price overrides are set on the Staff screen.
Payment Pay in full , Deposit only , or Pay on site (charged 0 online).
Deposit Percentage or fixed amount (used when Payment = Deposit only). The balance is shown on the cart line and stored on the order.
Add-ons / extras One per line: name
Active Inactive services are hidden from customers.

Staff (Bookings → Staff)

  • Name, Email, Bio. Staff receive a copy of each notification at their email.
  • WordPress user (own-calendar access): the linked user gets the Booking Staff role and can only see and manage their own calendar.
  • Services: tick the services this person performs, with an optional price override per service.
  • Weekly schedule: working hours and breaks per weekday, in the site timezone, e.g. 09:00-13:00, 14:00-18:00. Leave a day empty for a day off.
  • Days off / holidays: one YYYY-MM-DD date per line.

Settings (Bookings → Settings)

Setting Default Description
Cart hold time 15 min (1–120) How long a slot stays reserved while in the cart.
Slot interval 15 min (5–240) Spacing between offered start times.
Minimum lead time 60 min Earliest bookable time from now.
Maximum days ahead 60 (0 = unlimited) How far ahead customers can book.
"Any available" assignment Least recently booked Or fewest bookings that day.
Cancellation window 24 h Cancelling earlier refunds what was paid online; later forfeits it.
Late cancellation Allow & forfeit Or Block online cancellation inside the window (admins can always cancel).
Reminder 24 h before Reminder email timing.
Email templates built-in Confirmation, reminder, cancellation, rescheduled and the staff notification.
Uninstall off Delete all booking data when the plugin is deleted.

Appearance

Setting Default Description
Accent colour #24524c Buttons, selected times and highlights in the booking form. Light accents switch button text to dark for contrast.
Corner roundness 14 px (0–24) 0 for square corners.
Theme colours off Ignore the accent and use the theme's primary colour (theme.json).
A live preview sits next to the fields; Reset to default restores both values.

Email placeholders: {customer_name} {customer_email} {service} {staff} {date} {time} {paid} {balance} {refund} {manage_url} {site}; the staff template also has {event}.

Licence (Bookings → License)

Paste your key (AUCIP-XXXXX-XXXXX-XXXXX-XXXXX) and click Activate. The screen shows the licence type, activations used and the domain. Click Deactivate before moving to another site.

  • Daily check: once a day a scheduled action (Action Scheduler, aucip_license_daily_aucip-book) checks the licence with aucip.com. Answers are signed (Ed25519) and verified against the key built into the plugin.
  • 14-day grace: with no key, an expired or rejected licence, or aucip.com unreachable, admins see a notice with the days left.
  • After the grace period: the Settings, Services, Staff and Setup wizard screens become read-only with a Renew banner, and plugin updates stop (developers: filter aucip_book_settings_locked).
  • Keeps working: booking forms, cart and checkout, existing bookings, status changes, emails and reminders, My Appointments and the admin calendar.
  • Unlock: activate or renew the key; it unlocks immediately on activation or on the next successful check.
  • Staging: Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. Classification uses the site's hostname only:
    • Local (free): localhost, ::1, 0.0.0.0, *.test, *.local, *.localhost, and IPs in 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. Local installs don't count against your production domain or the staging limit.
    • Staging (up to 3): staging.*, stage.*, dev.*, test.*, uat.*, preview.*, *-staging.*, *.staging.*, and host staging domains *.wpengine.com, *.wpenginepowered.com, *.kinsta.cloud, *.cloudwaysapps.com, *.flywheelsites.com, *.pantheonsite.io, *.instawp.xyz.
    • Tunnels (count as staging): *.ngrok.io, *.ngrok-free.app, *.ngrok.app, *.expose.dev, *.sharedwithexpose.com, *.loca.lt, *.trycloudflare.com, *.serveo.net. aucip.com releases a tunnel seat after 7 days without a licence check.
    • Any other host is production. WP_ENVIRONMENT_TYPE (or the AUCIP_LICENCE_ENV constant) set to staging does not make a public host staging or local; aucip.com still counts it as production.

What is sent to aucip.com (nothing else, no customer data):

When Fields
Activate licence key, product, domain, plugin/WordPress/PHP versions, environment=staging on local and staging hosts
Daily check same as Activate
Deactivate licence key, product, domain
Update check product, plugin version, channel, WordPress/PHP versions
Update download licence key, product, domain; packages are refused unless their SHA-256 checksum matches

Roles & capabilities

  • Administrators and Shop Managers get aucip_book_manage_all (all calendars, services, staff) and aucip_book_manage_own.
  • Booking Staff get aucip_book_manage_own only (their own calendar and appointments).
  • Settings require manage_options.

Feature usage

Blocks and shortcodes

Block Shortcode What it shows
Booking Form [aucip_booking_form] Mobile-first form: service, staff (or "Any available"), add-ons, date, time slots, and a bag of appointments.
Service List [aucip_service_list] Services grouped by category with durations and prices.
Staff List [aucip_staff_list] Team members and the services they offer.
My Appointments [aucip_my_appointments] Logged-in customers view, reschedule and cancel their appointments.

The booking form also accepts a pre-selected service via the URL: ?aucip_service=<id>.

Customer booking flow

  1. Pick a service (and optional extras), a staff member or Any available , a date and a time.
  2. Add to bag. The slot is held for the Cart hold time ; the bag shows "Held until …".
  3. Add more appointments: different services, different staff. Book the next service right after this one offers slots starting when the previous appointment (plus its buffer) ends.
  4. Continue to WooCommerce checkout. Retail products can be in the same cart and the same order.
  5. On the cart and at checkout each hold is re-checked. An expired hold whose slot is still free is re-held; a slot taken by someone else is removed from the cart with a notice. Holds are extended to cover payment.
  6. When the order is placed, each appointment becomes a booking linked to the order. Order status changes confirm or cancel bookings (cancelled, failed and refunded orders cancel them).

"Any available" (round-robin)

Staff free for the exact slot are ordered by least-recently-booked (or fewest bookings that day, per Settings). Live holds count as assignments. Each candidate is tried in turn until a hold succeeds.

Admin calendar (Bookings → Calendar)

  • Day , Week and Staff columns views, date picker and ‹ › navigation, staff filter.
  • Drag an appointment to reschedule it (availability is re-checked).
  • Click an appointment to see customer, paid/balance and change status: pending, confirmed, completed, cancelled, no_show.
  • Click empty space to create a manual booking (service, staff, time, customer name and email).
  • Booking Staff only see their own column.

Appointments list (Bookings → Appointments)

Filter by status, staff and date range; change status inline; Export CSV.

Cancellations, refunds and rescheduling

  • Customers can cancel from My Appointments. Before the cancellation window: what was paid online is refunded through WooCommerce (automatically if the gateway supports refunds; otherwise a manual refund is recorded on the order for you to pay back). Inside the window: forfeited, or blocked, depending on Late cancellation.
  • Customers can reschedule online only outside the cancellation window.
  • Admin cancellations always refund what was paid (filterable).
  • Completed and cancelled appointments cannot be rescheduled.

Notifications

  • Confirmation, reminder and cancellation emails, each with an .ics calendar attachment, sent to the customer with a copy to the staff member.
  • .ics files are also attached to WooCommerce customer order emails.
  • Reminders are scheduled with Action Scheduler.
  • SMS/WhatsApp: hook into aucip_book_notification (example below). No SMS provider is bundled.

Developer hooks

Hook Type Purpose
aucip_book_notification( $type, $booking, $text ) action Every confirmation, reminder or cancellation.
aucip_book_booking_created / _confirmed / _cancelled / _rescheduled action Lifecycle events.
aucip_book_slots( $slots, $service, $date ) filter Adjust computed slots.
aucip_book_cancellation_refund( $rule, $booking, $by_admin ) filter Change the refund amount.
aucip_book_allow_late_cancel( $allowed, $booking ) filter Override the Late cancellation setting.
add_action( 'aucip_book_notification', function ( $type, $b, $text ) {
    wp_remote_post( 'https://example.com/sms-webhook', array( 'body' => array(
        'type' => $type, 'phone' => get_user_meta( $b['customer_id'], 'billing_phone', true ), 'text' => $text,
    ) ) );
}, 10, 3 );

REST API (/wp-json/aucip-book/v1)

Public: GET services, GET staff, GET slots, GET/POST cart, DELETE cart/{key} (cart writes need the WP REST nonce). Customer: GET my/bookings, POST my/bookings/{id}/cancel, POST my/bookings/{id}/reschedule. Admin: GET/POST admin/bookings, POST admin/bookings/{id}.

FAQ

Does it need WooCommerce? Yes. Payments, cart and orders run through WooCommerce 9.0+, so any WooCommerce payment gateway works.

Can a customer book several services in one checkout? Yes, with different staff, plus regular shop products in the same order.

How are double bookings prevented? Slots are held while in the cart under a per-staff database lock, re-checked on the cart and at checkout, and checked once more when the order is created.

What happens if a hold expires? If the slot is still free it is re-held automatically; if someone else booked it, the line is removed and the customer sees a notice.

Can I take deposits? Yes, per service: percentage or fixed. The balance is shown in the cart and stored on the order. You can also choose Pay on site.

Do staff need WordPress accounts? No. Link a WordPress user only if that staff member should manage their own calendar.

Does it send SMS? Not by itself. Use the aucip_book_notification hook to send through your SMS/WhatsApp provider.

Is it compatible with block checkout and HPOS? Yes, both are declared compatible. Classic checkout also works.

Does it use Google Calendar sync? No. Emails include .ics attachments that customers can add to any calendar.

Which licence do I need? Regular licence: use in one end product that end users are not charged for. Free updates while licensed and 6 months of support (renewable). Extended licence: use in one end product that end users are charged for (for example a paid SaaS or paid membership). Free updates while licensed and 6 months of support (renewable). One licence = one end product. Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. Each additional end product needs another licence. Installation is a paid add-on, sold separately.

What support and updates are included? Free updates while licensed and 6 months of support (renewable).

What happens if my licence expires or can 't be verified? The plugin checks the licence with aucip.com once a day. After a 14-day grace period, the plugin's admin settings (Settings, Services, Staff, Setup wizard) become read-only and updates stop until the licence verifies again. Your front end keeps working: booking forms, checkout, existing bookings, emails and the calendar are not affected.

What does the licence check send? Licence key, product, domain, plugin/WordPress/PHP versions (and environment=staging on staging sites). No customer or booking data, and no usage tracking. See Configuration → Licence.

Can I use it on a staging site? Yes. Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. A staging install is a site on a staging.*, dev.*, test.*, uat.* or preview.* subdomain, or a tunnel such as ngrok; tunnel seats expire after 7 days unused. The plugin also recognises a few more staging patterns and managed-host staging domains; see Configuration → Licence for the full list.

Will deleting the plugin delete my bookings? Only if you enabled Delete all booking data in Settings first.

My page cache shows stale times. Exclude the booking page, cart, checkout and /wp-json/aucip-book/* from caching.

Is it translatable? Yes. Text domain aucip-book; a .pot file is in /languages.

Can I switch from another booking plugin? There is no automatic importer. Recreate services and staff (the setup wizard creates the first of each), re-enter future appointments as manual bookings in the calendar so the slots are blocked, make a test booking, then swap your old booking page for the Booking Form block. The bundled docs/migration.md has a field-by-field mapping.

Is there a launch discount? Yes. Coupon BOOKLAUNCH20 gives 20% off for 7 days after launch: Regular $31.20 (was $39), Extended $79.20 (was $99).

Test suite

The buyer zip includes the plugin's tests. Run them on a development copy, never on a live store.

Unit tests (PHPUnit)

Pure-PHP tests for slot maths (including DST), holds, round-robin, money/deposits/refunds, reschedule rules and calendar ranges. No WordPress needed.

composer install          # installs PHPUnit 10 (require-dev)
composer test             # = vendor/bin/phpunit, config in phpunit.xml.dist

Integration checks (WP-CLI, on a dev site)

tests/integration/run.sh /path/to/wordpress http://your-dev-site
wp eval-file tests/integration/core-api.php     # extension API; creates and removes its own data

Smoke tests (curl, on a dev site with demo data)

wp eval-file tests/smoke/seed.php                        # demo salon: services, staff, hours
tests/smoke/e2e.sh        http://your-dev-site YYYY-MM-DD   # 3 appointments, 2 staff + a product → 1 order (Store API)
tests/smoke/classic.sh    http://your-dev-site YYYY-MM-DD   # same through classic checkout, logged-in customer
tests/smoke/concurrency.sh http://your-dev-site YYYY-MM-DD 10  # two sessions racing for the same slots
tests/smoke/expiry.sh     http://your-dev-site YYYY-MM-DD   # cart hold expiry

YYYY-MM-DD is a future date inside the booking window.

Browser test (Playwright)

cd tests/e2e && npm install
node booking.mjs http://your-dev-site    # Booking Form block → two appointments → block checkout → order received

Building from source

npm install && npm run build rebuilds build/*.js from src/ with @wordpress/scripts.

Changelog

1.1.7

  • Packaging and documentation update; no changes to features or licensing.
  • Documentation: a general guide for moving from another booking plugin.

1.1.6

  • Licensing: stronger checks on signed answers from aucip.com (domain, product and a one-time code must match).
  • Licensing: the grace period and lock are based only on verified answers from aucip.com.
  • Licence screen: staging and local activations are shown separately from production activations.
  • Tunnel hosts on sharedwithexpose.com count as staging.
  • Booking form: a bag holding only pay-on-site services shows the amount due at the appointment instead of "Due now $0.00".

1.1.5

  • Licensing: a licensed site that moves to a new domain or staging subdomain re-activates on the next daily check instead of locking.
  • Licensing: more robust handling when stored licence data is missing or damaged; local and staging sites are not affected.
  • Licence screen: a locked site with a local home URL no longer shows "Active".

1.1.4

  • Licensing: the 14-day grace period runs once and can't be reset by reinstalling or clearing the key; local sites never start it.
  • Local sites don't contact aucip.com during the daily check.
  • Updates: packages are only downloaded over HTTPS from aucip.com, with a required checksum.
  • Clearer message when aucip.com doesn't list the product yet.

1.1.3

  • Licensing: answers from aucip.com are signature-checked and must be fresh, with replay protection.
  • Licensing: staging is decided by host (staging subdomains, managed-host staging domains, tunnels); local detection covers loopback and private IPs.
  • Licence screen: shows whether the site counts as Local (free), Staging or Production.
  • Calendar week view: long staff lane labels end with an ellipsis and show the full text on hover.
  • Setup wizard: Atelier-styled checkboxes and a properly styled Name field.
  • Booking bag: pay-on-site items show "$42.00 due at appointment" instead of $0.00.

1.1.2

  • Fix: the booking form and My Appointments work with Plain permalinks.
  • Settings and the setup wizard recommend pretty permalinks when Plain permalinks are active.
  • Appearance: a warning when the accent colour can't reach 4.5:1 contrast with white or dark text.
  • Block checkout: screen readers read pay-on-site lines as "$15.00 due at appointment", not "$0.00".
  • Read-only viewers see only the last 5 characters of the licence key.
  • Licence terms: Regular and Extended are defined per end product; installation is a paid add-on sold separately.

1.1.1

  • Extensions: aucip_book_validate_slot also runs on customer reschedules and admin calendar moves.
  • Block cart: "Pay X at your appointment" note in the totals; pay-on-site lines show the price with an "at appointment" label instead of $0.00.
  • Accessibility: text on the accent colour switches between white and ink by WCAG contrast.
  • New read-only "Booking Viewer" role (aucip_book_view_settings): can view Settings and License but not save.
  • Calendar: No-show in the legend with its own style, staff lanes in week view, loading skeletons, empty-day message fits at 375 px.
  • Admin: Atelier styling for buttons, links and the setup wizard; the appearance preview no longer clips; the setup reminder hides after the wizard or demo import.
  • Update URI header so WordPress.org never overwrites the plugin.

1.1.0

  • Licensing: daily signed licence check with aucip.com; 14-day grace period with an admin notice, then read-only settings (Settings, Services, Staff, Setup wizard) and paused updates. Booking forms, checkout, bookings, emails and the calendar keep working.
  • Licensing: exactly what is sent is documented (key, product, domain, version, WordPress/PHP versions, environment=staging on staging sites). Tiers are Regular and Extended.
  • Extension API for add-ons (AUCIP_BOOK_API 2): booking meta table, per-staff busy-times filter, settings tabs, staff profile hooks. Database 1.1.0.
  • Appearance settings: accent colour, corner roundness, use theme colours, live preview; light accents switch text colours for contrast.
  • Redesigned booking form, bag, account page, admin lists (mobile cards), status badges, branded admin header, and a calendar with a sticky header, staff colours and hours from staff schedules.
  • Pay-at-appointment line and "Confirm booking" when nothing is due; the block cart shows the service, an appointment image, and no quantity box.
  • "Add again" when a cart hold expires.
  • Setup wizard, demo salon data, buyer docs.
  • Fixes: reschedule respects booking-window rules, cancelled deposits no longer show a balance, staff email templates, deactivation clears scheduled actions, manual booking validation, update checksum required.

1.0.0

  • Initial release.
  • Multi-appointment WooCommerce cart with slot holds and checkout re-validation.
  • Round-robin "Any available" staff assignment (least recently booked / fewest that day).
  • Per-service payment: full, deposit (% or fixed) or pay on site; add-ons; buffers; per-staff pricing.
  • Blocks: Booking Form, Service List, Staff List, My Appointments (+ shortcodes, My Account endpoint).
  • Admin calendar (day / week / staff columns, drag to reschedule, manual bookings), appointments list with CSV export.
  • Cancellation window with refund rule; customer self-service cancel and reschedule.
  • Editable confirmation / reminder / cancellation emails with .ics attachments; aucip_book_notification hook.
  • HPOS and Cart & Checkout blocks compatibility.

Aucip Book · aucip.com