● system status: available for new workflows

Project

Agent · booking · live

Booking AI Agent

A fully deployed appointment booking agent that takes a Tally form submission, checks real availability on Google Calendar, books the slot or asks AI to propose alternatives when it's taken, logs every attempt to Google Sheets, and sends a confirmation email — all without any manual work. Built with Make.com, Tally, Google Calendar, Google Sheets, Google Gemini AI, and Gmail.

← back to projects
Live — Automated Appointment Booking Pipeline
Type: AI Agent + Calendar Booking + Conflict Resolution Tools: Make.com · Tally · Google Calendar · Google Sheets · Google Gemini AI · Gmail Steps: 11 Platform: Tally Form → Make.com Status: Live · Fully Deployed
✓ Fully deployed end-to-end. Every booking request submitted through the Tally form is checked against real calendar availability, automatically confirmed or handled with an AI-generated response, logged to Google Sheets, and followed up by email — 24/7, zero manual work.

// overview

A complete appointment booking agent built on Make.com. Instead of manually checking a calendar and replying to every booking request by hand, this agent handles the entire flow the moment someone submits the Tally form.

The agent checks the requested date and time against existing Google Calendar events. If the slot is free, it books the event, logs the confirmed appointment to Google Sheets, and sends a confirmation email automatically. If the slot is already taken, it pulls the conflicting events, hands that context to Google Gemini AI, and lets the AI write a natural response — logging that attempt separately and emailing the user back.

Zero manual scheduling. Zero double-bookings. 24/7.

// system diagram

TRIGGER 1. Tally — Watch New Responses NORMALIZE 2. Set Variable — clean date+time AVAILABILITY 3. Google Calendar — Search Events DECISION 4. Router — Slot Free / Slot Taken SLOT FREE SLOT TAKEN 5a. Google Calendar — Create Event 6a. Google Sheets — Log (Confirmed) 7a. Gmail — Send Confirmation 5b. Google Calendar — Search Conflicts 6b. Google Gemini AI — Generate Reply 7b. Google Sheets — Log (Conflict) 8b. Gmail — Send AI Response LEGEND Slot free — auto-book path Slot taken — AI reply path

// proof of work — live scenario

This is the actual Make.com scenario running live. Every module visible here is active and deployed.

Live Make.com scenario — Booking AI Agent full pipeline

// live scenario — Tally trigger → set variable → Google Calendar search → router → create event / AI conflict path → Google Sheets → Gmail

// screenshots

Confirmation email sent to the user with clean formatted date
// automated confirmation email — clean, human-readable date after the formatting fix
Google Sheets log showing clean plain-text date and Confirmed status
// Google Sheets log — plain-text date, Confirmed status, written by the pipeline

// step breakdown

#StepToolStatus
1 User submits a booking request through the Tally form — name, email, requested date/time Tally ✓ Live
2 Set Variable normalizes the submitted date/time into a single clean date+time value used by every downstream step Make.com — Set Variable ✓ Live
3 Google Calendar is queried to check whether the requested slot is already booked Google Calendar — Search Events ✓ Live
4 Router splits the flow based on availability — Slot Free or Slot Taken Make.com Router ✓ Live
5a Slot free: event is created directly on the calendar Google Calendar — Create Event ✓ Live
6a Confirmed booking logged to Google Sheets — name, email, formatted date, Status = Confirmed Google Sheets — Add a Row ✓ Live
7a Confirmation email sent automatically with a human-readable date Gmail — Send an Email ✓ Live
5b Slot taken: conflicting calendar events for that window are pulled Google Calendar — Search Events ✓ Live
6b Gemini reads the conflicting events directly and generates a natural reply, e.g. proposing alternative times Google Gemini AI ✓ Live
7b Attempt logged separately to Google Sheets with a distinct status Google Sheets — Add a Row ✓ Live
8b Gemini's generated response is emailed back to the user Gmail — Send an Email ✓ Live

// current status

✓ Fully Working

  • Real-time availability check against Google Calendar
  • Auto-books confirmed slots — no double-bookings
  • AI-generated replies when a slot is taken
  • Every attempt logged to Google Sheets
  • Confirmation and follow-up emails sent automatically
  • Zero manual scheduling

✓ Full Pipeline Live

  • Tally form trigger — live
  • Date/time normalization — live
  • Conflict detection and AI reply path — live
  • Google Sheets logging on both paths — live
  • Gmail notifications on both paths — live
  • End-to-end automated

// build story — the date formatting bug

The workflow logic worked on the first pass. What didn't work — for a while — was something much smaller and much more annoying: getting a date to display the same clean way in every place it showed up.

First symptom

Clean date in Make, raw ISO in Google Sheets

The Set Variable step showed a perfectly readable date — "July 24, 2026 1:00 PM" — in Make's own execution log. But the Google Sheets row it fed into showed a raw ISO timestamp like 2026-07-12T02:00:00.000Z instead.

First wrong turn

Column formatting and value input option

The first suspects were Google Sheets column formatting and Make's "value input option" (RAW vs USER_ENTERED). Both were checked and corrected — column set to plain text, input option set to RAW — but the ISO string kept showing up.

Root cause found

The date was never text to begin with

The readable date in Make's log was only a display convenience. Internally, date+time stayed a Date object until something explicitly converted it. Any field it landed in without an explicit format call serialized it back to ISO 8601 — regardless of Sheets settings.

Second bug, same root cause

Broken concatenation in the Gmail body

The confirmation email had a second, unrelated-looking symptom — a garbled string like "AM0iam/7amni7/31/2026am" tacked onto the end of an otherwise correct sentence. Tracing it back showed a leftover broken date expression concatenated alongside a working one, left over from earlier edits.

Fixed

formatDate() applied at every output point

The fix was the same in both places: wrap date+time in Make's formatDate() function wherever it left the pipeline as plain text — once in the Google Sheets mapping, once in the Gmail body — and delete the stray leftover expression. Both the sheet log and the confirmation email now show a clean, consistent date.

// what makes it different

→ Not just a form-to-calendar sync

  • Actually checks real calendar availability before booking anything
  • Two distinct outcomes, not one — auto-confirm or AI-handled conflict
  • Gemini reasons over the actual conflicting events, not a canned message
  • Every request is logged, whether it succeeded or hit a conflict
  • Confirmation and conflict-reply emails both fully automated
  • Built entirely on Make.com's native Google Calendar/Sheets/Gmail modules

// tools used

Make.com Tally Google Calendar Google Sheets Google Gemini AI Gmail