Hourly
Text appointment reminders and follow-ups from Airtable
Leads who haven't booked get a friendly follow-up text, booked clients get a reminder the day before, and each record is updated.
- Runs
- Hourly
- Apps
- Airtable, Twilio
- AI
- Optional
- Access
- data.records:read/write; Twilio send
Send this to your assistant
Create a ClickRuntime automation: every hour, text leads in my Airtable 'Clients' table who haven't booked after two days, remind booked clients the day before their appointment, and note the text on their record.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A physiotherapy clinic collects enquiries through its website and books appointments in Airtable. Some people enquire and never book; others book and forget to turn up. The receptionist means to call both groups but is busy with the people in the waiting room, and each missed appointment is an empty hour.
A short text two days after an unbooked enquiry, and a reminder the day before each appointment, catches most of these without a phone call. Writing the date of each text on the record means nobody gets the same message twice and the team can see who has been contacted.
What you get out of it
Fewer no-shows
Booked clients get a reminder the day before, with the time, so fewer appointments are forgotten.
Enquiries get a second chance
People who asked but did not book get one friendly follow-up text with a link to book.
Nobody is texted twice
The date of each text is saved on the record, and records already texted are skipped.
The front desk stays free
Reminders and follow-ups go out on their own, so staff can focus on the people in front of them.
How it works
What happens, step by step
Every hour, ClickRuntime checks your Airtable Clients table.
It finds leads who enquired more than two days ago and have not booked or been texted.
It finds booked clients whose appointment is tomorrow and who have not had a reminder.
Each one gets a short text from your Twilio number.
The date of the text is written on the record, so nobody gets the same message twice.
Before it runs live
- Connect Airtable
- Connect Twilio
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
- Run it at a different time, more or less often, or only on weekdays
- 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 Twilio steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, report_fetched
BASE_ID, FROM, BOOKING = "appXXXXXXXXXXXXXX", "+447700900000", "https://example.com/book"
FOLLOW_UP = "AND({Status}='Lead', {Followed up}=BLANK(), IS_BEFORE({Enquired}, DATEADD(TODAY(), -2, 'days')))"
REMIND = "AND({Status}='Booked', {Reminded}=BLANK(), IS_SAME({Appointment}, DATEADD(TODAY(), 1, 'days'), 'day'))"
def sms(to, body):
sid = credentials.secret("TWILIO_ACCOUNT_SID")
return http.post(f"https://api.twilio.com/2010-04-01/Accounts/{sid}/Messages.json",
auth=(sid, credentials.secret("TWILIO_AUTH_TOKEN")), data={"From": FROM, "To": to, "Body": body})
@on_trigger
def run(event):
api = f"https://api.airtable.com/v0/{BASE_ID}/Clients"
headers = {"Authorization": f"Bearer {credentials.connection('airtable', 'work')}"}
leads = http.get(api, headers=headers, params={"filterByFormula": FOLLOW_UP}).json()["records"]
booked = http.get(api, headers=headers, params={"filterByFormula": REMIND}).json()["records"]
report_fetched(len(leads) + len(booked))
if not leads and not booked:
return {"sent": 0}
for rec, kind in [(r, "lead") for r in leads] + [(r, "booked") for r in booked]:
f = rec["fields"]
if kind == "lead":
body, field = f"Hi {f.get('First name', '')}, thanks for getting in touch. Book a time here: {BOOKING}", "Followed up"
else:
body, field = f"Hi {f.get('First name', '')}, a reminder of your appointment tomorrow at {f.get('Time', '')}.", "Reminded"
sms(f["Phone"], body).raise_for_status()
http.patch(api, headers=headers, json={"records": [{"id": rec["id"], "fields": {field: event.get("scheduled_time", "")[:10] or None}}]})
return {"leads": len(leads), "reminders": len(booked)}FAQ
Common questions
What do the texts say?
Can it handle replies such as 'can I move it?'
Will it text people late at night?
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
Text everyone in an Airtable view
One message is sent by SMS to every contact in an Airtable view, and each record is marked as sent.
See how it worksAnswer texted questions from your Airtable info
People text a question to your number and get a short answer drawn from the details you keep in Airtable.
See how it worksReply to texts with the weather and log each request
Someone texts a town name and gets the current weather back, and every request is logged in Airtable.
See how it worksKeep exploring
Set up “Text appointment reminders and follow-ups from Airtable” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.