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

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

== Description ==

**Schedopia is a complete booking and scheduling plugin for WordPress.** Add an online booking form to your site in minutes and let customers book two ways: an **appointment** with the right staff member at a time that actually works, or a **seat at a dated event** in one of your venues — automatically, around the clock, without the back-and-forth of phone calls and emails.

Whether you run a salon, a clinic, a tutoring service, a yoga studio, or a small theatre, Schedopia turns your website into a booking engine. Every appointment and every seat reservation is a real, dated record, and a built-in guard means two customers can never grab the same time slot — or the same seat — so you stop worrying about double-bookings and no-shows.

Best of all, Schedopia is **fully self-hosted**. Your bookings, your customers, and your data stay on your own site. Nothing loads from third-party services unless you turn on optional reCAPTCHA spam protection yourself, and there are no per-booking fees.

**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 validated against real staff availability, and every seat against what's already reserved, with a transactional guard 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. The plugin contacts no external service unless you opt in to reCAPTCHA spam protection.
* **Set up in minutes** — a guided setup wizard asks what you take bookings for, then walks you through either services, staff and hours, or your venue and first event.
* **Looks like your brand** — customize the booking form's colors, fonts, and buttons with a live preview.

**Key Features**

* **Online 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. Add it to any page with the `[schedopia_booking]` shortcode, or `[schedopia_booking mode="event"]` to place the seat flow specifically.
* **Events & seat reservations** — sell seats for dated events: classes, workshops, talks, shows. Customers browse upcoming sessions with live availability, pick their seats on a real seat map, and book. An event can open more than one hall, and a seat can never be reserved twice for the same event.
* **Venues, halls & seat maps** — build your venue once: halls, a visual seat planner with rows and aisles, and optional seat tiers (VIP, Standard, Balcony) with their own colours and prices. Individual seats can override their tier's price.
* **Service catalog** — organize 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 — customers and staff both pick them while booking.
* **Staff & availability management** — set each team member's weekly working hours, days off, buffer times, and capacity. Availability automatically drives which time slots customers can book.
* **Real dated appointments** — every booking carries its own date, time, and timezone, protected by a transactional double-booking guard.
* **Customer management** — keep a record of your customers and their booking history.
* **Form appearance customizer** — brand the booking form with global colors, fonts, shapes, and button styles, plus custom labels for each step, all with a live preview.
* **Powerful admin dashboard** — a fast single-page admin with a dashboard, filterable bookings list, team calendar, service catalog, scheduling, customers, staff, payments, and an activity log.
* **CSV export** — download your bookings as a spreadsheet. The export follows whatever filters the list is showing, and covers the whole filtered set, not just the page on screen.
* **Manual & offline payments** — record cash, bank transfer, and mark-as-paid payments.
* **Automated email notifications** — booking confirmations, cancellations, new-booking alerts for your team, and appointment reminders.
* **Customer 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.
* **Calendar feed & add-to-calendar** — subscribe Google Calendar, Outlook, or Apple Calendar to a read-only feed of your bookings, and let customers save an appointment straight from their confirmation email.
* **Works with your page builder** — the `[schedopia_booking]` shortcode works everywhere, including the Gutenberg shortcode block and the Elementor Shortcode widget.

**Perfect for**

Salons and barbershops, spas and beauty studios, dentists and health clinics, therapists and coaches, tutors and instructors, consultants and freelancers, repair and home services — any business that runs on appointments. And for seated sessions: yoga and fitness studios, cookery and craft workshops, community centres, small theatres and event spaces.

**For developers**

Schedopia is built to extend without forking. It ships a full REST API for every entity with schema-driven validation, granular per-area capabilities, and rate limiting on the public API. Extensions build on documented lifecycle hooks, filters, and driver interfaces (`BookingSource`, `NotificationChannel`, `PaymentMethod`), and every booking flows through a single validated path — so an extension can never create a booking the core would reject. Data is stored in dedicated relational tables (`wp_schedopia_*`) rather than as custom post types.

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