Blog · · 4 min read

How to automate bookings with Google Calendar and n8n (no double-booking)

Build an appointment system with n8n: a form sends the request, it gets validated, Google Calendar is checked and the event is created with confirmation emails, or free times are offered if the slot is taken.

If you run a salon, a clinic, a tutoring business or you sell sessions as a freelancer, you know the dance: a customer asks for an appointment by email or WhatsApp, you check your calendar, suggest a time, they reply three hours later and that slot is gone. Or worse: you book two people at the same time without noticing.

Paid booking tools solve this, but if you already use Google Calendar you can build it yourself with n8n (a visual automation tool) and Gmail, with no per-seat fees and with your own business rules.

What you'll build

Every time someone requests an appointment, the workflow:

  1. Receives the request on an n8n webhook, sent from a form on your website (name, email, phone, service, date, time and notes).
  2. Validates the data: the email looks right, the day is a working day, the time is within opening hours and the booking respects your notice period.
  3. Checks Google Calendar to see whether that slot overlaps with another appointment.
  4. If it's free: creates the event, emails a confirmation to the customer and a notice to you.
  5. If it's busy: replies with up to 3 free times on the same day so the customer can pick another.

One important detail: this workflow uses no AI. It doesn't need to. Bookings are clear rules (hours, duration, slots), so the result is predictable and every booking costs you nothing.

What you need

  • An n8n instance with HTTPS (cloud or self-hosted).
  • Google Calendar OAuth2 and Gmail OAuth2 credentials connected in n8n.
  • A simple form on your website that sends a JSON POST.
  • About 45 minutes and your schedule at hand: opening and closing time, working days and appointment length.

Step 1: put your rules in one place

Before touching any nodes, decide your rules and put them in a settings node at the start of the workflow: business name, email, address, calendar ID (primary for your main calendar), time zone, appointment length, opening hours, working days, minimum notice (say, 2 hours) and how many days ahead people can book. If your hours change tomorrow, you change them there and nowhere else.

Step 2: the form and the webhook

Create a Webhook node that accepts POST and copy its production URL. On your website, the form's submit button sends something like:

{"name":"Ana","email":"ana@mail.com","phone":"+44…","service":"Cleaning","date":"2026-11-03","time":"10:30","notes":""}

Add a hidden honeypot field to the form: people don't see it, bots fill it in, so you can drop those requests.

Step 3: validate before you look at the calendar

A code node checks the request and, if something is wrong, replies with a clear error (HTTP 400) and the list of fields that failed. At a minimum, check:

  • There's a name and a properly formatted email.
  • The date and time exist and the day is a working day.
  • The appointment starts and ends within opening hours.
  • It isn't ten minutes from now or six months away.

Validating first avoids pointless calendar lookups and impossible bookings, like a Sunday at 11 pm.

Step 4: check whether the slot is free

With the Google Calendar node, fetch that day's events and check whether any of them overlaps the requested slot (start time to start time plus duration). Watch the time zone: use the same one in your settings, in n8n and in the calendar, or appointments will shift by an hour or two.

If the slot is taken, the same code node walks through the day in 30-minute steps and returns up to 3 free times. The form shows them to the customer so they can choose another without emailing you.

Step 5: create the event and confirm by email

If the slot is free, create the Google Calendar event with the customer's name, the service and their contact details in the description. Then two Gmail nodes: one sends the confirmation to the customer (date, time, address and how to change the appointment), the other sends you a summary. Finally, the webhook replies ok: true and the form shows the booking-confirmed message.

Test it before showing it to anyone

  1. Request a free slot: the event should appear and both emails should arrive.
  2. Repeat the exact same time: you should get alternatives.
  3. Use a mistyped email or a Sunday: you should see an error message.

Honest limitations

  • Alternatives are same-day only. If the day is full, the customer has to try another date.
  • Near-simultaneous bookings. If two people request the same time within a second, two events could be created, because there's no locking. At low volume it's very rare, but if you get lots of bookings, keep an eye on the calendar.
  • No cancel link. Changes and cancellations are handled by replying to the email.
  • One opening window per day. If you close at lunchtime, add a recurring «Closed» event to the calendar: the workflow treats it as busy.
  • The webhook is public. The honeypot stops many bots; if you still get spam, add header authentication.

Ideas to take it further

  • Different lengths per service (30 minutes for a cleaning, 60 for a first visit).
  • Add the customer as an event guest so Google also sends them its own invitation.
  • Link the form from your AI WhatsApp agent, so anyone asking about appointments gets the booking link straight away.

Shortcut: the ready-made agent

This workflow is one of the eight agents in the AgentKiosk pack: an n8n template ready to import, with all settings in a single node, the validation, the alternative-slot search, the confirmation emails, an HTML form ready to paste into your site and a PDF guide. It has been imported and run end to end in n8n with sample data and simulated services; run your own tests with your calendar before opening it to customers.

Want to start with something free? Download the WhatsApp agent and then read AI automations for small businesses.