Building Block

Booking & Scheduling

Appointment booking forms, availability calendars, and Stripe deposit flows — Claude deploys a complete PHP booking system in a single conversation. No SaaS booking plugin, no monthly per-booking fee.

Booking & scheduling patterns

Three appointment system patterns — from a simple slot-based booking form to a full availability calendar with Stripe deposit payment. Pure PHP, MySQL, and vanilla JS — no Calendly, no BookingKit, no per-booking commission.

Pattern 1 — Appointment Booking Form

A simple, effective booking form with date and time slot selection, service type, and client details. PHP handler validates availability in real time, saves to MySQL, and sends dual confirmation emails — one to the client, one to the admin. No calendar UI required.

PHP MySQL SMTP AJAX Vanilla JS
  • HTML form: date picker (<input type="date">), dynamically populated time slot <select> via JS fetch, service type dropdown, name/email/phone/notes fields
  • AJAX availability check: JS fetches slots.php?date=YYYY-MM-DD on date change and rebuilds the slot dropdown — already-booked slots excluded
  • book.php: server-side double-check of slot availability before insert (race condition safe)
  • MySQL bookings table: booking_ref, date, time_slot, service, name, email, phone, notes, status
  • Configurable slot duration (30 min, 60 min), day start/end time, and lunch break gap — all set in a PHP config array, no DB changes needed
  • Dual SMTP emails: styled HTML confirmation to client (booking ref, date/time, service) and plain-text notification to admin
Prompt to use with Claude

Build an appointment booking form for my site. Services offered: [Service A, Service B, Service C]. Available days: [Mon–Fri]. Slots: [9am–5pm], [60]-minute sessions with a [30]-minute lunch break from [1pm]. Store bookings in a MySQL bookings table. On date selection, fetch available slots via AJAX from slots.php. Validate availability server-side before insert. Send a confirmation email to the client and a notification to [admin@yourdomain.com] via SMTP. Generate a unique booking_ref per booking. CSS in theme.css, JS in main.js.

Pattern 2 — Visual Availability Calendar

A month-view calendar built in HTML, CSS, and vanilla JS that shows available days at a glance. Clicking a day reveals its available time slots. Fully configurable from a PHP array — block individual dates, set weekday patterns, add seasonal closures. No third-party calendar library.

Vanilla JS PHP CSS Grid JSON API MySQL
  • Month-view calendar: 7-column CSS Grid, prev/next month navigation with JS, today highlighted in brand colour
  • Day states: available (default), fully booked (muted), unavailable/closed (strikethrough), today (highlighted)
  • PHP availability.php serves a JSON array of blocked dates and remaining slots per date — fed from a config array + live bookings query
  • Click a day: JS fetches remaining slots, renders a slot picker below the calendar, submits to book.php
  • Blocked date config: PHP array of ISO dates, day-of-week patterns (e.g. no Sundays), and date ranges (e.g. holiday closure)
  • prefers-reduced-motion: month transitions skip animation, slot picker appears instantly
  • Fully keyboard navigable: arrow keys move between days, Enter selects, Escape clears slot picker
Prompt to use with Claude

Build a visual availability calendar for my booking page. Show a month-view calendar grid (CSS Grid, vanilla JS). Available days: [Mon–Sat]. Closed: [Sundays] and these specific dates: [YYYY-MM-DD, YYYY-MM-DD]. Clicking an available day fetches remaining [60]-minute slots from availability.php (JSON). Show the slot picker below the calendar. Submit booking to book.php which saves to a MySQL bookings table and sends confirmation via SMTP. Keyboard navigable. CSS in theme.css, JS in main.js.

Pattern 3 — Stripe Deposit Booking

Combines the appointment form with a Stripe Checkout deposit payment — the booking is only confirmed once the deposit clears. The Stripe webhook marks the booking as confirmed and triggers the confirmation email. Ideal for high-value appointments: consultations, shoots, events.

PHP Stripe Checkout Webhook MySQL SMTP
  • Booking form saves details to MySQL with status: pending_payment and a unique booking_ref
  • On form submit, PHP creates a Stripe Checkout Session with the deposit amount and passes booking_ref as metadata
  • Stripe redirects client to pay — success URL: /booking-confirmed?ref={booking_ref}
  • Webhook handles checkout.session.completed: reads booking_ref from metadata, updates MySQL status to confirmed
  • SMTP confirmation email sent only after webhook confirms payment — not on form submit
  • Uncompleted sessions: a PHP cron (or manual admin/cleanup.php) releases slots with status: pending_payment older than 30 minutes
  • Configurable deposit amount: fixed value or percentage of service price
Prompt to use with Claude

Build a deposit-gated appointment booking system. The booking form (name, email, service, date, time) saves to MySQL with status ‘pending_payment’. On submit, create a Stripe Checkout Session for a £[deposit_amount] deposit with booking_ref in metadata. On checkout.session.completed webhook, update status to ‘confirmed’ and send an SMTP confirmation email to the client. Add a cleanup endpoint to release slots with status ‘pending_payment’ older than 30 minutes. CSS in theme.css.

Every booking pattern includes

No per-booking commission

Calendly and Acuity charge monthly plus take a cut. Claude deploys your own booking engine — you own the code, the data, and every booking.

Configurable without code changes

Slot durations, available days, blocked dates, and service lists are set in PHP config arrays — update availability by editing one file, no DB migration required.

Double-booking prevention

Every booking write is validated server-side immediately before INSERT. Concurrent requests for the same slot result in only one successful booking — the other gets a polite error.

Fully iterable

Need a new service type, a different slot length, or a rescheduling flow? Describe the change to Claude and it updates your live booking system in the same session.

Pair bookings with

Complete your booking site with these building blocks.

Contact Forms

Pair a booking form with an enquiry form for clients who aren’t ready to commit to a slot yet.

View patterns →

Auth & Members

Gate your booking system to logged-in members or subscribers with PHP session-based access control.

View patterns →

Deploy your first booking system today

From £6.99/month — cancel anytime.