Booking for businesses that sell appointments: multiple services and staff, intake forms, deposits taken up front, packages counted down, and reminders sent before the visit.
Build me appointment booking that replaces Acuity: services, staff, deposits, and reminders that actually arrive. The verdict is ALMOST for one reason, so start there: **reminders are the product.** A salon that loses one no-show a week has paid for the subscription. That means SMS, and SMS means a provider, a per-message cost, and in most countries a registered sender identity with an application process. Sort that out before writing a line of code — if you cannot send a text message reliably, the rest of this is a booking form. STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - One payment provider, hosted checkout - An SMS provider, and email as the free fallback - Caddy in front THE DATA MODEL - services: id, name, duration_minutes, padding_before, padding_after, price_cents, deposit_cents, is_active, staff_ids_json, intake_form_id, cancellation_hours, max_per_day - staff: id, name, email, timezone, is_active; staff_schedules and date_overrides, per person - resources: id, name, capacity — a room or a chair, because two staff cannot use one room - appointments: id, service_id, staff_id, resource_id, starts_at_utc, ends_at_utc, client_id, status, price_cents, paid_cents, deposit_ref, answers_json, cancel_token, reschedule_token, created_at, cancelled_at, cancel_reason - clients: id, name, email, phone, notes, no_show_count, created_at - packages: id, client_id, service_id, sessions_total, sessions_used, expires_at, purchase_ref - reminders: id, appointment_id, kind, channel, scheduled_for, sent_at, error — one row per intended message, so nobody is reminded twice and a failure is visible - Every instant UTC; availability as local times with a named zone AVAILABILITY - One pure function: staff schedules minus existing appointments minus padding minus overrides, intersected with resource capacity and the service's own rules. No database access inside it, heavily tested - Daylight saving handled by storing instants and recomputing from named zones, with both transitions in the test suite - A hold while the client fills the form, and the final insert re-checks inside the transaction — the hold is a courtesy, the transaction is the guarantee MONEY - Deposit or full payment at booking through hosted checkout; no card data here - A cancellation window, after which the deposit is kept, stated plainly before booking - Packages counted down as appointments are used, with an expiry - The booking is confirmed only from the verified webhook, never from the browser returning REMINDERS, DONE PROPERLY - Scheduled at fixed offsets — a day before, an hour before — as rows, written when the appointment is created and rewritten if it moves - SMS and email, with SMS the default for the day-before because that is the one that works - A confirmation link in the message, so a client can confirm or cancel with one tap and you learn about the cancellation instead of the empty chair - Never more than two reminders, never after the appointment - Every send recorded with its provider reference, so a client who says they were not told can be answered THE BOOKING PAGE - Service, staff, day, slot, details, pay. No account, ever - Fast on a phone, because that is where it is used - Cancel and reschedule from long random tokens in the confirmation OPERATIONS - .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, SMTP_URL, SMS_PROVIDER_KEY, PROVIDER_KEY, PROVIDER_WEBHOOK_SECRET - Migrations on boot, each once; nightly backup off the machine, restore script - Health endpoint that generates tomorrow's slots and checks both message channels WHAT MATTERS MOST The reminder pipeline and the availability function. Get messages actually arriving and confirm two browsers cannot take one slot. Everything else is forms.
What you lose
- Appointment types with different durations, prices, forms and staff, all bookable from one page
- Payment or deposit taken at booking, with cancellation windows and refund rules
- Packages, memberships and gift certificates counted down across bookings
- Reminder emails and text messages that arrive reliably
- Client records: history, notes and intake forms attached to a person rather than a booking
If you would rather not build
- Squarespace Scheduling — paid, the same product under its owner’s brand
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $20/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Cal.com
$0Scheduling with availability rules, buffers, round-robin and payment steps.
calcom/cal.diyfree · open source
Easy!Appointments
$0Booking system built around services and staff rather than meetings.
alextselegidis/easyappointmentsfree · open source
Why this verdict
our own opinion · changed only by a person
55/100
Verdict kinda at 55: services, staff and slot-holding are a solid weekend, and the prompt handles the two things builds get wrong — holding a slot during checkout and never letting a package go negative. Reliable reminders and the client record over years are what keeps people paying.
History
tracked since 9 Aug 2026 · nothing is ever overwritten
Questions about Acuity Scheduling
answered from the record above
Is Acuity Scheduling free?
No — the plan we track is $20 a month. Emerging at $20/month billed monthly, around $16 annually, for one calendar; more staff calendars cost more.
Can you replace Acuity Scheduling by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 55 out of 100, build time a weekend. Read what you lose before you decide.
How much does Acuity Scheduling cost?
$20 a month on Emerging — $240 a year. Recorded 9 Aug 2026.
What do you lose by replacing Acuity Scheduling?
Appointment types with different durations, prices, forms and staff, all bookable from one page; Payment or deposit taken at booking, with cancellation windows and refund rules; Packages, memberships and gift certificates counted down across bookings; Reminder emails and text messages that arrive reliably; Client records: history, notes and intake forms attached to a person rather than a booking. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Acuity Scheduling?
Yes: Cal.com, Easy!Appointments. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

