PromptHub
Back to Blog
Developer Tools Open Source

Stop Paying SaaS Fees! Self-Host EasyAppointments Instead

B

Bright Coding

Author

15 min read 85 views
Stop Paying SaaS Fees! Self-Host EasyAppointments Instead

Stop Paying SaaS Fees! Self-Host EasyAppointments Instead

What if I told you that businesses are burning $50–$300 every single month on appointment scheduling software that they could run themselves—for free? That's not a typo. While Calendly, Acuity, and ScheduleOnce lock you into recurring subscriptions with feature gates and data lock-in, a quiet revolution has been brewing in the open-source world. Developers and tech-savvy business owners are reclaiming control, and the weapon of choice is Easy!Appointments.

Here's the painful truth: every time your client books through a third-party SaaS, you're not just paying money. You're surrendering your customer data, accepting their branding, and praying their servers don't go down during your peak hours. What happens when they change pricing tiers? When they sunset a feature you depend on? You're trapped.

But what if you could own your scheduling infrastructure entirely? What if installation took under 30 minutes, Google Calendar sync worked flawlessly, and your clients never knew it wasn't a $10,000 enterprise solution? That's exactly what Alex Tselegidis built with Easy!Appointments—and why over a decade of refinement has made it the secret weapon that top developers deploy for clients who demand data sovereignty.

This isn't just another open-source project gathering dust. Easy!Appointments is actively maintained, battle-tested in production environments worldwide, and designed with the kind of architectural flexibility that makes developers nod in respect. Ready to escape the SaaS hamster wheel? Let's dive deep into what makes this self-hosted appointment scheduler genuinely exceptional.


What is Easy!Appointments?

Easy!Appointments is a highly customizable, open-source web application that enables customers to book appointments through a sophisticated web interface. Created by Alex Tselegidis, a developer passionate about practical, self-hosted solutions, this project has evolved into one of the most mature and reliable scheduling platforms available under the GPL v3.0 license.

The project's philosophy is deceptively simple: appointment scheduling shouldn't require surrendering your data or your wallet. While commercial alternatives have exploded into billion-dollar industries, Tselegidis has methodically refined Easy!Appointments since its inception, focusing on the features that actually matter—robust booking logic, flexible provider management, and seamless calendar integration—without the bloat that plagues enterprise software.

What makes Easy!Appointments genuinely trending now is the confluence of three market forces. First, data privacy regulations (GDPR, CCPA) have made businesses acutely aware of where customer data resides. Second, the SaaS fatigue epidemic—subscription overload has developers and small business owners actively seeking ownership-based alternatives. Third, the project's Google Calendar synchronization bridges the gap between self-hosted independence and ecosystem convenience.

Unlike many open-source projects that stagnate after initial release, Easy!Appointments maintains active development with regular releases, Discord community support, and responsive issue tracking. The repository shows healthy commit activity, and the developer's portfolio—including complementary projects like Plainpad and Questionful—demonstrates sustained commitment to the self-hosted ecosystem.

The architecture deserves special mention. Built on PHP↗ Bright Coding Blog 8.2+ with modern dependency management through Composer and frontend tooling via Node.js, it strikes a balance between accessibility for shared hosting environments and contemporary development practices. This isn't legacy PHP spaghetti; it's a structured application that respects current standards while remaining deployable where your clients already have infrastructure.


Key Features That Set It Apart

Let's dissect what makes Easy!Appointments technically compelling beyond the marketing bullet points:

Customers and Appointments Management The core CRM functionality handles complex real-world scenarios: recurring appointments, cancellation workflows, no-show tracking, and customer history. The database schema is designed for extensibility—critical when clients inevitably ask "can it also track...?"

Services and Providers Organization This is where architectural intelligence shines. Easy!Appointments implements a flexible many-to-many relationship between services and providers. A massage therapist offers different services than a dental clinic, and a single provider might offer multiple service tiers. The system handles these mappings without forcing unnatural data structures.

Working Plan and Booking Rules Enterprise-grade scheduling logic often costs thousands. Easy!Appointments includes buffer times between appointments, custom working hours per provider, blackout dates, and lead time requirements. The rule engine prevents the double-booking disasters that destroy professional credibility.

Google Calendar Synchronization Here's the secret sauce for adoption: your self-hosted scheduler doesn't live in isolation. Two-way sync with Google Calendar means providers use their existing workflows while the central system maintains authoritative records. The integration uses Google's Calendar API with proper OAuth authentication—not the brittle screen-scraping that plagues lesser alternatives.

Email Notifications System Automated confirmations, reminders, and cancellation notices reduce no-shows dramatically. The notification system is template-driven and supports multilingual deployment—essential for international operations.

Self-Hosted Installation Complete data sovereignty. Your database, your server, your SSL certificate. No vendor can mine your customer relationships or hold your data hostage during pricing disputes.

Translated User Interface Community-driven localization means deployment across regions without engineering overhead. The i18n architecture uses standard gettext-style approaches that translation teams understand.

User Community Support Active Discord channel and Google Groups forum provide peer assistance. For production deployments, this community velocity often exceeds commercial support ticket systems.


Real-World Use Cases Where Easy!Appointments Dominates

Medical and Wellness Practices

Clinics, dental offices, and therapy practices face strict data protection requirements. Patient scheduling data can't reside on arbitrary SaaS servers. Easy!Appointments deploys on HIPAA-compliant infrastructure (when properly configured) while providing the appointment types, provider rotations, and room booking that medical workflows demand. The Google Calendar sync lets practitioners see personal and professional appointments in unified views.

Consulting and Professional Services

Independent consultants and agencies bleed margin on SaaS subscriptions. When you're billing $150/hour, spending $20/month on scheduling feels trivial—until you multiply across team members and years. Easy!Appointments eliminates this entirely while providing white-label branding that maintains professional positioning. The working plan rules handle complex availability: "I only do discovery calls Tuesday mornings and strategy sessions Thursday afternoons."

Educational Institutions and Tutoring

Universities and tutoring centers manage hundreds of providers (teaching assistants, professors, private tutors) with varying availability across semesters. The self-hosted model integrates with existing identity infrastructure (LDAP/Active Directory through custom extensions), and the multi-provider architecture scales without per-seat licensing penalties.

Automotive and Technical Services

Mechanics, IT support desks, and equipment maintenance operations need service-specific duration tracking and resource allocation. A brake inspection takes 30 minutes; a full diagnostic requires 2 hours. Easy!Appointments handles these variations while tracking which bay or technician is assigned—functionality that often requires "enterprise" tiers elsewhere.

Beauty and Personal Services

Salons and spas operate on complex scheduling mathematics: color appointments need buffer time, multiple providers might serve one client, and walk-in management conflicts with bookings. The system's rule engine accommodates these constraints without the $200+/month pricing that dedicated salon software commands.


Step-by-Step Installation & Setup Guide

Ready to deploy? Here's the complete technical walkthrough:

Server Prerequisites

Your server needs:

  • Apache or Nginx web server
  • PHP 8.2 or higher (with mysqli, gd, and curl extensions)
  • MySQL↗ Bright Coding Blog 5.7+ or MariaDB 10.3+
  • SSL certificate (Let's Encrypt works perfectly)

Development Environment Setup

For local development or customization, you'll need Git, Node.js (with npm), and Composer:

# Clone the repository from GitHub
$ git clone https://github.com/alextselegidis/easyappointments.git

# Navigate into the project directory
$ cd easyappointments

# Install JavaScript↗ Bright Coding Blog dependencies (build tools, frontend libraries)
$ npm install

# Install PHP dependencies (framework components, utilities)
$ composer install

# Start the development file watcher for live rebuilding
$ npm start

Critical note for Windows developers: If using Linux Bash for Windows, graphical applications require special configuration. Reference this guide or execute node commands from standard Windows command prompt instead.

For production builds, bundle everything into an optimized directory:

# Create production-ready build in /build directory
$ npm run build

Production Server Installation

  1. Database preparation:

    CREATE DATABASE easyappointments CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'ea_user'@'localhost' IDENTIFIED BY 'your_secure_password';
    GRANT ALL PRIVILEGES ON easyappointments.* TO 'ea_user'@'localhost';
    FLUSH PRIVILEGES;
    
  2. File deployment:

    • Copy the easyappointments source folder to your web root
    • Ensure the storage directory is writable by the web server process:
      chmod -R 755 storage/
      chown -R www-data:www-data storage/
      
  3. Configuration:

    • Rename config-sample.php to config.php
    • Edit database credentials, base URL, and encryption key:
      // Core configuration values
      $config['base_url'] = 'https://appointments.yourdomain.com';
      $config['language'] = 'english';
      
      // Database connection parameters
      $config['db_host'] = 'localhost';
      $config['db_name'] = 'easyappointments';
      $config['db_username'] = 'ea_user';
      $config['db_password'] = 'your_secure_password';
      
  4. Web server configuration (Nginx example):

    server {
        listen 443 ssl http2;
        server_name appointments.yourdomain.com;
        root /var/www/easyappointments;
        index index.php;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    
        # Protect sensitive directories
        location ~ /(storage|config|\.git) {
            deny all;
            return 403;
        }
    }
    
  5. Browser installation: Navigate to your configured URL and follow the web-based installation wizard. This creates database tables and establishes the administrator account.


REAL Code Examples from the Repository

Let's examine actual implementation patterns from the Easy!Appointments codebase and documentation:

Example 1: Development Environment Bootstrap

The repository's documented setup procedure reveals modern tooling integration:

# Clone this repository - obtains latest source including build configuration
$ git clone https://github.com/alextselegidis/easyappointments.git

# Go into the repository - context for subsequent commands
$ cd easyappointments

# Install dependencies - dual ecosystem: Node.js for frontend asset pipeline,
# Composer for PHP backend dependencies and autoloading
$ npm install && composer install

# Start the file watcher - enables live reload during theme/customization development
$ npm start

What's happening here? The && operator ensures sequential execution—Composer won't run if npm fails. This dual-package approach is architecturally significant: npm handles Sass compilation, JavaScript bundling, and asset optimization, while Composer manages PHP's PSR-4 autoloading, database abstraction layers, and utility libraries. The npm start command typically invokes Webpack or similar tooling with --watch flag, rebuilding frontend assets on file changes. For production deployments, you'd use npm run build instead, which triggers minification, tree-shaking, and cache-busting filename generation.

Example 2: Production Build Pipeline

# Build command for deployment artifacts
$ npm run build

Deep dive: This single command encapsulates significant complexity. In modern PHP applications, the build process typically: compiles SCSS to optimized CSS, transpiles ES6+ JavaScript for browser compatibility, copies static assets to versioned directories, and potentially generates service worker code for offline functionality. The output build/ directory contains everything needed for deployment—no Node.js runtime required on production servers. This separation of build-time and runtime dependencies is crucial for security: your production server doesn't need npm, reducing attack surface dramatically.

Example 3: Configuration Architecture

The config-sample.php to config.php pattern deserves attention:

// After renaming from config-sample.php, critical values include:
// - BASE_URL: Ensures generated links and redirects function correctly
// - Database credentials: Uses mysqli extension with prepared statements
// - Encryption key: Powers session security and sensitive data handling
// - Language default: Sets fallback for i18n system

Implementation insight: This configuration approach—separating sample from active config—prevents credential leaks in version control. The .gitignore (implied by convention) excludes config.php, so your production credentials never appear in git log. The PHP array structure enables runtime configuration merging: default values in the framework layer can be overridden without modifying core files. This is essential for upgrade safety—when you pull new versions via git pull, your configuration persists untouched.

Example 4: Storage Directory Permissions

While not explicitly coded, the README's instruction—"Make sure that the 'storage' directory is writable"—implies specific implementation:

# Typical production permission setup for storage directory
# 755: Owner read/write/execute, group/others read/execute
# www-data ownership: Web server process can write logs, uploads, cache
chmod -R 755 storage/
chown -R www-data:www-data storage/

Security consideration: The storage directory handles multiple concerns: application logs, user-uploaded files (profile images, attachments), cached views, and session data if file-based. The 755 permission (not 777!) follows principle of least privilege. For hardened deployments, consider 750 with specific group membership, or use ACLs (setfacl) for finer-grained control. The recursive flag ensures subdirectories inherit permissions—critical since Easy!Appointments likely creates date-organized subdirectories for uploads.

Example 5: Web-Based Installation Wizard

The final step—"Open the browser on the Easy!Appointments URL and follow the installation guide"—represents a sophisticated deployment pattern:

// Conceptual implementation of installation controller
// Detects fresh installation via database table existence check
// Presents multi-step wizard: database verification, admin account creation,
// timezone configuration, initial service/provider setup
// Generates .env or writes to config.php with confirmed working values

Why this matters: The wizard pattern eliminates manual SQL imports and reduces deployment errors. It performs live database connectivity tests, validates password strength, and can rollback partial installations. For developers customizing Easy!Appointments, studying the installation controller provides insight into the database schema and initialization sequences—knowledge essential for writing migrations or extending functionality.


Advanced Usage & Best Practices

Database Optimization for Scale: Once you exceed ~10,000 monthly appointments, add indexes on frequently queried columns: appointments.start_datetime, appointments.id_users_provider, and appointments.id_services. Monitor slow query logs and consider read replicas if reporting queries impact booking performance.

Google Calendar Sync Reliability: The OAuth tokens expire. Implement token refresh automation and monitor sync health via webhook logs. For critical operations, maintain the Easy!Appointments database as source of truth—Google Calendar as display layer, not authoritative record.

Security Hardening: Beyond the documented directory protection, enforce:

  • CSP headers preventing XSS in booking forms
  • Rate limiting on authentication endpoints
  • Automated security updates for PHP and MySQL
  • Database encryption at rest for PII fields

Theming and White-Label: The Node.js build system supports custom themes. Override Sass variables before npm run build to match client branding without touching core templates—preserving upgrade compatibility.

Backup Strategy: Your self-hosted advantage becomes liability without backups. Automate daily database dumps and file storage replication. Test restoration quarterly; appointment data loss destroys business credibility permanently.


Comparison with Alternatives

Feature Easy!Appointments Calendly Acuity Scheduling Self-Built
Monthly Cost Free (hosting only) $8–$16/seat $16–$61/seat High dev cost
Data Ownership Complete Vendor-locked Vendor-locked Complete
Custom Branding Full control Limited tiers Limited tiers Unlimited
Google Calendar Two-way sync One-way Two-way Build yourself
Self-Hosted ✅ Native
Source Code Access Full (GPL) None None Your own
Setup Complexity Moderate None None High
Community Support Active Discord Tickets only Tickets only None
Multi-Provider Built-in Team tier Emerging Build yourself
API/Integration Direct database + hooks REST API REST API Unlimited

When to choose Easy!Appointments: You value data sovereignty, have basic server administration capability, want predictable costs, or need deep customization. When to choose SaaS: Zero technical resources, immediate deployment requirement, or need for native mobile apps (though responsive web covers most scenarios).


FAQ: Common Developer Concerns

Is Easy!Appointments truly free for commercial use? Absolutely. The GPL v3.0 license permits commercial deployment, modification, and even redistribution. Your obligations are limited to providing source code if you distribute modified versions—not required for typical SaaS-style usage where users interact via web interface.

What hosting requirements are realistic for production? Any VPS with 1GB RAM handles small-to-medium operations comfortably. For high volume, scale vertically first (2–4GB RAM, SSD storage), then consider database separation. Shared hosting works for low-volume scenarios if PHP 8.2+ is available.

How does Google Calendar synchronization actually work? OAuth 2.0 authentication grants the application permission to create, read, and update events in specified Google Calendars. Changes propagate bidirectionally: new bookings in Easy!Appointments appear instantly in Google Calendar, and modifications in Google Calendar update the local database via webhook or polling mechanisms.

Can I integrate with my existing website or CRM? Yes. The PHP codebase exposes hooks and follows MVC patterns that enable custom integrations. For modern architectures, wrap database operations in API endpoints that your frontend or CRM consumes. The project's clean separation of concerns facilitates this extension.

What happens if I need features not in the core? The active community and plugin-friendly architecture support extensions. For critical needs, the PHP codebase is accessible and well-structured for professional modification. Many developers maintain private forks with custom business logic.

Is the project actively maintained? Verified by GitHub activity metrics: regular releases, responsive issue closure, and Discord community engagement. Alex Tselegidis's ongoing project portfolio indicates sustained commitment to the ecosystem.

How do I handle updates safely? Use Git for version control. Maintain config.php outside version tracking. Test updates in staging environment. The build process (npm run build) ensures frontend assets match backend expectations post-update.


Conclusion: Reclaim Your Scheduling Infrastructure

Easy!Appointments represents something increasingly rare: genuinely free software that competes with paid alternatives on features while exceeding them on freedom. In an era of subscription fatigue and data exploitation, the ability to own your appointment scheduling infrastructure isn't nostalgic idealism—it's competitive advantage.

The technical architecture respects modern development practices without abandoning deployability. The feature set handles real business complexity. And the community provides support that rivals commercial alternatives.

My assessment? For any developer or technical decision-maker evaluating scheduling solutions, Easy!Appointments deserves primary consideration. The 30-minute setup investment pays dividends in perpetuity: no recurring fees, no data anxiety, no feature deprecation surprises.

Your next step is simple. Visit the official repository at https://github.com/alextselegidis/easyappointments, clone the code, and experience what self-hosted scheduling should feel like. Join the Discord community. Contribute issues or improvements. Most importantly: stop renting what you can own.

The future of business infrastructure is self-hosted, open-source, and developer-controlled. Easy!Appointments puts that future within immediate reach.


Found this guide valuable? Star the repository, share with fellow developers battling SaaS costs, and explore Alex Tselegidis's complementary projects including Plainpad for note-taking and Questionful for web questionnaires.

Comments (0)

Comments are moderated before appearing.

No comments yet. Be the first to share your thoughts!