Duck
Tutorials5 min read

How to Build an AI Scheduling Assistant That Actually Works

Samet Turan— Editor··5 min read

Learn to build a reliable AI scheduling assistant with real prompts, tool picks, and debugging tips—then grab the ready-made blueprint for solo operators

Most AI scheduling assistants look smart in demo videos but fall apart when you try to run them for real. You end up with double‑booked calls, missed time‑zone shifts, or a calendar that feels more like a to‑do list. After reading this, you’ll know how to assemble a reliable scheduler using simple prompts, a few cheap tools, and a clear debugging routine.

Why does my AI scheduler double-book meetings?

The first symptom you’ll notice is overlapping slots. Usually the root cause isn’t the AI itself but the way you feed it data. If you give the model a raw list of events without clear start‑end formatting, it will guess and guess wrong.

I once watched a GPT‑4 based scheduler book a client call at 2 AM because it treated a “flexible” note as a free slot. The fix was simple: wrap every existing event in a strict JSON block with ISO timestamps before you ask the model to propose new times.

Another common slip is ignoring timezone offsets. The model sees “3 pm” and assumes your local zone, but your guest is in a different region. The result? A meeting that shows up at 3 pm for you and midnight for them.

To avoid that, always attach the timezone string (e.g., “America/New_York”) to every time you pass to the model. If you skip that step you’ll spend more time apologizing than selling.

What most guides get wrong

Most tutorials tell you to plug the AI straight into Calendly or Google Calendar and call it a day. They skip the validation layer that catches impossible slots before they hit your calendar.

They also assume you have a paid Zapier automations plan to run multi‑step workflows. In reality you can do the same with a free the Make platform scenario and a bit of JavaScript.

Finally, they suggest you let the AI write the final event title. That leads to gibberish like “Meeting with John Doe about Project X (follow‑up)” when you just wanted “Project X check‑in”. The AI adds noise because it tries to be helpful.

What you actually need is a three‑step pipe: (1) collect availability, (2) ask the model to suggest slots, (3) run a deterministic checker that removes any slot that conflicts with an existing event or falls outside your work hours.

Core components you actually need

You don’t need a fancy framework. A small stack works fine:

  • Google Calendar (or Outlook) as the source of truth.
  • Make.com (free tier) to pull events, call an LLM API, and push new events.
  • The OpenAI API (gpt‑4o‑mini) or Anthropic’s Claude 3 Haiku—both cheap enough for low volume.
  • A tiny JavaScript snippet (hosted on Make.com’s HTTP module) that validates proposed slots.

Make.com’s free plan gives you 1 000 operations a month, which is enough for a solopreneur booking 10‑15 meetings a week. If you exceed that, the $9/mo plan bumps you to 10 k operations.

I love how Make.com lets you see each step’s output in real time. When the LLM returns a weird timestamp you can spot it instantly and tweak the prompt.

My gripe? The HTTP module’s error messages are vague. If you send a malformed JSON payload you get a generic “500 Internal Server Error” with no clue what field broke. You end up digging through logs for minutes.

Real prompt example and tool stack

Here’s the exact prompt I use (copy‑paste into the Make.com HTTP module that calls the LLM):

  • You are a scheduling assistant. Given the user’s work hours (9 am‑5 pm, America/New_York) and the following busy slots in ISO format: [{{busy_slots}}]. Propose three 30‑minute slots that are free, sorted by earliest. Return only a JSON array of strings, each string an ISO timestamp (e.g., "2026-09-01T10:00:00-04:00"). No extra text.

The {{busy_slots}} placeholder is replaced by a stringified array pulled from Google Calendar via the Calendar module. I keep the busy slots limited to the next seven days to keep the token count low.

On the validation step I run this tiny JS block (again in Make.com):

  • function slotIsFree(slot, busy) { return !busy.some(b => { const s = new Date(slot); const e = new Date(s); e.setMinutes(e.getMinutes() + 30); const bs = new Date(b.start); const be = new Date(b.end); return s < be && e > bs; }); } return slotIsFree(input.slot, input.busy);

If the function returns true the slot passes; otherwise Make.com filters it out.

Cost wise: the LLM call averages $0.0003 per request. At 20 requests a day that’s $0.02, basically free. Make.com’s free tier covers the operations, so your monthly spend stays under $5 even if you upgrade to the $9 plan for extra headroom.

I think $9/mo is a fair price for the reliability you get—especially when the alternative is missing a client call because your AI double‑booked.

How to debug when this breaks

When the scheduler starts returning slots that are already taken, first check the busy_slots payload. In Make.com click the history of the Calendar module and verify the ISO strings are correct and include the timezone offset.

If the payload looks fine, look at the LLM output. The model sometimes wraps the JSON array in markdown triple‑backticks. Add a instruction to “Return only raw JSON, no formatting” and retry.

If the validation step rejects every slot, the bug is usually in the JavaScript timezone handling. Remember that JavaScript’s Date constructor treats a string like “2026-09-01T10:00:00” as UTC unless you add the offset. Make sure you keep the “-04:00” part when you create the Date objects.

A quick test: slot the function with a known busy slot and a proposed slot that is clearly free; log the intermediate values to see where the comparison fails.

When all else fails, revert to a manual check: export your calendar to CSV, grep for the proposed time, and confirm it’s truly open. That low‑fi step often catches a subtle DST shift the library missed.

One‑sentence reality check

If you’re booking fewer than five meetings a week, a shared Google Calendar with plain copy‑paste beats any AI scheduler.

Now you have a working blueprint: pull availability, ask the LLM for slots, validate with a few lines of code, and write back to Calendar. Follow the steps above, tweak the prompt to your tone, and you’ll stop losing time to scheduling errors.

Adjacent reading: deeper coverage of AI agent platforms.

If you’d rather skip the build and deploy a working version in an afternoon, we’ve packaged this workflow as a blueprint at deepusecase.com/vault.

— The Colophon

One AI tool. Tested. Reviewed.
In your inbox every Sunday.

~3 minute read. Real outcomes from operators, not marketers.

Free. One email per Sunday. Unsubscribe in one click.