Turns a calendar into a booking page. It reads your availability, applies rules about notice, buffers and daily limits, and lets someone pick a slot without the back and forth — then writes the meeting to both calendars and sends the reminders.
Build me a booking page that replaces Calendly — and know why the verdict is ALMOST rather than YES. The page is straightforward. The two halves that are not: **calendar synchronisation**, where recurring events with exceptions, all-day blocks and each provider's quirks will consume most of the project, and **time zones**, where homemade schedulers reliably fail. Get both right and this is genuinely yours; get either wrong and you will double-book somebody. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode - Caddy in front THE DATA MODEL - users: id, name, slug, email, timezone - event_types: id, user_id, slug, title, description_md, duration_minutes, buffer_before, buffer_after, min_notice_minutes, max_days_ahead, max_per_day, location_kind, location_value, requires_confirmation, is_active - schedules and availability_rules: weekday, start_local, end_local, with a named zone - date_overrides: id, user_id, date, is_unavailable, start_local, end_local - bookings: id, event_type_id, uid, starts_at_utc, ends_at_utc, attendee_name, attendee_email, attendee_timezone, answers_json, status, cancel_token, reschedule_token, external_event_id, created_at - calendar_connections: id, user_id, provider, credentials_encrypted, calendar_ids_json, write_calendar_id, sync_token, last_synced_at - busy_blocks: id, connection_id, starts_at_utc, ends_at_utc, source_event_id, fetched_at — intervals only, never the event details. The organiser's meeting titles are none of this tool's business TIME, WHERE THIS GOES WRONG - Every instant in UTC. Availability rules as local times with a named zone, because 09:00 in Europe/Rome is a different instant in July and in January - A real time zone library and the IANA database. Never an offset - The test suite includes a spring-forward day, an autumn-back day, and a zone whose rules changed - The attendee sees their own zone with the organiser's beside it - All-day and multi-day concepts are dates, not midnight instants CALENDARS, WHERE THE TIME GOES - Two-way with the major providers, read-only ICS for anything else - Incremental sync with the provider's sync token, plus a full reconcile on a schedule, because incremental sync drifts - Recurring events expanded properly — recurrence rules with exceptions and moved instances are what break naive implementations, and a wrongly expanded weekly meeting means double bookings for a year - All-day events are dates in the calendar's own zone and must not be treated as 00:00 to 00:00 UTC - Declined and tentative events: decide whether they block, per connection, and say so - Write the booking to a chosen calendar with the attendee invited, and update or delete it when the booking changes SLOT GENERATION - One pure function: rules minus busy blocks minus existing bookings with buffers, then notice, horizon and daily cap, rounded to an increment. No database access inside it, tested heavily - A hold while the form is filled, released after a few minutes; the final insert re-checks availability inside the transaction. The hold is a courtesy, the transaction is the guarantee BOOKING - Pick a day, pick a slot, answer the questions, confirm. No account, ever - Optional confirmation by the organiser, with approve and decline - Cancel and reschedule from long random tokens in the email - Confirmation to both sides with an ICS attachment and hand-built add-to-calendar links, reminders at configured offsets, each recorded so nobody is reminded twice OPERATIONS - .env: DATABASE_PATH, BASE_URL, ENCRYPTION_KEY, SESSION_SECRET, SMTP_URL, provider client ids and secrets - Migrations on boot, each once; nightly backup off the machine, restore script - Health endpoint that generates tomorrow's slots and reports sync age per connection WHAT MATTERS MOST Recurrence expansion and the booking transaction. Write the time zone tests before the interface exists, then have two browsers book the same slot at once and confirm exactly one succeeds.
What you lose
- Calendar synchronisation that already handles Google, Microsoft and CalDAV quirks, including recurring events and all-day blocks
- Timezone and daylight-saving correctness, which is where home-built schedulers quietly fail
- Reminder emails and SMS that actually arrive, including reschedule and cancellation flows
- Round-robin, collective availability and buffer rules across a team
- Payment collection at booking time, and the no-show handling built around it
If you would rather not build
- SavvyCal — paid alternative with a different availability model
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| Standard Plan (USD) | $10/mo | — | 15 Aug 2026 |
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
58/100
Verdict kinda at 58: a single-person booking page is a weekend of work, but timezone and DST correctness is where these builds break, and reminder deliverability is a second project. Team round-robin scheduling is well beyond one session.
History
tracked since 6 Aug 2026 · nothing is ever overwritten
Questions about Calendly
answered from the record above
Is Calendly free?
No — the plan we track is $10 a month. Standard, $10 per seat per month billed annually; month-to-month billing is higher. Teams is $16 per seat per month billed annually.
Can you replace Calendly by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 58 out of 100, build time a weekend. Read what you lose before you decide.
How much does Calendly cost?
$10 a month on Standard — $120 a year. Recorded 6 Aug 2026.
What do you lose by replacing Calendly?
Calendar synchronisation that already handles Google, Microsoft and CalDAV quirks, including recurring events and all-day blocks; Timezone and daylight-saving correctness, which is where home-built schedulers quietly fail; Reminder emails and SMS that actually arrive, including reschedule and cancellation flows; Round-robin, collective availability and buffer rules across a team; Payment collection at booking time, and the no-show handling built around it. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Calendly?
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

