The moment it happens
Book appointment requests into your calendar and a sheet
Booking requests are checked against your calendar, booked when you are free and logged in your appointments sheet.
- Runs
- The moment it happens
- Apps
- Google Calendar, Google Sheets
- AI
- Not needed
- Access
- Calendar read+write; Sheet edit
Send this to your assistant
Create a ClickRuntime automation: when a booking request hits my trigger link, check if I'm free, book it in Google Calendar and add it to my Appointments sheet.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A physiotherapist takes bookings through a simple form on her website. Each request arrives by email and she checks her calendar between patients, replies, and then adds the slot to a sheet she uses for billing. Requests sent on a Friday evening wait until Monday.
Checking availability and booking straight away gives clients an answer at once and keeps the calendar and the billing sheet in step.
What you get out of it
Bookings confirmed at any hour
Requests sent in the evening or at weekends are booked straight away, so clients do not drift to another practice while waiting.
No double bookings
Each request is checked against your calendar before it is booked, so two clients never get the same slot.
Billing sheet always matches the diary
Every booking and reschedule is written to the sheet, so invoicing uses the same record as the calendar.
Reschedules handled the same way
When a client moves an appointment, the event and the sheet row are both updated, with no manual edits.
How it works
What happens, step by step
When a client books on your website, the request is sent to your ClickRuntime trigger link.
ClickRuntime checks your Google Calendar to see whether you are free at that time.
If you are free, it creates the appointment and invites the client; if it is a reschedule, it moves the existing appointment.
The booking is added to your Appointments sheet, or the existing row is updated.
Before it runs live
- Connect Google Calendar
- Connect your Google Sheets account and pick the spreadsheets it may use
- Paste your automation's link into the other app's webhook settings
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Calendar and Google Sheets steps into one automation
Under the hood
The code that runs this automation
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
from clickruntime import on_event, credentials
SHEET_ID = "your-spreadsheet-id"
@on_event
def handle(event):
b = event.json
creds = Credentials(credentials.connection("google", "work"))
cal = build("calendar", "v3", credentials=creds, cache_discovery=False)
busy = cal.freebusy().query(body={"timeMin": b["start"], "timeMax": b["end"], "items": [{"id": "primary"}]}).execute()
if busy["calendars"]["primary"]["busy"]:
return {"booked": False, "reason": "busy"}
body = {"summary": f"Appointment: {b['name']}", "start": {"dateTime": b["start"]}, "end": {"dateTime": b["end"]},
"attendees": [{"email": b["email"]}]}
if b.get("event_id"):
ev = cal.events().patch(calendarId="primary", eventId=b["event_id"], body=body, sendUpdates="all").execute()
else:
ev = cal.events().insert(calendarId="primary", body=body, sendUpdates="all").execute()
build("sheets", "v4", credentials=creds, cache_discovery=False).spreadsheets().values().append(
spreadsheetId=SHEET_ID, range="Appointments!A:E", valueInputOption="USER_ENTERED",
body={"values": [[b["start"], b["name"], b["email"], ev["id"], "rescheduled" if b.get("event_id") else "booked"]]}).execute()
return {"booked": True, "event": ev["id"]}FAQ
Common questions
What happens if I'm busy at the requested time?
Can I set working hours?
Does the client get a calendar invite?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Set up new clients in Sheets and book their kickoff call
When a new client form comes in, they are added to your clients sheet with an onboarding checklist, and a kickoff call is booked next week.
See how it worksInvite new sheet registrants to your calendar event
Each new email in your registrations sheet is added as a guest to your event and gets a calendar invite.
See how it worksPut unpaid bills from a sheet into your calendar on their due dates
Every unpaid bill in your sheet shows up in your calendar on its due date with a reminder, and the event updates if the amount changes.
See how it worksKeep exploring
Set up “Book appointment requests into your calendar and a sheet” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.