Every 15 minutes
Book interviews for candidates you shortlist in Airtable
When you mark a candidate as Shortlisted in Airtable, the next free 30-minute slot is booked on your calendar and the candidate is invited.
- Runs
- Every 15 minutes
- Apps
- Airtable, Google Calendar
- AI
- Optional
- Access
- Airtable read/write; calendar.events
Send this to your assistant
Create a ClickRuntime automation: when a candidate in my Airtable Candidates table is marked 'Shortlisted', book the next free 30-minute slot in my Google Calendar, invite them and record the time in Airtable.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A small recruitment agency tracks every candidate in Airtable. Shortlisting is quick, but then someone has to open the calendar, find a gap and send an invite, and on busy days shortlisted candidates wait three or four days to hear anything.
Booking the interview as soon as the status changes keeps candidates warm and lets your team spend its time assessing people rather than arranging calls.
What you get out of it
Candidates hear back within minutes
The invite goes out shortly after you change the status, which matters when good candidates are talking to several employers.
Your base shows the interview time
The booked time is written back to the candidate's record, so everyone on the team can see it in Airtable.
No calendar juggling
Free time is found from your Google Calendar, so interviews never overlap existing meetings.
Each candidate is booked once
Once a record has an interview time, it is not booked again, even if the status is changed back and forth.
How it works
What happens, step by step
Every 15 minutes ClickRuntime checks your Airtable Candidates table for records marked Shortlisted with no interview booked.
For each one, it finds the next free 30-minute slot in your Google Calendar.
It creates the interview event and invites the candidate.
The interview time is written back to the candidate's record in Airtable, so they are not booked twice.
Before it runs live
- Connect Airtable
- Connect Google Calendar
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
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Airtable and Google Calendar steps into one automation
Under the hood
The code that runs this automation
from datetime import datetime, timedelta, timezone
from clickruntime import on_trigger, credentials, http, report_fetched
AT = "https://api.airtable.com/v0/appXXXXXXXXXXXXXX/Candidates"
CAL = "https://www.googleapis.com/calendar/v3"
@on_trigger
def run(event):
at = {"Authorization": f"Bearer {credentials.secret('AIRTABLE_API_KEY')}"}
recs = http.get(AT, headers=at, params={"filterByFormula": "AND({Status} = 'Shortlisted', {Interview} = BLANK())"}).json()["records"]
report_fetched(len(recs))
if not recs:
return {"new": 0}
h = {"Authorization": f"Bearer {credentials.connection('google', 'work')}"}
t = (datetime.now(timezone.utc) + timedelta(days=1)).replace(hour=9, minute=0, second=0, microsecond=0)
busy = http.post(f"{CAL}/freeBusy", headers=h, json={"timeMin": t.isoformat(), "timeMax": (t + timedelta(days=10)).isoformat(),
"items": [{"id": "primary"}]}).json()["calendars"]["primary"]["busy"]
taken = [(datetime.fromisoformat(b["start"]), datetime.fromisoformat(b["end"])) for b in busy]
for r in recs:
while t.weekday() > 4 or not 9 <= t.hour < 17 or any(t < e and t + timedelta(minutes=30) > s for s, e in taken):
t += timedelta(minutes=30)
f = r["fields"]
http.post(f"{CAL}/calendars/primary/events", headers=h, params={"sendUpdates": "all"}, json={
"summary": f"Interview: {f['Name']}", "attendees": [{"email": f["Email"]}],
"start": {"dateTime": t.isoformat()}, "end": {"dateTime": (t + timedelta(minutes=30)).isoformat()}})
http.patch(f"{AT}/{r['id']}", headers=at, json={"fields": {"Interview": t.isoformat()}})
taken.append((t, t + timedelta(minutes=30)))
return {"booked": len(recs)}FAQ
Common questions
Which field does it watch?
Does the candidate get a calendar invite?
Can it write a personal invitation note?
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
Book a kickoff meeting when a client starts onboarding
When a client's status changes to Onboarding in Airtable, a kickoff meeting is booked with them and the link is saved on their record.
See how it worksBook appointments into your calendar and log clients in Airtable
Each booking request is placed in a free slot in your calendar and the client is added to your Airtable CRM.
See how it worksCreate calendar reminders for upcoming Airtable due dates
Purchase orders due in the next week get a reminder in your Google Calendar, without duplicates.
See how it worksKeep exploring
Set up “Book interviews for candidates you shortlist in Airtable” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.