# Easy!Appointments

Self-hosted appointment booking for providers and services with a Builder-published REST API and OpenAPI file.

Easy!Appointments is a PHP booking system: services, providers with working plans and booking rules, customers, a public booking page, Google Calendar sync and email notifications. The Builder documents a REST API (docs/rest-api.md, openapi.yml) covering appointments, availabilities, customers, services, providers, secretaries, admins and settings. Configuration is a single config.php; premium services and white-label licenses are sold separately.

Alternative to: Calendly, Acuity Scheduling, SimplyBook.me

- Capabilities: adaptable, operable
- Vertical: scheduling-staffing
- Shape: business-app
- Form factor: web-app
- Execution model: deterministic
- Provenance: human-written (recorded, never ranked)
- Repo: https://github.com/alextselegidis/easyappointments (GPL-3.0), 4351 stars, last commit 2026-09-02
- Last activity: 2026-09-02
- Page: apps/alextselegidis--easyappointments.html
- JSON: apps/alextselegidis--easyappointments.json

## Use it when

- my clinic or salon needs a booking page per provider with working hours and services, on ordinary PHP hosting
- I want my agent to check availability and book clients into staff calendars through a plain REST API

## Gotchas

- GPL-3.0 copyleft; removing branding for resale is a separate white-label license on easyappointments.org/premium
- API auth is admin basic auth or an API key set in Settings; the docs insist on HTTPS
- Named repeatedly as the fallback in the April 2026 'Cal.com is going closed source' thread, so expect issue traffic from migrating users

## Editions

- Free: Free, open source
  - source: https://github.com/alextselegidis/easyappointments
  - container: docker compose up
- Premium services and white-label licenses: Free, closed source
  - hosted: https://easyappointments.org/premium

## Adaptable: make it yours

Effort: config-only (13 things to edit)

Rename config-sample.php to config.php and set BASE_URL, LANGUAGE, DB_HOST, DB_NAME, DB_USERNAME and DB_PASSWORD; enable GOOGLE_SYNC_FEATURE with GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET if providers sync calendars. The Docker image takes the same names as environment variables (docs/docker.md). Services, providers, working plans, booking rules and email settings are set in the backend after the setup wizard.

- Env vars: BASE_URL, LANGUAGE, DEBUG_MODE, DB_HOST, DB_NAME, DB_USERNAME, DB_PASSWORD, GOOGLE_SYNC_FEATURE, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET
- Config files: config-sample.php, config.php, docker-compose.yml
- Prompt files: none
- Accounts you'll need: Google Cloud (calendar sync, optional)

## Operable: what an agent can drive

Operability: official. Interface: api at https://github.com/alextselegidis/easyappointments/blob/master/docs/rest-api.md (published by the builder, both).

### Reach (partial coverage)

- Book, move and cancel appointments: reachable. docs/rest-api.md: GET/POST/PUT/DELETE /api/v1/appointments
- Find open slots for a provider and service: reachable. GET /api/v1/availabilities?providerId&serviceId&date
- Manage customers: reachable. Customers resource in docs/rest-api.md
- Manage services and categories: reachable. Services and Service Categories resources
- Manage providers, secretaries and admins: reachable. Providers, Secretaries and Admins resources
- Block time off (unavailabilities): reachable. Unavailabilities resource
- Read and change system settings: reachable. Settings resource
- Sync a provider with Google Calendar: not reachable. OAuth consent is done by the provider in the backend UI; no sync endpoint in the API
- Send booking notification emails: undetermined. emails are sent by the app on booking events; not stated whether API-created appointments trigger them

## Code stack

- Languages: PHP, JavaScript
- Frameworks: CodeIgniter
- Package manager: composer
- Database: MySQL
- Hosting target: apache, nginx, docker

## Evidence and confidence

- formFactor: README: self-hosted PHP web application, Apache or Nginx, MySQL (confidence 0.95)
- executionModel: no model SDK or AI feature (confidence 0.95)
- operability: docs/rest-api.md and openapi.yml in the Builder's repo; bearer API key or basic auth (confidence 0.95)
- effort: config-sample.php constants read this run; docs/docker.md maps the same names to environment variables (confidence 0.9)
- editions: README: GPL v3 code, free for commercial use; easyappointments.org/premium lists paid services with quotes, no list prices (confidence 0.8)
- active: shortlist pushedAt 2026-09-02
- reach:  (confidence 0.85)

## Open questions

- Do API-created appointments trigger customer and provider notification emails?
- Does the providers resource expose the working plan and booking rules for editing?

## Sources

- https://github.com/alextselegidis/easyappointments (sourcing:scheduling-staffing:community)
- https://news.ycombinator.com/item?id=47780456 (sourcing:scheduling-staffing:community)
- https://github.com/alextselegidis/easyappointments/blob/master/docs/rest-api.md (analysis:scheduling-staffing)
- https://easyappointments.org/premium (analysis:scheduling-staffing)
