WordPress appointment booking with manual approval before confirmation
Published 5 min read
Free booking plugins for WordPress handle the form side of the transaction well. A customer picks a date and time, submits their contact details, and the plugin sends them a confirmation. That works when any available slot is acceptable and you are happy to confirm on the spot. When you need to check the request before anything confirms, the shape changes: the approval step, the queue to manage it from, and the second set of triggered emails are almost always a paid feature.
The plugin this guide describes holds every booking as pending. Nothing confirms until you act. The customer gets a receipt acknowledging their request; you get an email with their details and a link to approve or reject from your WordPress admin. When you approve, they get the confirmation. When you reject, they get a cancellation. The slot stays open until you approve it, so nothing double-books.
It is scoped to one service per booking. Variable combinations that merge two different durations into a single computed slot are outside what one small plugin handles cleanly. If a client wants to book a nails-plus-lashes appointment that spans two services each with their own time, a full-featured booking tool handles that better. If you take one service per appointment and want approval before anything confirms, this covers it.
Why the approval step costs extra in every free tier
Free booking plugins cover the form. What they tend to omit is the gap between form submission and a confirmed appointment. Some confirm instantly; others let bookings queue with no way to act on them without upgrading. The approval gate, the status transitions, and the two sets of trigger emails form a complete booking lifecycle that the free version skips to give you something to upgrade for.
Building that lifecycle from scratch puts the approval step back in without a subscription. The resulting plugin does one narrower job than any of the full booking tools, but it handles the pending-approval path end to end: submission, pending receipt, admin notification, approve or reject, customer outcome.
How per-service durations determine the available slots
Each service you define carries a duration in minutes. The weekly availability schedule sets your open days, start time and end time. When a customer picks a service and a date, the plugin divides that day into intervals matching the service duration, then removes any interval already claimed by an approved booking.
An approved 60-minute booking at 10am removes the 10am slot from the available list. A pending booking does not block anything. If two people submit requests for the same slot before you have acted on either, both land in the queue. Whichever you approve first gets it; the other needs to be rejected and the customer asked to pick again. That is a manual step, but it only arises when two requests coincide before you have approved one.
The intervals are fixed per service: a 60-minute service divides the day into hours, a 30-minute service into half-hours. Combining two services into one booking with a merged duration is outside the scope of this build, and it is worth being clear about that before anyone deploys it for a service menu where combinations are the norm.
What each party receives at every stage
On submission, the customer receives a request receipt: service name, date, time, and a note that the booking is not yet confirmed. The admin receives an email with those same details plus the customer name, email, their note if provided, and a direct link to the booking edit screen in WordPress.
On that edit screen, the admin changes the booking status to Approved or Rejected and saves. That save triggers the second email. Approved sends a confirmation to the customer with service, date and time. Rejected sends a brief cancellation. No separate approval-link flow, no magic tokens: the action happens in the same admin interface used for posts and other content. A Cancelled status is also available for bookings the admin needs to withdraw after approving.
What you get
Included
- Service definitions with per-service durations in minutes
- Weekly availability schedule: open days, start and end time per day
- Booking shortcode that shows available time slots for the selected service and date
- Pending queue: every booking requires manual approval before a confirmation goes out
- Two-email flow per booking: request receipt on submit, confirmation or rejection on admin action
Not included
- Combined-service durations: booking multiple services in one appointment with a merged slot is not supported
- Online payment: no WooCommerce or Stripe connection
- Multiple staff or resources: one availability schedule covers everything
- Calendar sync: no Google Calendar or iCal export
- Customer-facing cancellation: customers cannot cancel their own bookings through the frontend
Simply Schedule Appointments does the things on the right. This build covers the part most sites use.
Questions
What happens if two customers request the same slot before I have acted on either?
Both land in the pending queue. Whichever you approve first gets the slot; the system does not auto-reject the second because the first may not be approved yet. You will need to reject the second request and ask that customer to pick a new time.
Can a customer cancel their own request before I approve it?
Not in this build. There is no customer-facing cancellation link. If a customer needs to withdraw a request, they contact you directly and you set the booking status to cancelled from the admin screen.
Build it in Steem
The button opens the builder with this guide's prompt filled in, so you can change anything before it runs. Nothing is built, and nothing is charged, until you send it.
Read the prompt (211 words)
Build a WordPress plugin called WP Appointment Booking. It adds an Appointments post type to the admin, visible only to administrators. An admin settings page lets you define services: each service has a name and a duration in minutes. A second settings section sets weekly availability: which days you are open and a start and end time for each day. Add a shortcode called booking_form. The form asks the customer to pick a service, then a date, then an available start time. The start times shown are those with enough consecutive free time to fit the service duration, excluding already-approved bookings for that day. After picking a time, the form asks for name, email and an optional note. On submit, the booking is saved as pending. The admin receives an email with the customer name, email, service, date, time, their note and a link to the booking in the admin. The customer receives a holding email confirming their request is pending. From the booking edit screen the admin can set the status to approved, rejected or cancelled. Setting approved sends the customer a confirmation email with service, date and time. Setting rejected sends a brief cancellation email. Slots from approved bookings are excluded from the available times shown to future customers.
Steem