Description
Bookyzo turns your WordPress site into a real booking system, whatever you’re booking. Add a staff member for one-on-one appointments, a table for restaurant reservations, an event for ticketed occurrences, or a generic slot for anything else — set its availability, drop a booking form onto any page with a shortcode or block, and start taking bookings. No page builder plugin, no external booking service, no WooCommerce required.
Why Bookyzo?
- All four booking types — Appointment, Table, Event, Slot — in the free plugin, not locked behind an upsell
- Runs entirely on your own site — your booking data stays in your own database
- No WooCommerce dependency — works on any WordPress site
- A real Vue-powered admin panel, not a wall of settings screens
- No limits on bookable items, shifts or bookings — add as many staff members, tables, events and slots as you need
Four booking types, one plugin
- Appointment — one staff member, one customer per time slot (haircuts, consultations, tutoring)
- Table — a restaurant table or venue space with a party-size capacity
- Event — a specific date/time occurrence you create yourself (a class, a workshop, a ticketed show), sold by ticket quantity
- Slot — a generic recurring time slot with room for more than one booking at once (a rental, a group session, anything that doesn’t fit the other three)
Add as many bookable items as you need, set a name/price/photo, and configure the availability that fits its type — a weekly schedule with exceptions for Appointment/Table/Slot (its own, or your shared business hours, with as many shifts per day as you like, e.g. lunch and dinner), or specific dates you add yourself for Event. Available time slots (or your entered event dates) are kept up to date automatically in the background. For events, the booking form can optionally ask for each ticket holder’s name when someone books several tickets.
Booking calendar
A day/week/month calendar in the admin panel shows every booking, color-coded by status. Click a booking to see its details or change its status, or add a walk-in/phone booking yourself straight from the calendar.
Booking list & CSV export
Filter every booking by date, bookable item or status, change status inline, and export the filtered list to CSV whenever you need it outside WordPress.
Customer booking widget
Add [bookyzo_booking] anywhere with the shortcode, use the Booking Form block, or drop it in with the Elementor widget if you build pages that way. Customers pick a time, enter their details, get a booking confirmation, and can add it straight to Google Calendar or download it as an .ics file — no account required.
Customer management
Every customer is saved automatically the first time they book — searchable by name, email or phone under Bookyzo Customers, with notes and tags you can add yourself. Already have a customer list elsewhere? Import it from a CSV file.
Email notifications
Automatic emails when a booking is received, confirmed or cancelled, plus a reminder email the day before it’s due. Every email carries the booking’s own details — number, quantity, total and location — and a self-service link the customer can use themselves: from it they can move their booking to another open time or cancel it, right up to your cancellation cutoff. Every email’s subject and body is a plain-text template you can edit yourself, with placeholders for the customer’s name, the bookable item, the booking time, the total and your business name.
Payments
Mark bookings as paid manually for cash or in-person payments, or connect a Stripe account to let customers pay online by card when they book. An optional flat tax rate is added to every paid booking’s total automatically.
Dashboard
See today’s, this week’s and this month’s booking counts at a glance when you log in.
Developer friendly
Actions and filters throughout (REST controllers, pricing, rate limiting, notifications) and a REST API under bookyzo/v1. See Other Notes for the hook list.
Customer accounts
Customers can optionally create an account (turn it on under Bookyzo Settings) and manage their own bookings from a [bookyzo_account] page — upcoming and past bookings, rescheduling and cancelling within your cutoff. Off by default: guests can book, and manage that booking from the link in their email, without one.
Growing out of the free plugin (Pro)
Everything in this plugin is complete on its own, with no limits and no locked-out UI. Bookyzo Pro is a separate paid add-on with more features: services with per-staff pricing and “any available staff” booking, deposits and PayPal, SMS/WhatsApp reminders on your own schedule, seasonal and dynamic pricing, add-ons and booking fees, custom form fields, a table floor plan, event ticket tiers with QR e-tickets and a check-in scanner, staff calendar sync, an analytics dashboard, and WooCommerce checkout.
External services
Bookyzo runs on your own site and stores bookings in your own database. It connects to these outside services only in the cases described.
Stripe (online card payments)
Used only if you turn on Stripe under Bookyzo Payments and enter your own Stripe API keys.
- When a customer chooses to pay online, the booking widget loads Stripe.js from
https://js.stripe.com/v3/and the card details go straight from the customer’s browser to Stripe. They never pass through your site. - Your site sends Stripe the amount, the currency, the booking’s ID and the customer’s email address (for Stripe’s receipt), to create the payment, and later asks Stripe whether that payment succeeded.
- When you refund a booking paid by card, your site sends Stripe the payment’s reference and the amount to refund.
- Stripe calls your site’s webhook address to report payments it has completed.
Stripe is provided by Stripe, Inc.: Services Agreement, Privacy Policy.
Google Calendar (add to calendar link)
The booking confirmation screen and emails include an “Add to Google Calendar” link. Nothing is sent to Google unless the customer clicks it; the link then opens Google Calendar with the bookable item’s name and the booking’s time filled in.
Google Calendar is provided by Google LLC: Terms of Service, Privacy Policy.= Filters =
byzo_bookable_items_offering_service— ( int[] $bookable_item_ids, int $service_id ) Which bookable items offer a given service, for “any available staff” resolution. Defaultarray().byzo_service_price— ( float|null $price, int $service_id, int $bookable_item_id ) Resolved price for a service booked with a specific staff member. Defaultnull(falls back to the bookable item’s own price).byzo_deposit_amount— ( float|null $amount, float $payment_amount, int $bookable_item_id ) How much of a booking’s total is due online now as a deposit. Defaultnull(pay in full).byzo_default_settings— ( array $defaults ) Default values seeded into the business-settings option on activation.byzo_rest_controllers— ( array $controllers ) REST controller instances registered onrest_api_init.byzo_payment_gateways— ( array $gateways ) Registered payment gateways shown on the Payments settings screen, keyed by gateway id. Default: Stripe only.byzo_payment_gateway_defaults— ( array $defaults ) Default settings shape for each registered gateway, keyed by gateway id. Default: Stripe only.byzo_validate_payment_gateway_settings— ( array|WP_Error $current, string $gateway_id, array $data ) Validates and merges a settings patch for a non-Stripe gateway. Only consulted for a gateway thatbyzo_payment_gatewaysactually registered.byzo_rest_public_permission— ( bool $allowed, WP_REST_Request $request ) Permission check for guest-allowed REST routes.byzo_booking_rate_limit_max/byzo_booking_rate_limit_window— ( int ) Per-IP guest booking rate limit (default 20 requests / 600 seconds) and its window in seconds.byzo_client_ip— ( string $ip ) The IP address used for rate limiting.byzo_dev_server_url— ( string $url ) Vite dev server URL used only in local development.byzo_unit_price— ( float $price, int $bookable_item_id, array $slot ) Per-booking unit price adjustment applied right after service-price resolution and before tax. Default: unmodified$price.byzo_pdf_invoice_enabled— ( bool $enabled ) Whether a downloadable PDF invoice is available from the customer dashboard. Defaultfalse.byzo_custom_fields_for_bookable_item— ( array $fields, int $bookable_item_id ) Custom form fields to render on the booking widget for a given bookable item, each{ id, label, field_type, options, required }. Defaultarray().byzo_addons_for_bookable_item— ( array $addons, int $bookable_item_id ) Add-ons to render on the booking widget for a given bookable item, each{ id, name, price }. Defaultarray().byzo_resolve_addons— ( array $resolved, int[] $addon_ids, int $bookable_item_id ) Resolves client-submitted add-on ids into real, currently-active, correctly-scoped{ id, name, price }rows at booking-creation time — an id that doesn’t resolve is silently dropped. Defaultarray().byzo_appearance_css_vars— ( string $css, array $settings )--prop:value;custom-property pairs generated from the Appearance settings. Default: the built-in property set, or''when nothing was customized.byzo_appearance_css_declarations— ( string $css, array $settings )prop:value;plain CSS declarations generated from the Appearance settings. Default: the built-in declaration set, or''when nothing was customized.byzo_ticket_tiers_for_bookable_item— ( array $tiers, int $bookable_item_id ) Ticket tiers to render on the booking widget for a given Event bookable item, each{ id, name, price, capacity_remaining }. Defaultarray().byzo_ticket_tier_price— ( float|null $price, int $ticket_tier_id ) Resolved price for a specific ticket tier. Defaultnull(falls back to the bookable item’s own price).byzo_claim_ticket_tier— ( bool|null $claimed, int $ticket_tier_id, int $party_size ) Atomically claims capacity on a ticket tier at booking-creation time;falsemeans sold out (rolls back the slot’s own capacity claim). Defaultnull(no tier system installed, nothing to claim).byzo_qr_ticket_enabled— ( bool $enabled ) Whether a downloadable QR e-ticket is available from the customer dashboard. Defaultfalse.
Actions
byzo_loaded— Fires once the plugin is fully loaded.byzo_bookable_item_created— ( int $bookable_item_id ) After a new bookable item is created.byzo_bookable_item_activated— ( int $bookable_item_id ) After a bookable item transitions from inactive to active.byzo_booking_created— ( int $booking_id ) After a new booking is created.byzo_widget_rendered— ( array $config ) Each time a booking form is rendered on a page, so an add-on can enqueue its own front-end scripts.byzo_booking_status_changed— ( int $booking_id, string $new_status, string $old_status ) After a booking’s status changes.byzo_booking_payment_status_changed— ( int $booking_id, string $new_status, string $old_status ) After a booking’s payment status changes.byzo_notification_sent— ( string $event, int $booking_id ) After a notification email is sent (or attempted).byzo_notification_channels— ( string $event, array $booking, array $placeholders ) Fires after a notification email is sent, with the same placeholders — lets an add-on send the same event via another channel (e.g. SMS/WhatsApp).byzo_booking_rescheduled— ( int $booking_id, int $new_slot_id, int $old_slot_id ) After a booking is moved to a different slot (status itself is untouched, so this is separate frombyzo_booking_status_changed).byzo_release_ticket_tier— ( int $ticket_tier_id, int $party_size ) Fires when a ticket-tiered booking is cancelled/rejected/marked no-show, so its tier’s claimed capacity can be released back.
Screenshots






Blocks
This plugin provides 1 block.
- Booking Form
Installation
- Upload the plugin to
/wp-content/plugins/or install it via the Plugins screen. - Activate the plugin — you’ll be taken straight into a short setup wizard.
- Choose what you’re booking (appointment, table, event or slot), fill in your business details, and add your first bookable item.
- Add the
[bookyzo_booking]shortcode (or the Booking Form block) to any page. - Optionally connect Stripe under Bookyzo Payments to accept card payments.
FAQ
-
Do I need WooCommerce?
-
No. Bookyzo has its own booking system and database tables — it doesn’t use WooCommerce products or orders at all.
-
Can customers book without creating an account?
-
Yes. Booking is a guest checkout by default — a customer only needs to give their name, email and phone number.
-
Can I edit the confirmation and reminder emails?
-
Yes, from Bookyzo Emails in the admin panel. Every email is a plain-text template with placeholders for the customer’s name, the bookable item, the booking time and your business name.
-
How do reminder emails work?
-
An hourly background task checks for bookings starting in roughly 24 hours and sends a reminder — no setup needed beyond keeping the booking confirmed.
-
Does this plugin hide or lock any features behind an upsell?
-
No. Every feature listed above is fully usable with no artificial limits, nag screens or disabled UI.
-
Does Bookyzo support anything besides one-on-one appointments?
-
Yes. It includes all four booking types: Appointment (one staff member, one customer), Table (party-size reservations), Event (ticketed occurrences on dates you set yourself), and Slot (a generic recurring slot with room for more than one booking).
-
How many staff members, tables or events can I add?
-
As many as you need, of every type. There is no limit on bookable items, shifts per day or bookings.
-
Where is the source code for the JavaScript?
-
The admin app, the booking widget and the account page are Vue apps, built with Vite. Their source is included with the plugin in the
src/folder, along withpackage.jsonand the Vite configuration. Runnpm installand thennpm run buildto rebuild the files inassets/.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Bookyzo – Booking & Appointments” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Bookyzo – Booking & Appointments” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.0 – 01-10-2026
- Initial release.
