WordPress appointment booking
without the ghost slots.
OW Agenda handles online booking, approval, reminders and the practitioner's daily agenda. Every visitor request has to be confirmed through a link sent to their own email address before it takes a slot: a bot never reaches your schedule. Free, GPL, no Pro version.
Why yet another appointment plugin?
On a practice website, a booking form wired up without a safety net creates more work than it saves. Any bot can fill a public schedule, and whoever picks up the phone spends the day sorting real appointments from requests that never existed.
The established plugins do work, but they are all built on the same model: a deliberately crippled free version — one employee, one location, a handful of services — and a yearly subscription to get normal use of the software back. For a solo practitioner, what you mostly pay for is the right to leave the demo.
OW Agenda starts from a real practice and three constraints: a request does not exist until it has been confirmed by email, two visitors cannot book the same slot, and the agenda has to be run standing up between two patients, on a phone. Everything else — customer directory, invitations, ICS, reminders — follows from those three rules.
Without email verification, an open form is a schedule bots fill in for free. Here the request stays unverified, holds the slot for 45 minutes, and disappears on its own if the link is never clicked.
Two visitors on the same slot three seconds apart: a plain MySQL transaction takes no row lock and records both. OW Agenda serialises the booking with a named lock — the second visitor gets a message, not a duplicate.
Between two patients, nobody opens wp-admin on a phone. Day-to-day management happens on a login-protected page of your own site: today's view, pending requests, rescheduling, done / no-show statuses, in a few taps of the thumb.
What actually changes
No slogans. Here are the technical decisions that set this product apart.
The [ow_agenda] shortcode shows the next 14 available days, then the open times: pick a day, pick a slot, fill in a short form (name, phone, email, message) and a GDPR consent checkbox. You set the slot granularity, the consultation length, the buffer between two appointments, the minimum notice and the booking horizon. Every event in your agenda — a web booking, a phone appointment typed in by hand, a blocked slot — removes its own range from availability.
A visitor's request stays unverified until the link sent by email is clicked. It holds the slot for 45 minutes, then is purged automatically. Upstream, the honeypot field and the form timestamp are mandatory — leaving them out no longer disables anything — the hourly quota is counted per IPv4 address and per /64 prefix on IPv6, and a cap limits unverified requests on any single day.
The notification email carries two buttons, Confirm and Decline, whose links are signed with HMAC-SHA256: you decide in one tap, without opening WordPress or logging in. Manual approval is the recommended mode; automatic confirmation is still there for businesses that have nothing to arbitrate.
The [ow_agenda_admin] shortcode creates an "Agenda" page on your site, protected by login and by a dedicated capability: today's view, pending requests, adding an appointment taken over the phone, blocking slots, rescheduling, done and no-show statuses. Added to your phone's home screen, it behaves like an app.
Search, create, edit and delete customer records, filled in automatically by confirmed appointments. For a follow-up session, a private named link lets the customer choose the date themselves, on a service and a duration you have set: the invitation expires, is consumed only once, and becomes usable again if the appointment is cancelled.
Carefully built HTML emails at every step, with an ICS file attached: your customer adds the appointment to their phone calendar in one gesture, a reschedule updates the entry and a cancellation removes it. The day-before reminder goes out in a sliding 12-to-36-hour window and catches up on the next run; the hourly task reschedules itself if it ever disappears.
Against alternatives
Verifiable data. Only checking what actually exists in the competition.
| Criterion | OW Agenda | Amelia | Bookly | Simply Schedule Appointments |
|---|---|---|---|---|
| Business model | Free, GPL-2.0 | Freemium (paid Pro) | Freemium (paid Pro) | Freemium (paid Pro) |
| Free-version limits | None: everything is included | Lite: 1 employee, 1 location | 5 services, 1 employee | Basic features only |
| License key to activate | None | For the Pro version | For the Pro version | For the Pro version |
| Email double opt-in before the slot is taken | On by default | Not advertised | Not advertised | Not advertised |
| Confirm / Decline from the email, no login | HMAC-SHA256 signed links | Yes | Not advertised | Not advertised |
| ICS file attached to customer emails | REQUEST, updates and CANCEL | |||
| Automatic anonymisation of past appointments | Included, adjustable delay | Not advertised | Not advertised | Not advertised |
| Day-to-day management | Front-end page, mobile-first | WordPress back office | WordPress back office | WordPress back office |
Three ways to embed a form
No proprietary page builder forced on you. Pick the approach that fits your stack.
[ow_agenda]
// The "Book an appointment" page is created automatically on activation.
// The same shortcode serves session invitations: the private link sent
// to an existing customer points to this page with their token as a parameter.
//
// https://your-site.com/book-an-appointment/?owag_invite=<token>Reasonable doubts, direct answers
Yes. Everything sitting in your agenda occupies the time it takes: a web booking, an appointment typed in by hand after a call, a range blocked out for a meeting. Availability is worked out from your opening hours, minus those ranges, then the service length, the buffer between two appointments, the minimum notice before booking and the maximum horizon are applied. A slot shown is a slot that is genuinely free.
With a request that does not exist until it is confirmed. The visitor receives a verification link; without a click, their request holds the slot for 45 minutes and is then purged. On top of that sit a honeypot field and a timestamp that are now mandatory — a submission that omits them is rejected instead of sailing through unchecked — an hourly quota per IP address (aggregated by /64 prefix on IPv6, where a single machine would otherwise have billions of addresses) and a cap on unverified requests per day, so that one visitor cannot freeze your whole agenda.
Only one booking goes through. The critical section is serialised by a named MySQL lock: the availability check and the write both happen under that lock, which a plain transaction did not guarantee — a bare read takes no row lock under REPEATABLE READ. The lock name is derived from the database and the table prefix, so two sites on the same shared hosting never block each other. The second visitor is invited to pick another slot.
Yes, through the link in their emails, up to the notice period you set (24 hours by default); beyond that, the page invites them to call you. Cancelling sends a cancellation ICS file that removes the event from their calendar, and if the appointment came from a private invitation, that invitation becomes usable again instead of staying consumed for good.
Open the "Agenda" page of your site on the phone, log in, then use "Add to Home Screen". The interface then behaves like an app: the current day, requests awaiting approval, adding a phone appointment, blocking a slot, rescheduling, done and no-show statuses. No installation, no app store, and nothing that leaves your own hosting.
Yes. Since 1.3.1, every visible string — settings, booking and cancellation pages, API messages, email templates and the JavaScript interface — goes through the ow-agenda text domain, with English as the source language. The languages/ow-agenda.pot template ships for translators, and a complete French translation has been produced and submitted to translate.wordpress.org.
No Pro version, no license key.
OW Agenda is released under the GPL-2.0 license. Everything this page describes is in the .zip you download: no feature held back, no subscription, no limit on the number of appointments, employees or services.
- Everything is included: online booking, double opt-in, session invitations, customer directory, ICS emails and reminders.
- The .zip is downloaded from optionweb.dev. The plugin is not published on wordpress.org: install it via Plugins → Add New → Upload Plugin.
- No third-party service, no license check, no tracker: your customers' details stay on your own hosting.
- The code is GPL-2.0, readable and modifiable: you can audit it, adapt it and take it further, with or without us.