Unlimited event types, reminders, and your own brand — free.
Everything Calendly’s free plan gates, unlocked — with no per-seat tax, ever. And the part no other free scheduler can promise: every slot you offer is genuinely bookable, guaranteed by the database, not by hope. You can check it yourself.
Calendly’s free plan gates the basics. Ours ships them.
No per-seat tax, no “Powered by” badge, no reminder paywall. The differences that matter most — the rest are on the full comparison.
| On the free plan | Calendly Free | OpenMeet Free |
|---|---|---|
| Event types | 1 | Unlimited |
| Email reminders | — | Included |
| No “Powered by” branding on your booking page | — | Free, forever |
And on every OpenMeet plan, a database constraint makes double-booking physically impossible, and each confirmation is read back on your calendar before it says “confirmed.” See how it’s proven.
Calendly Free-plan limits checked against calendly.com/pricing on 21 Jul 2026 — plans change, so it’s worth a look for yourself.
Not a promise. A mechanism.
A database constraint, not a retry
Two bookings for the same host and time physically cannot both commit — Postgres rejects the collision at the source. Not application code hoping to catch it in time.
Timezone locked before you book
Detected, shown, and yours to change — confirmed before anything commits. Never a silent UTC guess that lands the call at 3am.
Read back before it says confirmed
The calendar write and the email commit atomically, and the event is read back before you ever see “confirmed.” No “accepted but never synced.”
Two people, one slot. Watch one get turned away.
Two people click the same time at the same instant. Watch one win and one get turned away — decided by the database, not by luck.
migrations/0000_init.sql:ALTER TABLE bookings ADD CONSTRAINT bookings_no_overlap
EXCLUDE USING gist (
assigned_host_id WITH =,
time_range WITH &&
) WHERE (status IN ('held', 'confirmed'));Reproduce the real race against Postgres
RUN_DB_TESTS=1 pnpm test: tests/integration/booking.int.test.ts fires two real commits at one slot and asserts exactly one wins.