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

Free WordPress booking plugin. Take appointments and event seat reservations online 24/7 — self-hosted, with no double-bookings.

== Description ==

**Schedopia** is a free appointment booking plugin for WordPress that lets service businesses accept appointments online, manage staff availability, prevent double-booking, and send automated booking reminders.

Customers can choose a service, staff member, date and available time from a mobile-friendly booking form. Schedopia also includes event booking and seat reservations, letting venues, classes, workshops and small theatres create dated events and allow customers to choose specific 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 choose Schedopia? =

* **Bookings while you sleep** — a mobile-friendly booking form takes reservations 24/7, so you never miss a customer.
* **Never double-book again** — 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.
* **Your data stays yours** — 100% self-hosted, no CDNs, no per-booking commission. Nothing is sent to a third party unless you opt in to reCAPTCHA spam protection yourself.
* **Set up in minutes** — a guided setup wizard asks what you take bookings for, then walks you through your services, staff and hours, or your venue and first event.
* **Two ways to book, one plugin** — timed appointments with a staff member, and seat reservations for dated events, on the same site and the same form.
* **Looks like your brand** — a live design customizer for 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 or extended 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, with the tutor seeing exactly who is coming.
* **Talks, seminars and community meetings** — halls with rows and aisles, and tiered seating for members and guests.
* **Theatres, concerts and shows** — real seat maps with VIP, standard and balcony tiers at different prices, and an event that can open more than one hall.

If your business takes bookings for a time, a place, or a seat, Schedopia handles it.

= The booking form =

A clean, mobile-first form for both flows: pick a service, staff member and time, or pick an event and choose seats on the map. Customers see only the times that are genuinely free, choose the staff member they want, and confirm in a few taps. Add it to any page with the `[schedopia_booking]` shortcode, or `[schedopia_booking mode="event"]` to place the seat flow on its own.

= Live design customizer =

Make the form look like part of your site rather than a plugin. From *Design* in the dashboard you can:

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

Appointment and event flows each keep their own wording, so a clinic and a workshop can share one site without sharing a vocabulary.

= 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 carries its own price and duration, so choosing one extends 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; 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 times are offered, so a 60-minute service can start at 9:00, 9:15 or 9:30.
* **Real dated appointments** — every booking carries its own date, time and timezone, protected by a transactional guard that makes a double-booking impossible.

= 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 the way the room actually looks, and 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, add a cover photo, and customers browse upcoming events with live seat availability. A seat can never be reserved twice for the same event.

= Notifications and customer self-service =

* **Automated emails** — booking confirmations, cancellations, new-booking alerts for your team, and reminders before the appointment.
* **Require approval, or don't** — 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 straight from their confirmation email.

= Your dashboard =

* **One place for everything** — a fast admin with 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 wherever they already look.
* **CSV export** — download your bookings as a spreadsheet. The export follows whatever filters the list is showing, 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 if you want more.

= Works with your page builder =

The `[schedopia_booking]` shortcode works everywhere, including the Gutenberg shortcode block and the Elementor Shortcode widget. No page-builder-specific setup, no separate widgets to learn.

== 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: 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.
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, or via the REST API under `/wp-json/schedopia/v1/`.

== Frequently Asked Questions ==

= Is Schedopia free? =

Yes. Schedopia is a complete, self-hosted booking plugin — 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 — salons, barbershops, spas, clinics, dentists, therapists, coaches, tutors, consultants, and home or repair services. And any business that sells seats for dated sessions — 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 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, with a transactional double-booking guard — so 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.

= 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.

= 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 — 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 anywhere are the optional "add to calendar" buttons in customer emails, which are ordinary links your customer may choose to click to save their appointment in Google or Outlook.

= 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/`.

= What happens to my data if I uninstall? =

Uninstall preserves your business data by default. Deletion only happens 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 — bookings, revenue, completion rate, and new customers at a glance, 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.

== 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.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 is never left without 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 — 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 quietly 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 — your business name at the top, the appointment details in a clear panel, and a readable 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: 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 — loads nothing from third-party CDNs. Uninstall preserves business data unless you opt in to deletion.

== Upgrade Notice ==

= 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 — 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.
