8 min read

Self-Host Cal.com: Your Own Free Calendly Alternative

Deploy Cal.com with Docker and reach your booking page from a permanent domain with Localtonet. No monthly fee, no per-seat pricing, your data

Cal.com ยท Scheduling ยท Self-Host ยท Calendly Alternative ยท 2026

Calendly's free tier caps you at one event type and locks routing forms, round-robin assignment, and workflow automation behind a paid plan that scales with every teammate you add. Cal.com is the open-source scheduling platform the same booking-link idea was built on, with over 40,000 GitHub stars, no per-seat fee, and full control over your own booking data. The one thing that trips up most self-hosted setups is a single encryption key that permanently breaks every calendar connection if you get it wrong. This guide covers installing Cal.com with Docker, avoiding that mistake, and putting it on a real domain with Localtonet.

Unlimited event types, no per-seat pricing Open source, AGPLv3, 40,000+ GitHub stars Your own booking domain via Localtonet

Why Pay Monthly for a Booking Link

A booking page is not a complicated piece of software: check your calendar, offer open slots, confirm the meeting. Calendly turned that into a subscription business by gating round-robin assignment, routing forms, and workflow reminders behind paid tiers that get more expensive per teammate you add.

Cal.com, launched in 2021 as Calendso and rebranded in 2022, is the open-source implementation of that same idea, with those exact features included, because there is no seat count to monetize when you run it yourself.

The booking link works the same for the person scheduling with you, only the monthly bill disappears.

What Is Cal.com?

Cal.com is an open-source scheduling platform under the AGPLv3 license, built with Next.js and PostgreSQL. It handles the entire booking flow: connecting your calendar, publishing available time slots, and confirming meetings, without a third party sitting in the middle of your calendar data.

๐Ÿ“… Every event type Calendly offers One-on-one, group, round-robin, and collective scheduling where every team member needs to be present, all included with no plan upgrade.
๐Ÿ”€ Routing forms Ask a few questions before someone books, then route them to the right team member or event type automatically.
๐Ÿ”„ Calendar sync that actually prevents double-booking Google Calendar, Outlook, and CalDAV connections keep your real availability in sync in both directions.
๐Ÿ’ณ Stripe payments and automated workflows Charge for consultations directly at booking time, and send automated reminder or follow-up emails without a separate tool.
Check your resources before you start

Cal.com is a Next.js application backed by PostgreSQL. Plan for around 4GB of RAM for a comfortable single-instance deployment, Docker and Docker Compose installed, and a domain you intend to keep, calendar OAuth connections are tied to it.

Install Cal.com With Docker Compose

1

Generate your secrets

Terminal
openssl rand -base64 32   # NEXTAUTH_SECRET
openssl rand -base64 24   # CALENDSO_ENCRYPTION_KEY
2

Clone the official Docker repository and configure .env

Terminal
git clone https://github.com/calcom/docker calcom-docker
cd calcom-docker
cp .env.example .env
3

Fill in the required variables

.env
NEXTAUTH_SECRET=your_generated_secret
CALENDSO_ENCRYPTION_KEY=your_generated_key
DATABASE_URL=postgresql://unicorn_user:magical_password@database:5432/calendso
NEXT_PUBLIC_WEBAPP_URL=https://cal.example.com
NEXTAUTH_URL=https://cal.example.com
4

Start the stack

Terminal
docker compose up -d

Cal.com runs its database migrations automatically on first startup. The setup wizard walks you through creating your first user.

โš ๏ธ Most tutorials skip this step: back up CALENDSO_ENCRYPTION_KEY before you connect a single calendar

Every stored credential in Cal.com, Google OAuth tokens, calendar connections, integration secrets, is encrypted with this key. Change or lose it after your first run and none of that data re-encrypts, it becomes permanently unreadable, and every calendar connection breaks for good. Save it somewhere safe the moment you generate it, right alongside your database backups.

Remote Access With Localtonet

Cal.com's own production guides typically call for a local reverse proxy like Caddy just to get HTTPS in front of port 3000. Localtonet already terminates HTTPS on your custom domain, so that extra layer is not needed here.

1

Create an HTTP tunnel

Point it at 127.0.0.1:3000 and map a custom domain, such as cal.example.com.

2

Match NEXT_PUBLIC_WEBAPP_URL and NEXTAUTH_URL exactly

Both need to be the real public HTTPS address, not localhost, or booking confirmation links and login sessions will point to the wrong place.

3

Update your Google or Outlook OAuth redirect URI

Calendar integrations validate the redirect URL against what you registered in the provider's developer console, it needs to match your custom domain, not localhost.

Keep It Running Permanently

Add restart: unless-stopped to every service in your Compose file so the stack survives a Docker restart on its own. To survive a full machine reboot, install the Localtonet client as a background service once with your AuthToken from Dashboard โ†’ My Tokens:

Terminal (Administrator / sudo)
sudo localtonet --install-service --authtoken YOUR_TOKEN
sudo localtonet --start-service --authtoken YOUR_TOKEN

Only tunnels that were in Start state in the dashboard come back automatically, your booking domain included.

Cal.com vs. Calendly

FeatureCalendlySelf-hosted Cal.com
PricingPer-seat, scales with team sizeFree, your own hosting cost only
Routing forms and round-robinPaid tiers onlyIncluded
Where booking data livesCalendly's serversYour own database
Custom branding and domainLimited to higher tiersFully white-label by default
Setup effortNone, sign up and connect a calendarAn evening of Docker and configuration

The honest trade-off: Calendly is genuinely the faster path if you need something running in the next five minutes and do not mind the subscription. Cal.com's advantage shows up the moment you would otherwise be paying for a team plan, at that point the one-time setup cost pays for itself within a couple of months.

๐Ÿ›  Tips for Getting the Most Out of Cal.com

๐Ÿ”€ Build routing forms before you share the link A short qualifying question can route a booking to the right event type automatically instead of you sorting it out after the fact.
๐Ÿ“Œ Pin a specific version tag Use a tag like calcom/cal.com:v3.1.3 instead of latest, so an upgrade is something you choose rather than something that happens on a routine restart.
๐Ÿ’พ Back up the database on a schedule A scheduled pg_dump alongside your saved CALENDSO_ENCRYPTION_KEY covers everything that actually matters if something goes wrong.
๐Ÿ“ง Configure SMTP before your first real booking Confirmation and reminder emails depend on it. Test it during setup, not after someone books a slot and gets nothing.

Troubleshooting Common Issues

SymptomLikely causeFix
Booking links or emails still show localhostNEXT_PUBLIC_WEBAPP_URL or NEXTAUTH_URL was not updatedSet both to the exact https:// custom domain and restart the stack
Google or Outlook calendar connection failsOAuth redirect URI does not match your custom domainUpdate the redirect URI in the provider's developer console to match your Localtonet domain
Every calendar connection breaks after a restartCALENDSO_ENCRYPTION_KEY changed or was regeneratedRestore the original key from backup, there is no way to recover encrypted data with a new one
No confirmation emails arriveSMTP variables are missing or incorrectVerify SMTP_HOST, SMTP_USER, and SMTP_PASS, then send a test booking

Frequently Asked Questions

Is self-hosted Cal.com really free?

Yes, the self-hosted version is open source under AGPLv3 with no per-seat pricing. Your only cost is the hosting it runs on. A small number of enterprise-only features are reserved for Cal.com's paid cloud product, but the core scheduling platform is not gated.

What happens if I lose CALENDSO_ENCRYPTION_KEY?

Every encrypted credential in the database becomes unreadable, including calendar OAuth tokens. You would need to reconnect every calendar integration from scratch. Back the key up the moment you generate it.

Can I use my own domain for booking pages?

Yes, that is the default when self-hosting. Map a Localtonet custom domain to your HTTP tunnel and set NEXT_PUBLIC_WEBAPP_URL to match, booking pages are fully white-label from the start.

Does Cal.com sync with Google Calendar and Outlook?

Yes, Google Calendar, Outlook, and CalDAV connections keep your availability accurate in both directions, so bookings do not collide with events you already have scheduled.

Can I charge for consultations directly through Cal.com?

Yes, Stripe integration lets you collect payment at the moment someone books a paid slot, common for consultants and educators offering office hours.

Does my computer need to stay on for booking pages to work?

Yes, both the Cal.com containers and the Localtonet client need to be running. Setting both up as background services means bookings keep working without manual intervention after a reboot.

Can I set up round-robin scheduling across a small team?

Yes, round-robin and collective event types are included in the self-hosted version, no upgrade required to assign bookings across multiple team members automatically.

Ready to Cancel That Scheduling Subscription?

Deploy Cal.com with Docker, connect your calendar, then put it on a real domain with a Localtonet tunnel. Free to start, no credit card required.

Get Started Free โ†’

Localtonet is a secure multi-protocol tunneling and proxy platform designed to expose localhost, devices, private services, and AI agents to the public internet supporting HTTP/HTTPS tunnels, TCP/UDP forwarding, mobile proxy infrastructure, file server publishing, latency-optimized game connectivity, and developer-ready AI agent endpoint exposure from a single unified control plane.

support