How I built an appointment-booking system for free
Calendar, forms, and email working together for Northwind — replaced Calendly with 80 lines of script.
By Awadesh Madhogaria · Published Aug 29, 2025
Northwind paid for a Calendly seat to do one thing: let people book a slot. It worked fine — it just did far more than we needed, for a recurring fee.
There was nothing wrong with Calendly itself. The mismatch was scope. We used maybe a fifth of what it offered, and it was another login, another integration, and another monthly line item. The booking logic underneath all of that was genuinely simple: pick a slot, confirm it. When the thing you are paying for is mostly features you ignore, it is worth checking how small the core job actually is.
In our case the core job was about 80 lines of script away, built from Calendar, Forms, and Gmail — tools we already owned.
How the booking flow works
The system is a self-service flow stitched together from those three tools, and it runs end to end without anyone touching it:
- A visitor opens a public form that lists open slots.
- They pick one and submit the form.
onFormSubmitfires immediately, creating a Calendar event so the slot is real and visible to the team, and emailing the visitor a confirmation with an ICS attachment.- The script removes the booked slot from the list the form draws from.
The clever part is that last step. The form only ever shows slots the script has not already marked as taken, so two people cannot grab the same time and nobody sees a slot that has already gone. That keeps the form honest about what is genuinely still free. If you want the full build, I walk through it in Build a self-service booking web app.
What I cut, and what I kept
The savings came from being ruthless about scope. I dropped the pretty UI, because a plain form does the job; I dropped configurable buffer times and hardcoded them instead; and I dropped integrations with everything, because we did not need a single one.
What I kept were the parts that actually mattered: slot availability that stays accurate, an email confirmation, and an ICS attachment so the booking lands in the visitor’s own calendar. That is the whole system — no new accounts, no subscription.
The result was one recurring subscription gone, replaced by roughly 80 lines of script, with one fewer login and one fewer integration to maintain. Before renewing any subscription, it is worth asking how much of it you actually use. If the honest answer is “the simple bit”, that simple bit is often a short script away.