If you only need people to book a time with you, you might not need to pay for Calendly. Google Calendar has a free booking page, Microsoft Bookings comes with most Microsoft 365 business plans, and Cal.com has a free plan. Build your own only when none of them fits the way you work. We did, and it costs us nothing extra to run.
Since 1 October, the free intro call on this website runs on our own booking page instead of Cal.com. Here are the free options I'd check first, then what we built, how it works, and when building is worth the effort.
Check what you already pay for
Google Calendar appointment schedules. Built into Google Calendar, no code. On a free personal Google account you get one booking page. A paid Google Workspace or Google One plan adds more booking pages, email reminders and checking your availability across several calendars. Payments and email verification for bookings need a Workspace plan.
Microsoft Bookings. If your business runs on Microsoft 365, look here first. Bookings is included in the Business Basic, Standard and Premium plans, so you may already be paying for it.
Cal.com. A free plan for individuals, and the code is open source, so a developer can run it on your own server.
Calendly has a free plan too, limited to one type of meeting, with paid plans charged per person, per month. It's a good product. It's just not the only way to do this.
Why we built our own
Our intro calls are taken by two people in two time zones: me in Melbourne, 10am to 4pm, and Abraham in Kampala, 9am to 5pm. Our page shows both our open times and sends each booking to whoever is working at that hour. It also keeps every booking in our own calendars, with no third-party branding.
We already had the pieces. The website has a small server, and we pay for Google Workspace. Building it took about two hours with Claude Code, tests included.
How it works
Google Calendar is the database. That's the idea that keeps it simple. Our open times are read from the calendar, a booking is an event on the calendar, and Google sends the invitations, reminders and updates. There's no booking database to look after and no email service for confirmations.
Here is what the visitor sees. Open 30-minute slots for the next four weeks, in their own time zone. They pick one, enter their name, email and an optional note, and get a normal Google Calendar invitation with a Google Meet link. The invitation has a private link to reschedule or cancel, and using it updates the invitation for both sides.
Behind that, the server does five things:
- Acts as the host. It asks Google for a one-hour pass to act for the person taking the call. That's what lets the invitation come from a real person, with a Meet link attached.
- Finds open times. It asks Google which times are taken, then offers every 30-minute slot in working hours that's free, with 15 minutes either side, at least 24 hours away and within four weeks. Daylight saving is handled by the time-zone rules, not fixed offsets.
- Books without double-booking. When someone books, it checks the calendar again, so two people can't take the same slot.
- Reschedules without a database. The link in the invitation carries the booking's reference and a signature only our server can make. Moving the booking updates the same event, and cancelling deletes it. If the new time is with the other person, it sends a new invitation from them and cancels the first.
- Stays safe. An invisible bot check on every booking, a limit of ten attempts a minute per visitor, and no personal details in our logs. Its calendar access is limited to two things, reading free and busy times and managing events, and it only touches events it created.
The setup, if you have a developer
This part takes about 15 minutes in Google's consoles, done once.
- In Google Cloud, create a project and turn on the Google Calendar API.
- Create a service account, a login for the server rather than a person, and download its key. Newer Google Cloud organisations block key downloads by default, so a super admin may need to allow it for that one project.
- In the Google Workspace admin console, under Security, API controls, Domain-wide delegation, let that service account act for people in your domain, limited to two permissions: read free/busy times, and manage calendar events. No email, no Drive, no contacts.
- Store the key on the server as a secret, never in the code, plus a second random secret for signing the reschedule links.
- Create a free Cloudflare Turnstile widget for the bot check and add its two keys.
The trade-offs
It needs Google Workspace, not a personal Gmail. The "act as the host" step only exists in Workspace. With a personal account it can be done with a one-time sign-in instead, but that sign-in can expire and quietly break the page.
It needs a developer, to build it and to fix it when Google changes something. That's what Calendly and Cal.com sell: not having to think about it.
It does one job. No payments, routing forms or analytics. We only needed one free call type, so our paid sessions still use Cal.com's free plan.
Your bookings live in Google Workspace. Our Privacy Policy says so, and that a call may be with a team member in Uganda. If you build your own, update yours.
Which one to pick
- One person, Google account: start with Google Calendar appointment schedules. It's free and takes a few minutes to set up.
- Your business runs on Microsoft 365: check Microsoft Bookings before you buy anything.
- You need more than one meeting type, free: Cal.com's free plan.
- Build your own when you already have a website with a server and someone to maintain it, or you need rules a booking tool won't do, like two people across time zones.
If you want to see ours working, book a free intro call. It's the same page I've described here.