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.

Payment & Checkout

Add deposit and balance payment flows to your booking system with full Stripe webhook handling.

View patterns

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. First month free — no credit card required.