=== Schedopia – AI-Ready Appointment Booking, Events & Seat Reservations ===
Contributors: thinkmatic
Donate link: https://schedopia.com
Tags: appointment booking, booking calendar, event booking, mcp, ai
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 1.4.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Free WordPress booking plugin with a built-in MCP server. Appointments, events and seat reservations, run by the AI assistant you already use.

== Description ==

**Schedopia** is a free, AI-ready appointment booking plugin for WordPress with a built-in MCP server. Service businesses take appointments online, manage staff availability, prevent double-booking and send automated reminders. They can also run all of it from the AI assistant they already use, through 51 MCP tools with a switch for each.

Customers choose a service, a staff member, a date and a free time from a mobile-friendly booking form. Schedopia also handles event booking and seat reservations. Venues, classes, workshops and small theatres can create dated events, and customers pick their own seats from a visual seat map.

Everything is self-hosted on your WordPress site. There are no per-booking fees or seat commissions, and your booking and customer data stays on your own server. [Why we built it that way](https://schedopia.com/blog/why-your-booking-data-should-live-on-your-own-site)

= Built-in MCP server: run your bookings by talking to them =

Schedopia ships the most extensive MCP of any WordPress booking plugin we know of. It has 51 tools, each with its own switch, and needs no middleware. Connect the AI assistant you already use (claude.ai, Claude Desktop, ChatGPT, Claude Code, Cursor or Codex) and ask it for what you need instead of clicking through screens. *"Who's booked tomorrow?"* *"Block Friday afternoon."* *"Add a 45-minute consultation at £60."* Each request runs on your site through the same validated path as your admin screen, so nothing ends up double-booked or half-saved.

* Setup takes about two minutes. Switch it on under *Settings → Connect your AI*, then sign in from claude.ai, Claude Desktop or ChatGPT, or paste one command into Claude Code, Cursor or Codex. There are no API keys to manage and no middleware or separate server to host.
* There are 51 tools, each with its own switch. They cover bookings, services, staff, customers, payments, venues, seat maps, events, the booking form's design and your settings. Reading is on out of the box. Anything that changes or deletes something stays off until you turn it on.
* The assistant acts as the account that approved it, with that account's permissions. It gets no elevated user or back door, and it can never widen its own access.
* Every call is recorded: which assistant did what, when, and whether it was allowed. You can revoke any connection in one click.
* The assistant asks your site a question over HTTPS and gets an answer. It is never handed a copy of your bookings, and the plugin contacts no AI service of its own.

Connect your AI needs WordPress 6.9 or newer and an HTTPS site. Everything else in Schedopia works from 6.5. Docs: [set it up](https://schedopia.com/docs/connect-ai/connect-ai) · [what it can do](https://schedopia.com/docs/connect-ai/ai-permissions) · [watching and fixing](https://schedopia.com/docs/connect-ai/ai-monitoring). Or read the [launch post](https://schedopia.com/blog/introducing-schedopia).

= Why choose Schedopia? =

* It's AI-ready, with a built-in MCP server that lets you connect Claude, ChatGPT, Cursor or Claude Code and run bookings, staff, events and settings by talking to them. It has 51 tools, each with its own switch, and it is off by default.
* A mobile-friendly booking form takes reservations 24/7, including the hours you're closed.
* Every appointment is checked against real staff availability, and every seat against what's already reserved, so two people can never take the same time slot or the same seat.
* It is fully self-hosted, with no CDNs and no per-booking commission. Nothing is sent to a third party unless you turn on reCAPTCHA spam protection yourself.
* A setup wizard asks what you take bookings for, then walks you through your services, staff and hours, or your venue and first event. It takes a few minutes.
* One plugin and one form handle both timed appointments with a staff member and seat reservations for dated events.
* A live design customizer sets the booking form's colours, fonts, shapes, buttons and wording, with a preview that updates as you type.

= Who is Schedopia for? =

**Appointment-based businesses**

* **Salons and barbershops:** haircuts, colour, nails and grooming, each with its own duration and price, booked with the stylist the customer wants.
* **Spas, massage and beauty studios:** treatments with prep and clean-up time built in, so back-to-back bookings never overlap.
* **Clinics, dentists and therapists:** consultations and follow-ups against each practitioner's own hours and days off, with a minimum notice so nobody books ten minutes before opening.
* **Tutors, coaches and consultants:** one-to-one sessions with each tutor's own hours, and add-ons for longer lessons.
* **Repair, home and automotive services:** service calls and workshop slots with a capacity per slot, so a garage with two bays can take two cars at once.
* **Photographers and studios:** sittings and studio hire, with buffers for setup and turnaround.

**Events with seats**

* **Yoga, fitness and dance classes:** dated sessions where each mat or spot is a seat on the map.
* **Cookery, craft and art workshops:** small-group classes with a fixed number of places, where the tutor can see who is coming.
* **Talks, seminars and community meetings:** halls with rows and aisles, and tiered seating for members and guests.
* **Theatres, concerts and shows:** seat maps with VIP, standard and balcony tiers at different prices, and events that open more than one hall.

More examples on the [use cases page](https://schedopia.com/use-cases).

= The booking form =

One mobile-first form handles both flows. Customers pick a service, the staff member they want and a time, or pick an event and choose seats on the map, then confirm in a few taps. The form only offers times that are actually free. Add it to any page with the `[schedopia_booking]` shortcode, or use `[schedopia_booking mode="event"]` to place the seat flow on its own. To show your services as a catalog, add `[schedopia_services]`. Each service card has a Book button that opens the form with that service already chosen. To list your upcoming events, add `[schedopia_events]`. Each event card has a Select seats button that opens the seat map for that event. Docs: [add the form to your site](https://schedopia.com/docs/form/booking-form).

= Live design customizer =

The booking form can match the look of your site. From *Design* in the dashboard you can:

* set the form's colours, fonts, corner radius and button style globally, from a set of typefaces and shapes;
* rewrite every label the customer sees, such as step titles, button text and field hints, so the wording matches your business;
* check it all in a live preview that updates as you type, before anything is published.

Appointment and event flows keep separate wording, so a site that runs both can word each one for its own customers. The services and events lists have their own design too: grid or list layout, the number of columns, card shadow and border, which details each card shows, and their own button and price wording. Everything is under *Design* in the dashboard, with a live preview of each. Docs: [form appearance](https://schedopia.com/docs/form/form-appearance).

= Services, staff and availability =

* **Service catalogue:** organise services into categories, each with its own price and duration.
* **Service add-ons:** offer extras alongside a service. Each add-on has its own price and duration, so choosing one extends both the appointment's total and the time blocked on the calendar.
* **Staff and hours:** set each team member's weekly working hours and days off. A member with no schedule of their own follows the business hours, and any member can override them.
* **Buffers, capacity, slot interval and minimum notice:** set them once for the whole business, and override them per service where a treatment needs more prep time or a class takes more people. Slot interval controls how finely start times are offered, so a 60-minute service can start at 9:00, 9:15 or 9:30.
* **Dated appointments:** every booking has its own date, time and timezone, and a transactional guard makes a double-booking impossible.

Docs: [services and categories](https://schedopia.com/docs/catalog/services) · [add-ons](https://schedopia.com/docs/catalog/addons) · [staff](https://schedopia.com/docs/team/staff) · [scheduling](https://schedopia.com/docs/team/scheduling).

= Events, venues and seat maps =

* **Venues and halls:** build your venue once, with as many halls as it has.
* **Visual seat planner:** lay out rows, aisles and seat numbering to match the room. Customers pick from the same map.
* **Seat tiers:** VIP, Standard, Balcony or whatever you call them, each with its own colour and price. Any individual seat can override its tier's price.
* **Dated events:** create a session, open one hall or several, and add a cover photo. Customers browse upcoming events with live seat availability, and a seat can never be reserved twice for the same event.

Docs: [venues, halls and seats](https://schedopia.com/docs/events-seats/venues-seats) · [events](https://schedopia.com/docs/events-seats/events) · [booking seats](https://schedopia.com/docs/events-seats/seat-booking). See it in action: [Sell seats for events, classes and shows](https://schedopia.com/blog/schedopia-1-3-event-seat-reservations).

= Notifications and customer self-service =

* **Automated emails:** booking confirmations, cancellations, new-booking alerts for your team, and reminders before the appointment.
* **Approval:** confirm bookings automatically, or hold each one as a request until you approve it.
* **Self-service cancellation:** customers cancel from a secure link in their email, with no account needed. You decide whether it's allowed and how close to the start time it stays open.
* **Add to calendar:** customers save an appointment to Google, Outlook or Apple Calendar from their confirmation email.

Docs: [email notifications](https://schedopia.com/docs/emails/notifications) · [customer cancellations](https://schedopia.com/docs/emails/cancellations) · [calendar feed](https://schedopia.com/docs/emails/calendar-feed).

= Your dashboard =

* **Admin screens:** a dashboard, a filterable bookings list, a team calendar, the service catalogue, scheduling, customers, staff, payments and an activity log.
* **Customer records:** every customer with their full booking history.
* **Calendar feed:** subscribe Google Calendar, Outlook or Apple Calendar to a read-only feed of your bookings, so your team sees them in the calendar they already use.
* **CSV export:** download your bookings as a spreadsheet. The export follows the list's current filters and covers the whole filtered set.
* **Manual and offline payments:** record cash, bank transfer and mark-as-paid payments against a booking.
* **Spam protection:** a built-in honeypot and timing check on the public form, with optional reCAPTCHA v3.

Docs: [bookings](https://schedopia.com/docs/day-to-day/bookings) · [calendar](https://schedopia.com/docs/day-to-day/calendar) · [customers](https://schedopia.com/docs/day-to-day/customers) · [payments](https://schedopia.com/docs/day-to-day/payments) · [spam protection](https://schedopia.com/docs/form/spam-protection) · [activity log](https://schedopia.com/docs/reference/activity-log).

= Connect your AI =

You can run Schedopia from the AI assistant you already use. Switch it on in *Settings → Connect your AI*, connect your client (Claude Code, Cursor, Codex, Claude Desktop, claude.ai or ChatGPT), and ask for what you want instead of clicking through the admin: "what's on today, and is anyone free at four?", "book Sam with Maya tomorrow at eleven", "add a 45-minute Hair spa service under a new Hair category", "block next Monday".

* Fifty-one tools cover bookings, services, add-ons, staff and working hours, customers, payments, venues, events, seat layouts, the booking form's design and your settings.
* Reading is allowed once you switch the feature on. Anything that changes or deletes something stays off until you turn it on yourself, one tool at a time, and deletions are marked.
* An assistant is held to the WordPress account that connected it and can never do something that account could not do in the admin. It cannot widen its own access, and it never reads a key or a token.
* The assistant connects to your site, and the plugin contacts no AI service of its own. Every call is written to the activity log, with customer details masked.
* One button creates the credential your site can use and fills it into the command for your client. You can revoke it whenever you like, and three Site Health checks tell you if your host is blocking the connection.

Connect your AI requires WordPress 6.9 or newer, where the Abilities API is available. Everything else in Schedopia works from 6.5. Other plugins can add their own tools to the same connection. Docs: [set it up](https://schedopia.com/docs/connect-ai/connect-ai) · [what it can do](https://schedopia.com/docs/connect-ai/ai-permissions) · [watching and fixing](https://schedopia.com/docs/connect-ai/ai-monitoring).

= Works with your page builder =

The `[schedopia_booking]`, `[schedopia_services]` and `[schedopia_events]` shortcodes work in any editor, including the Gutenberg shortcode block and the Elementor Shortcode widget. There is no page-builder setup and no separate widget to learn.

= Links =

* [Website](https://schedopia.com) · [Features](https://schedopia.com/features) · [Use cases](https://schedopia.com/use-cases) · [Documentation](https://schedopia.com/docs) · [FAQ](https://schedopia.com/docs/reference/faq) · [Blog](https://schedopia.com/blog) · [Changelog](https://schedopia.com/changelog) · [Contact](https://schedopia.com/contact)

== Installation ==

**Automatic installation**

1. Go to **Plugins → Add New** in your WordPress admin.
2. Search for "Schedopia".
3. Click **Install Now**, then **Activate**.

**Manual installation**

1. Upload the `schedopia` folder to the `/wp-content/plugins/` directory.
2. Activate the plugin through the **Plugins** screen in WordPress.

**After activation**

1. The plugin's custom tables (`wp_schedopia_*`) are created automatically on activation.
2. Follow the [setup wizard](https://schedopia.com/docs/getting-started/setup-wizard). Choose whether you take appointments, event seats, or both, then add your services, staff, and working hours, or your venue, its seat map, and your first event. The walkthrough [Take your first booking in ten minutes](https://schedopia.com/blog/first-booking-in-ten-minutes) covers every step.
3. Create or edit a page and insert the `[schedopia_booking]` shortcode to display your booking form. It also works inside the Gutenberg shortcode block and the Elementor Shortcode widget.
4. Manage everything from the Schedopia admin screens, through the REST API under `/wp-json/schedopia/v1/`, or from your AI assistant under *Settings → Connect your AI*.

== Frequently Asked Questions ==

= Is Schedopia free? =

Yes. Schedopia is a complete, self-hosted booking plugin for appointments and event seat reservations, with no per-booking fees or seat commissions.

= What types of businesses is Schedopia for? =

Any service business that runs on appointments, such as salons, barbershops, spas, clinics, dentists, therapists, coaches, tutors, consultants, and home or repair services. It also suits businesses that sell seats for dated sessions, such as yoga and fitness studios, workshops and classes, community centres, small theatres and event spaces. You can run either kind of booking, or both.

= Can customers book online themselves? =

Yes. Add the `[schedopia_booking]` form to any page and customers can pick a service, choose a staff member, and book an available time on their own, 24/7. For events, they browse upcoming sessions, pick their seats on the seat map, and reserve them the same way.

= Can I show a list of my services? =

Yes. The `[schedopia_services]` shortcode lists your bookable services as cards with their price, duration and description. Each card's Book button opens the booking form with that service already selected. Book opens your booking page, which you can choose or create under *Settings → Shortcode*, unless the list is on a page that already has the booking form. If you haven't chosen one, Schedopia uses a page that already holds the booking form. Use `category="hair"` to list a single category, or `booking_page="book"` to send one list to a different page. All shortcode options are in [add it to your site](https://schedopia.com/docs/form/booking-form).

= Can I show a list of my upcoming events? =

Yes. The `[schedopia_events]` shortcode lists your upcoming events as cards with the date, venue, seats left and the "from" price. Each card's Select seats button opens the booking form on that event's seat map. Sold-out events stay listed as "Fully booked"; add `hide_sold_out="yes"` to leave them out. Use `venue="main-hall"` to list a single venue. The buttons open your booking page, or a separate Events page you can choose under *Settings → Shortcode*.

= Can I sell seats for events, classes, or shows? =

Yes. Create a venue with one or more halls, lay out the seats in the visual seat planner (optionally grouped into tiers such as VIP, Standard and Balcony with their own prices), then create a dated event in that venue. Customers see live seat availability and a "from" price, pick specific seats on the map, and book. Use `[schedopia_booking mode="event"]` to place the seat flow on its own page.

= Will it prevent double-bookings? =

Yes. Every appointment is validated against real staff availability, and every seat reservation against the seats already taken, inside a transactional double-booking guard. Two customers can never take the same time slot, and a seat can never be reserved twice for the same event.

= Can I take payments? =

Schedopia records manual and offline payments: cash, bank transfer, and mark-as-paid. See [payments](https://schedopia.com/docs/day-to-day/payments).

= What is MCP? =

MCP (Model Context Protocol) is the standard that lets an AI assistant use tools outside itself. Schedopia has an MCP server built in, so any MCP-capable assistant, such as Claude, ChatGPT, Cursor, Claude Code or Codex, can read and, where you allow it, change your bookings. There is nothing to install besides Schedopia and no separate server to run.

= Is Schedopia an AI plugin? Does it send my data to an AI service? =

Schedopia does not run an AI model and never contacts an AI service on its own. It is the other way round: you connect the assistant you already use, and it asks your site questions over HTTPS. What the assistant reads in an answer is seen by that assistant's provider, which is the client you chose and approved. Nothing is sent anywhere else, and the Permissions tab decides what it can read at all.

= Can I manage bookings by chatting with an AI assistant? =

Yes. *Settings → Connect your AI* publishes Schedopia's admin actions as tools that an MCP client can use. Claude Code, Cursor, Codex, Claude Desktop, claude.ai and ChatGPT all support MCP. The feature is off by default. When you switch it on, reading is allowed, and every tool that changes or deletes something stays off until you turn it on yourself. The assistant acts as the WordPress account that connected it, so it can never do more than that account can, and every call is recorded in the activity log. Connect your AI requires WordPress 6.9 or newer, where the Abilities API is available; everything else in Schedopia works from 6.5. Step-by-step: [set it up](https://schedopia.com/docs/connect-ai/connect-ai), and the full tool list under [what it can do](https://schedopia.com/docs/connect-ai/ai-permissions).

= Does Schedopia work with Elementor and Gutenberg? =

Yes. The `[schedopia_booking]` shortcode works in any editor, including the Gutenberg shortcode block and the Elementor Shortcode widget. Only one booking form can appear per page; a services list can sit alongside it.

= Does Schedopia rely on any third-party services? =

Not unless you ask it to. Out of the box Schedopia contacts no external service and loads nothing from third-party CDNs, so your business data stays on your own site. There is one opt-in exception: if you switch on reCAPTCHA spam protection and supply your own keys, the booking form then loads Google's script and checks submissions with Google (see the External Services section below). The only other third-party links are the optional "add to calendar" buttons in customer emails. They are ordinary links your customer may click to save their appointment in Google or Outlook. Connect your AI is inbound only. It is off by default, and when you switch it on, an AI client you sign in and approve connects to your site. The plugin never contacts any AI service itself.

= Does Schedopia use custom database tables or custom post types? =

Custom tables (`wp_schedopia_*`). Bookings, services, staff, customers, payments, venues, seats, and events are stored relationally rather than as posts.

= How do developers extend Schedopia? =

Through documented lifecycle hooks, filters, and driver interfaces (`BookingSource`, `NotificationChannel`, `PaymentMethod`). Every booking flows through one validated path, so an extension can never create a booking the core would reject. A full REST API is available under `/wp-json/schedopia/v1/`. On WordPress 6.9 or newer the same actions are also registered with the Abilities API, and Settings → Connect your AI can expose them to an AI assistant you approve, over the plugin's own MCP endpoint. Developer docs: [schedopia.com/docs](https://schedopia.com/docs).

= What happens to my data if I uninstall? =

Uninstall keeps your business data by default. It is deleted only if you explicitly opt in.

== Screenshots ==

1. The customer booking form. Customers choose a service, filtered by category, with duration, staff count, and price shown up front.
2. Picking a date and time. Customers select a day, then a morning or afternoon slot, with a running appointment summary and total.
3. The final step. Customers enter their details, add notes, and confirm. Pay-on-arrival keeps booking friction low.
4. The admin dashboard, with bookings, revenue, completion rate, and new customers, plus a bookings trend chart and the day's schedule.
5. The bookings management screen. Filter by status, staff, or service, and search across every appointment with payment status and amounts.
6. The Form Appearance customizer. Brand the booking form's colors, fonts, and shapes with a live desktop and mobile preview.
7. Booking a seat, step one. Customers browse upcoming events with the date, venue and hall, duration, live seats-left count, and a "from" price per seat.
8. Picking seats on the map. Seat tiers are colour-coded, taken seats are greyed out, and the running summary totals the selected seats.
9. Connect your AI, set up: switch the built-in MCP server on, copy the endpoint, and connect Claude Code, Codex or Cursor in three steps.
10. Connect your AI, permissions: 51 MCP tools, each with its own switch, grouped by area. Reading is on; changes and deletions stay off until you allow them.

== External Services ==

Schedopia loads nothing from third-party services by default. One optional feature connects to an external service when you explicitly enable it:

**Google reCAPTCHA v3** (optional spam protection for the public booking form). Only when you enable reCAPTCHA in *Settings → Booking rules* **and** provide your own site and secret keys, the booking form loads Google's reCAPTCHA script, and each form submission sends the reCAPTCHA response token and the visitor's IP address to Google's `siteverify` endpoint to obtain a spam score. No booking or customer data is sent. This service is provided by Google: [terms of service](https://policies.google.com/terms), [privacy policy](https://policies.google.com/privacy). If you never enable the feature, no request to Google is ever made. The built-in honeypot and timing checks work without any external service.

== Changelog ==

= 1.4.1 - 2026-09-28 =
* Added: A services list. Put `[schedopia_services]` on any page to show your services as cards. Each card's Book button opens the booking form with that service already chosen, straight to picking a staff member.
* Added: An events list. Put `[schedopia_events]` on any page to show your upcoming events with their date, venue, seats left and starting price. Select seats opens that event's seat map. Sold-out events show as Fully booked, or add `hide_sold_out="yes"` to leave them out.
* Added: Choose the page the list buttons open, or create one in a click, under Settings → Shortcode and in the setup wizard. Events can go to a page of their own.
* Added: Design for the lists. Pick grid or list layout, the number of columns, card shadow and border, which details each card shows, and the lists' own button and price wording, with a live preview.
* Added: Cover images for services, chosen from your media library and shown on the service cards in the booking form and the services list.
* Added: Cover size controls. Set the cover height on the booking form and on each list, and the cover width in the list layout, from presets or any custom size in pixels.
* Improved: The Booking form tab under Settings is now Design, one place for the look of the booking form and both lists.
* Improved: When a customer arrives from a Book button, the form shows the chosen service with its price and duration, and a button to change it.

= 1.4.0 - 2026-09-22 =
* Added: Connect your AI, under Settings → Connect your AI, lets you run your site from the AI assistant you already use (claude.ai, Claude Desktop, ChatGPT, Claude Code, Cursor or Codex). Each of the fifty-one tools has its own switch. Reading is on, anything that changes or deletes stays off until you allow it, and every call is logged. The feature is off by default and needs WordPress 6.9 or newer; see the new section at the top of this page.
* Fixed: Moving a booking to a time another booking already holds is now refused, so an edit can no longer double-book a staff member.
* Fixed: The activity log is now written to; it was empty on every install.

= 1.3.3 - 2026-09-11 =
* Added: Buffers, capacity, slot interval and minimum notice can now be set once for the whole business, under Scheduling. A service can still override them.
* Added: Slot interval. Offer start times every 15 or 30 minutes, so a 60-minute service can start at 9:00, 9:15 or 9:30.
* Added: Minimum notice. Stop customers booking too close to the start time. Bookings you make yourself are not restricted.
* Improved: Dates and times are now picked with Schedopia's own calendar and clock instead of the browser's.
* Fixed: A new service had no staff attached, so nobody could book it. Staff are now attached automatically, and a service without any is flagged on the Services screen.
* Fixed: A one-person business had to create a staff member before anything was bookable. Adding your first service now adds you as the owner.
* Fixed: A service can now be created without a category.
* Fixed: A buffer or capacity set to 0 on a service was ignored and the default used instead. Setting 0 now means 0. The same fix applies to a seat priced 0, which was inheriting its tier's price.

= 1.3.2 - 2026-09-07 =
* Added: Set a cover image for an event, picked from your media library. An event without one now gets a tighter card instead of an empty grey box.
* Added: Give a single row its own first seat number, for a front row that is shorter than the rest. Click the row letter in the seat planner to set it.
* Added: A "Require approval for new bookings" rule under Settings > Booking rules. It is off by default, so a booking made on your form is confirmed straight away and the customer gets the confirmation email.
* Changed: The request-received email is now on by default, so a customer waiting for approval always gets a receipt.
* Improved: Event emails name the venue, the hall and the seats booked, and the email to you also carries the customer's phone number and their note.
* Improved: The bookings CSV carries the whole booking: venue, hall, seats, add-ons, duration, address, payments and notes.
* Fixed: A hall with more than 100 seats reported the wrong seat count on the Venues screen. The seat map itself was always right.
* Fixed: Activating Schedopia with WP-CLI (`wp plugin activate`) skipped the setup that creates the database tables and grants the Schedopia permissions, so the admin menu never appeared. This also fixes the WordPress Playground preview.

= 1.3.1 - 2026-09-04 =
* Added: Seat numbering per hall. Choose whether seat numbers run left to right or right to left as seen from the stage, set the first seat number, and add an optional label prefix such as VIP. The seat planner, the admin seat picker and the customer seat map all follow the same rule.
* Improved: The customer seat map shows the seat number inside each seat, with the row letter beside the row, so a wide hall stays readable.
* Fixed: Saving an event failed with "An event must run in at least one hall" even though a hall was ticked. Events can be created and edited again.
* Fixed: Editing only some of an event's details no longer fails with a date error.

= 1.3.0 - 2026-08-30 =
* Added: Events and seat reservations, a second way to take bookings. Create dated events in your venue and let customers reserve specific seats. They browse upcoming sessions with live availability and a "from" price, then pick their seats on a real seat map. A seat can never be reserved twice for the same event.
* Added: Venues, halls and a visual seat planner. Lay out rows and aisles, generate seats in bulk, and optionally group them into tiers (VIP, Standard, Balcony) with their own colour and price. Any individual seat can override its tier's price.
* Added: An event can open more than one hall. Add a second room when the first sells out, and customers switch between seat maps while booking.
* Added: Choose what you take bookings for. The setup wizard now asks whether you run appointments or events, and tailors the rest of setup to your answer; you can change it any time under Settings, including running both.
* Added: `[schedopia_booking mode="event"]` places the seat-reservation flow on a specific page. The plain `[schedopia_booking]` shortcode follows whichever mode you chose.
* Added: Book seats on a customer's behalf from the admin. The New Booking screen gains an event and seat picker alongside the appointment flow.
* Added: Seat reservations show up everywhere a booking does. Confirmation and reminder emails, add-to-calendar links and the calendar feed name the event, and the CSV export gains an Event column.
* Fixed: A booking attempt that fails, for example when someone else took the seat a moment earlier, no longer leaves a customer record behind.

= 1.2.2 - 2026-08-17 =
* Added: Export your bookings to CSV. The Export CSV button on the Bookings screen downloads exactly what the list is showing, with the same search term, status tab, staff and service filters, ready to open in Excel, Google Sheets, or Numbers. The whole filtered set is included, not just the page on screen.
* Fixed: Searching the bookings list works again. The search box previously failed and returned nothing; it now matches on customer name and email, service, and staff member.

= 1.2.1 - 2026-08-06 =
* Added: Spam protection on the booking form. A hidden decoy field and a minimum fill-time check reject automated submissions before anything is saved, so junk bookings never reach your list. Both work out of the box with nothing to configure.
* Added: Optional Google reCAPTCHA v3 for the booking form, under Settings → Booking rules. It stays switched off until you turn it on and add your own keys. Until then the form contacts no outside service at all.

= 1.2.0 - 2026-07-27 =
* Added: Customers can cancel their own booking from a secure link in their confirmation, pending, and reminder emails. They see their booking details and confirm before anything changes, and no account or login is needed.
* Added: A "Booking rules" settings section that controls whether customer cancellations are allowed at all, and how many hours before the start time the link stops working.
* Added: A read-only calendar feed. Subscribe Google Calendar, Outlook, or Apple Calendar to it and your bookings appear alongside the rest of your schedule. It stays off until you turn it on under Settings, and you can rotate the address at any time if it gets shared too widely.
* Added: "Add to calendar" buttons for Google, Outlook, and Apple in confirmation and reminder emails, so customers can save the appointment in one click. You can switch these off under Settings if you would rather not send customers to Google or Outlook.
* Improved: Every customer email has been redesigned, with your business name at the top, the appointment details in a clear panel, and a layout that holds together on phones and in Outlook. Nothing is loaded from anywhere else, so the emails render the same with images switched off.
* Improved: A slot freed by a customer cancellation becomes bookable again immediately, and the cancellation flows through the same notifications as a cancellation made from the admin.

= 1.1.0 - 2026-07-20 =
* Added: Service add-ons. Attach optional extras to a service on the new Add-ons screen. Each add-on carries its own price and duration.
* Added: Customers can pick add-ons while booking, with an itemized summary showing what each one costs.
* Added: Staff can pick add-ons in the admin New Booking dialog, and the booking details drawer lists the add-ons on a booking.
* Improved: Available times automatically resize to the service plus the chosen add-ons, so a slot is only offered when the whole appointment fits and the calendar blocks the real time taken.
* Improved: An add-on's name, price, and duration are saved with the booking, so past bookings and receipts don't change when you edit the catalog later.

= 1.0.1 - 2026-07-14 =
* Fixed: Bookings submitted without a timezone now default to the site's WordPress timezone instead of UTC, so wall-clock times are stored against the correct zone.

= 1.0.0 - 2026-07-10 =
* Added: First stable release, a complete appointments booking system. It includes a service catalog with categories; staff with weekly working hours, days off, buffers, and capacity; real dated bookings with a transactional double-booking guard; manual / offline payment recording; email notifications (confirmation, cancellation, operator alert, reminders); a setup wizard; a single-page admin dashboard; and the customer-facing `[schedopia_booking]` form with the Form Appearance customizer.
* Added: A single validated booking path (admin, form, and API) with serial/reference generation and a confirmation email on every booking.
* Added: A REST API for every entity with schema-driven validation, granular per-area capabilities, and rate limiting on the public API.
* Added: Self-hosted fonts and assets. Schedopia loads nothing from third-party CDNs. Uninstall preserves business data unless you opt in to deletion.

== Upgrade Notice ==

= 1.4.1 =
Adds services and events lists you can place on any page, each linking to your booking form, with their own design under Design. Services can now have cover images, and every cover's size can be set.

= 1.4.0 =
Adds Connect your AI: let Claude, Cursor or another assistant run your site by talking to it, for bookings, services, staff, customers, payments, events and the booking form. Off by default, one switch per tool, needs WordPress 6.9. Also stops an edited booking from double-booking a staff member.

= 1.3.3 =
Fixes a service being unbookable when it had no staff attached. New services now get your staff automatically, and a one-person business no longer has to create a staff member first. Also lets you set buffers, capacity, slot interval and minimum notice once for the whole business.

= 1.3.2 =
Form bookings are now confirmed automatically and send the confirmation email. To approve each one first, turn on "Require approval for new bookings" in Settings. Also adds a per-row first seat number, seats and venue in event emails, and a fuller CSV export.

= 1.3.1 =
Fixes event saving, which failed with a "must run in at least one hall" error even when a hall was ticked. Also adds per-hall seat numbering: right-to-left rows, a custom first seat number and an optional label prefix.

= 1.3.0 =
Adds events and seat reservations: build a venue with a seat map, create dated events, and let customers pick their seats online, alongside or instead of appointments. Also stops a failed booking attempt from leaving a stray customer record behind.

= 1.2.2 =
Adds a CSV export of your bookings that respects the filters you have applied, and fixes the bookings-list search, which previously returned an error instead of results.

= 1.2.1 =
Adds automatic spam protection to the booking form, so bot submissions are turned away before they become bookings. It works immediately with no setup, and optional reCAPTCHA is available if you want a stricter screen.

= 1.2.0 =
Customers can now cancel their own bookings from a link in their emails. It is on by default, with a 24-hour cut-off you can change or switch off under Settings. Also adds an optional calendar feed, add-to-calendar buttons, and a redesign of every customer email.
