Live · status OK
OW Agenda · v1.3.1 · GPL-2.0

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.

v1.3.1GPL-2.0WordPress 6.3+PHP 7.4+
Why

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.

Slots taken by nobody

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.

The Saturday-morning double booking

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.

A back office nobody can use at the counter

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.

Under the hood

What actually changes

No slogans. Here are the technical decisions that set this product apart.

Online booking on slots that are genuinely free

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.

Double opt-in: bots don't get in

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.

Approve straight from your inbox

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.

A mobile-first agenda for the practitioner

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.

Customer directory and session invitations

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.

Reminders and calendars that don't get lost

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.

Comparison

Against alternatives

Verifiable data. Only checking what actually exists in the competition.

CriterionOW AgendaAmeliaBooklySimply Schedule Appointments
Business modelFree, GPL-2.0Freemium (paid Pro)Freemium (paid Pro)Freemium (paid Pro)
Free-version limitsNone: everything is includedLite: 1 employee, 1 location5 services, 1 employeeBasic features only
License key to activateNoneFor the Pro versionFor the Pro versionFor the Pro version
Email double opt-in before the slot is takenOn by defaultNot advertisedNot advertisedNot advertised
Confirm / Decline from the email, no loginHMAC-SHA256 signed linksYesNot advertisedNot advertised
ICS file attached to customer emailsREQUEST, updates and CANCEL
Automatic anonymisation of past appointmentsIncluded, adjustable delayNot advertisedNot advertisedNot advertised
Day-to-day managementFront-end page, mobile-firstWordPress back officeWordPress back officeWordPress back office
Integration

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>
Technical questions

Reasonable doubts, direct answers

Do the slots offered online take appointments booked by phone into account?

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.

How does the plugin keep fake bookings out?

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.

What happens if two people book the same slot at the same moment?

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.

Can a customer cancel or move their own appointment?

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.

How do I run the agenda from a phone?

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.

Is the plugin available in other languages?

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.

Free. No asterisk.

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.
Built by Julien Daniel · Châtelet, Belgium