
Native Pro Scheduler — A Production-Grade WordPress Booking Plugin
A fully-featured WordPress booking plugin built from scratch: multi-provider scheduling, Google Calendar sync, Stripe payments with authorize-then-capture, configurable email templates, and a clean REST API — all delivered as a self-contained plugin that installs in minutes and handles the full booking lifecycle end to end.

What Was Built
Native Pro Scheduler is a production-grade appointment booking system for WordPress. Rather than reaching for an off-the-shelf plugin laden with features nobody uses and a monthly subscription fee, this was built specifically to cover the real requirements of service-based businesses: multiple staff members, multiple services, flexible payment options, Google Calendar keeping everything in sync, and automated email communications at every stage of the booking lifecycle.
The result is a plugin that installs like any other WordPress plugin but runs like a bespoke application — custom post types for providers and services, custom database tables for bookings and availability, its own REST API, and a multi-step booking form that works reliably across themes without needing a page builder.
Multi-Provider Architecture
Each provider in the system is a first-class entity with their own availability schedule, assigned services, and Google Calendar connection. Weekly availability is configured per-provider with per-day on/off toggles and start/end times, stored in UTC. Date-specific overrides in the availability table take precedence over recurring schedules for one-off exceptions — a flexible model that handles real-world scheduling without requiring a rebuild.
When a client books, the slot engine checks actual availability across all providers who can deliver the requested service, accounts for appointment duration and buffer time, cross-references Google Calendar free/busy data, and presents only genuinely bookable slots. The booking is then atomic: slot re-validated server-side at the point of confirmation, before any payment is captured.
Stripe Integration — Authorize then Capture
Payment handling uses Stripe's authorize-then-capture flow, which is the right approach for a booking system and often overlooked in simpler implementations. The card is authorised (held) before the booking is confirmed, availability is re-validated server-side, and the charge is only captured once the booking row is successfully written to the database. If the slot is taken in the window between authorisation and confirmation, the hold is released automatically — no double-charges, no awkward refunds.
Four payment modes are supported per service: no payment, full charge at booking, fixed deposit amount, or percentage deposit. API keys are stored AES-256-GCM encrypted, using a key derived from WordPress's own AUTH_KEY.
Google Calendar — Full Sync
Each provider connects their Google Calendar via a standard OAuth2 flow directly from the WordPress admin. Access and refresh tokens are stored encrypted in provider post meta. When a booking is confirmed, an event is created in the provider's calendar. When a booking is rescheduled from the admin panel, the calendar event is updated. When a booking is cancelled, the event is deleted and the Stripe charge is voided or refunded — all in a single admin action.
Email System
Five email templates are editable from the WordPress admin via a full rich-text editor: booking confirmation (sent to client and provider), 24-hour appointment reminder (sent via WP-Cron), cancellation alert, admin new-booking notification, and reschedule notification. Every template supports a token system — {{client_name}}, {{booking_date}}, {{service_name}}, and a dozen others — replaced at send time so templates are genuinely customisable without touching code.
Admin Experience
The admin panel gives a full view of the business: a dashboard with booking counts, confirmed appointments, and today's schedule; a paginated bookings table with status filtering and client search; and per-booking actions for reschedule, complete, and cancel — each of which triggers the appropriate downstream actions (calendar update, email, payment void) automatically.
Real-World Debugging
The changelog tells part of the story that polished documentation often hides. Several releases were dedicated to a single problem: the booking calendar being unclickable on sites running BeTheme, one of the most popular premium WordPress themes. The root cause — BeTheme injecting absolutely-positioned overlay divs inside every section and column wrapper that silently absorbed pointer events — required multiple approaches before a structural fix was found.
The final solution moved the calendar element to a DOM portal (a direct <body> child) at page load, placing it entirely outside BeTheme's stacking context hierarchy and making z-index conflicts structurally impossible. A placeholder div preserves the layout space, positioned via getBoundingClientRect() and synced on scroll and resize. It's the kind of fix that only comes from genuinely diagnosing a problem rather than patching symptoms — and it's what separates a plugin that works in demos from one that works in production.
Technical Summary
Custom post types: Providers and Services, each with full meta box UIs
Custom DB tables:
nps_bookingsandnps_availability, created viadbDeltaon activationREST API:
/wp-json/nps/v1/with endpoints for slot availability, PaymentIntent creation, booking confirmation, and cancellationStripe: authorize-then-capture, four payment modes, AES-256-GCM key encryption
Google Calendar: OAuth2, FreeBusy queries, full event CRUD
Email: five editable template types, token substitution, WP-Cron reminders
Shortcodes:
[nps_booking]and[nps_services]with attribute supportTheme-overridable templates for archive and taxonomy pages
Geocoding via Google Maps API for service location fields
Project Links
Categories
Let's Work Together
Ready to Build Something Remarkable?
Whether you need a bespoke website, a full digital marketing strategy, or a technical partner who understands business — I'm here.
