What It Does
AppointmentPro is a complete booking management addon built for PHP websites. It gives businesses a polished dark-themed admin panel where appointments can be tracked, services defined, and unavailable times blocked out — all powered by a lightweight SQLite database with no external server required.
Feature Breakdown
| Feature | Details | Notes |
|---|---|---|
| Status Management | Pending → Confirmed → Completed → Cancelled | Dropdown + save button per row; triggers email on Confirmed |
| Search | Live search by name, email, or service | GET-based, preserves active filter tab |
| Filter Tabs | All / Pending / Confirmed / Completed / Cancelled | Counts shown live in each tab |
| Services CRUD | Add, enable/disable, delete services | Duration in minutes, optional description |
| Blocked Times | Block by date + optional time, or mark all-day | Reason field for internal notes; deletable |
| CSRF Protection | Token on every POST form | appt_csrf_token() + appt_verify_csrf() |
| Session Auth | Password login with session flag | Change default password in login.php |
| Email on Confirm | HTML email sent via sendEmail() | Includes service, date, and time in styled table |
| SQLite Storage | Zero-config file-based database | No MySQL required; portable and fast |
Pricing & Market Value
AppointmentPro is a complete, production-ready scheduling addon. Here's how it compares to the market — and why the one-time pricing is a significant advantage.
One-Time License
Pay once. Own it forever. All future upgrades are included at no additional cost — no subscriptions, no renewal fees, no per-seat pricing.
- Online booking widget
- Email reminders
- You own the data
- Self-hosted
- One-time cost
- White-label admin
- Full admin panel
- Email confirmations
- You own the data
- Self-hosted on your server
- One-time cost forever
- White-label ready
- Custom built
- Email notifications
- You own the data
- Self-hosted
- Months to deliver
- Ongoing maintenance cost
Free Upgrades — For Life
Every customer who purchases AppointmentPro receives all future updates at no additional charge. The roadmap below shows what's planned — all included.
Lifetime Upgrade Guarantee
Buy once and receive every new feature, security patch, and version upgrade automatically. No upgrade fees. No tier locks. No expiration.
| Planned Feature | Status | Description |
|---|---|---|
| Public Booking Widget | Upcoming | Embeddable booking form for your website front-end |
| SMS Reminders | Upcoming | Twilio-powered SMS confirmations and reminders |
| Google Calendar Sync | Planned | Two-way sync with Google Calendar for admins |
| Recurring Appointments | Planned | Weekly / biweekly / monthly repeat bookings |
| Multi-Staff Support | Planned | Assign appointments to individual team members |
| Payment Integration | Planned | Stripe deposit or full payment at booking time |
| Client Portal | Planned | Let clients view, reschedule, or cancel their own bookings |
| MySQL Support | Planned | Optional MySQL/MariaDB backend for high-volume sites |
File Structure
AppointmentPro lives in a self-contained directory that can be dropped into any PHP host. No Composer, no npm, no build step.
| File | Method | Purpose |
|---|---|---|
| admin/index.php | GET POST | Main dashboard — lists, filters, searches, and updates appointment statuses; triggers confirmation email |
| admin/services.php | GET POST | CRUD for services: add with name/duration/desc, toggle active state, delete |
| admin/blocked.php | GET POST | Add or remove blocked dates/times; supports all-day flag |
| admin/login.php | POST | Session-based password authentication; redirects to dashboard on success |
| includes/config.php | PHP | ApptDB class, sanitize(), post(), get(), CSRF helpers, appt_require_admin(), sendEmail() |
| database/appointments.sql | SQL | SQLite schema creation + 4 default service rows seeded on first install |
Database Schema
Three SQLite tables power the entire system. The database file is auto-created and requires no manual setup beyond running the SQL schema once.
Admin Modules
The admin panel has three core sections, each a standalone PHP page sharing a common sidebar navigation and config layer.
Appointments Dashboard (index.php)
The home screen. Shows stat cards for Total, Pending, Confirmed, and Completed counts. Lists all appointments in a table with name, email, phone, service, date/time, status badge, truncated notes, and an inline status dropdown. Submitting the dropdown fires a POST that updates the DB and redirects. If the new status is "confirmed," an HTML email is sent to the client.
Service Manager (services.php)
A three-column add form at the top (name, duration, description) with an Add Service button. Below, a table lists every service with Active/Inactive badge, an Enable/Disable toggle button, and a Delete button with confirmation prompt. Services are ordered alphabetically.
Blocked Times (blocked.php)
A four-column form (date, time, reason, all-day checkbox + Block button). Below, a table lists all blocked entries with the date, time (or dash if all-day), reason, type label, and a Remove button. Blocks are ordered most-recent date first.
Security Model
AppointmentPro uses several layers of protection appropriate for a small-business admin addon.
appt_admin_2024. Update this before going live. A future update will replace it with a bcrypt-hashed credential stored in config.| Layer | Implementation |
|---|---|
| Session Auth | $_SESSION['appt_admin'] flag; all admin pages call appt_require_admin() at the top |
| CSRF Tokens | Every POST form embeds a csrf_token; verified with appt_verify_csrf() before any mutation |
| Output Sanitization | All database values passed through sanitize() before rendering to prevent XSS |
| Prepared Statements | INSERT operations use prepare() + bindValue() to prevent SQL injection |
| Type Casting | IDs cast to (int) before any DELETE or UPDATE query using string interpolation |
| Status Whitelist | Status updates validated against an in_array() whitelist before executing |
Appointment Statuses
Each appointment moves through a simple lifecycle. Admin can set any status at any time via the dashboard dropdown.
| Status | Meaning | Triggers |
|---|---|---|
| Pending | Default state — booking received, awaiting review | No email sent |
| Confirmed | Admin has accepted the booking | Sends confirmation email to client |
| Completed | Appointment has occurred successfully | No email sent |
| Cancelled | Booking cancelled by admin or client | No automatic email (can be added) |
Installation
AppointmentPro is designed to install in minutes. No Composer. No npm. No build tools.
Upload Files
Upload the addons/appointments/ directory to your PHP web host. The admin panel lives at /addons/appointments/admin/.
Initialize the Database
Run appointments.sql once to create the three tables. With SQLite, this happens automatically when the ApptDB class connects for the first time — the schema is applied on first load if not yet present.
Set Your Admin Password
Open admin/login.php and update the $admin_pass variable to a strong password of your choice before going live.
Configure Email (Optional)
In includes/config.php, configure the sendEmail() function with your preferred PHP mailer or SMTP credentials for confirmation emails to work.
Log In & Start Taking Bookings
Visit /admin/login.php, enter your password, and you're in. Add your services, and start receiving appointments submitted through the front-end booking form.
Email Notifications
When an appointment is moved to Confirmed status, the system fetches the appointment record and sends a styled HTML email to the client.
| Email Field | Value |
|---|---|
| To | Client's email from the appointment record |
| Subject | Appointment Confirmed — [appt_date] |
| Body | HTML with greeting, confirmed status notice, and a table of service / date / time |
| Trigger | Only fires when status changes to "confirmed" via admin dashboard |
| Function | sendEmail($to, $subject, $html_body) defined in config.php |