🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Twilio + Cal.com: book appointments from SMS

Lisa Granqvist Partner Workflow Automation Expert

Your leads text you… and then the slow leak starts. Someone forgets to reply, availability gets checked “later,” and the “quick question” turns into a missed booking you’ll never see again.

This Twilio Cal booking automation hits small business owners first, because you’re the one juggling the phone. But marketing managers and agency leads feel it too when inbound demand spikes and nobody wants to babysit SMS threads. The goal is simple: turn texts into booked appointments (or cleanly closed conversations) without you hovering over your inbox.

Below you’ll see how the workflow handles inbound SMS, checks Cal.com availability, books or reschedules, logs everything to Airtable, and follows up daily when someone goes quiet.

How This Automation Works

The full n8n workflow, from trigger to final output:

n8n Workflow Template: Twilio + Cal.com: book appointments from SMS

The Problem: SMS Leads Fall Through the Cracks

SMS feels “fast,” which is exactly why it becomes a trap. A lead texts asking for times, you reply when you can, then you have to jump into a calendar tool, check availability, send options, wait again, and repeat. Meanwhile, you’re also trying to run the actual business. The real cost is not just the time spent typing. It’s the mental load of remembering who needs a follow-up, who already got one, and who should never be messaged again because they opted out. One missed thread can mean one lost appointment, and those add up quickly.

It adds up fast. Here’s where it breaks down.

  • Reply speed is inconsistent, so hot leads cool off while you’re in meetings.
  • Availability checks turn into a back-and-forth that can take 20 minutes per lead.
  • Conversation history is scattered, which means you repeat questions and look disorganized.
  • Follow-ups happen “when someone remembers,” so interested prospects quietly disappear.

The Solution: An SMS Scheduling Agent That Books for You

This workflow turns your Twilio number into a scheduling assistant that can actually finish the job. When someone texts an inquiry, n8n captures the message via a webhook, looks up (or creates) the contact in Airtable, and retrieves the prior conversation so the reply has context. Then the AI agent steps in: it understands what the person wants, checks Cal.com availability through API calls, and proposes times or books directly when the user confirms. If the person already has an appointment, it can find it and help reschedule or cancel without your team touching the calendar. Every message and outcome gets logged back to Airtable, so you always know what happened and when.

The workflow starts with an incoming SMS through Twilio. From there, an AI agent uses Cal.com API v2 to check slots, create bookings, or manage changes. Finally, Airtable becomes your clean system of record, while a daily scheduled run sends smart follow-ups to leads who showed interest but didn’t book.

What You Get: Automation vs. Results

Example: What This Looks Like

Say you get 20 SMS inquiries a week. Manually, you’ll usually spend about 15 minutes per lead checking Cal.com, proposing times, and logging notes somewhere, which is roughly 5 hours weekly. With this workflow, the “work” is basically reading the thread when you want: the trigger is instant, booking checks happen in the background, and the follow-up run happens once a day automatically. You’ve traded hours of back-and-forth for quick oversight.

What You’ll Need

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Twilio to receive and send SMS messages
  • Cal.com to check availability and manage bookings
  • Airtable API key (get it from Airtable account settings)

Skill level: Intermediate. You’ll connect accounts, add API keys, and lightly adjust prompts and fields.

Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).

How It Works

Inbound SMS starts the conversation. A Twilio webhook catches the text and passes the message (and phone number) into n8n. The workflow immediately evaluates command keywords, so opt-outs are handled cleanly and fast.

Context gets pulled before the AI responds. Airtable stores the conversation record, so the workflow can fetch prior sessions and avoid that annoying “Can you repeat that?” loop. This is also where you track engagement and follow-up counts.

The scheduling agent does the real work. Using an OpenAI chat model, the agent decides if the user is trying to book, reschedule, or cancel. It then calls Cal.com endpoints to check slot availability, retrieve booking details, search upcoming bookings, and create or update an appointment.

Everything gets logged, and the user gets an SMS reply. The workflow upserts the conversation back into Airtable and sends the response via Twilio. Separately, a daily schedule trigger finds leads that still seem interested but haven’t booked, generates a personalized follow-up, and sends it while updating metrics so you don’t nag people.

You can easily modify the follow-up rules to match your sales cycle based on your needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Triggers

Set up both inbound SMS handling and the daily follow-up schedule.

  1. Add the Incoming SMS Trigger node and set Updates to com.twilio.messaging.inbound-message.received.
  2. Credential Required: Connect your twilioApi credentials in Incoming SMS Trigger.
  3. Add the Daily Schedule Trigger node and configure the schedule rule to match your follow-up cadence (daily is implied by the workflow).

Step 2: Connect Airtable Data Sources

Link Airtable to store and retrieve lead sessions, follow-up state, and opt-out status.

  1. In Retrieve Follow-Up Leads, select your Airtable Base and Table, set Operation to search, and set Filter By Formula to =AND( {appointment_id} = '', {status} != 'STOP', {followup_count} < 3, DATETIME_DIFF(TODAY(), {last_followup_at}, 'days') >= 3 ).
  2. In Fetch Prior Session, set Operation to search, Limit to 1, and Filter By Formula to ={session_id}="{{ $('Incoming SMS Trigger').item.json.From }}".
  3. In Upsert Conversation Record, set Operation to update, and map the fields using expressions like {{ $('Incoming SMS Trigger').item.json.From }}, {{ $now.toISO() }}, and the provided JSON concat expression for chat_messages.
  4. In Update Follow-Up Metrics and Mark Opt-Out Status, set Operation to update, and ensure Matching Columns includes session_id with values like {{ $('Incoming SMS Trigger').item.json.From }}.
  5. Credential Required: Connect your airtableTokenApi credentials in all Airtable nodes (Retrieve Follow-Up Leads, Fetch Prior Session, Upsert Conversation Record, Update Follow-Up Metrics, Mark Opt-Out Status).

Step 3: Set Up Follow-Up Text Generation

Configure the LLM used to generate proactive follow-up messages.

  1. In Primary Chat Model, select your OpenAI model preferences (options are empty by default).
  2. Credential Required: Connect your openAiApi credentials in Primary Chat Model.
  3. In Generate Follow-Up Text, keep Prompt Type set to define and ensure the message uses the provided template with variables like {{ $json.last_message_at }}, {{ $json.customer_name ?? '<unknown>' }}, and {{ $json.chat_messages }}.

Step 4: Configure Command Routing and Opt-Out Handling

Route STOP messages to opt-out handling while letting other messages continue the scheduling flow.

  1. In Evaluate Command Keywords, add a rule that checks Left Value ={{ $json.Body }} contains STOP, and set Fallback Output to extra.
  2. Evaluate Command Keywords outputs to both Mark Opt-Out Status and Fetch Prior Session in parallel—this ensures STOP requests are handled immediately while other messages continue to the agent.
  3. In Send Opt-Out Confirmation, set To to {{ $('Incoming SMS Trigger').item.json.From }}, From to {{ $('Incoming SMS Trigger').item.json.To }}, and Message to Thank you. You won't receive any more messages from us!.
  4. Credential Required: Connect your twilioApi credentials in Send Opt-Out Confirmation.

⚠️ Common Pitfall: The STOP check is case sensitive. If you expect “stop” or “Stop”, adjust the rule in Evaluate Command Keywords accordingly.

Step 5: Set Up the Scheduling Assistant Agent and Tools

Configure the core AI agent that handles booking logic and integrates with Cal.com tools.

  1. In Agent Chat Model, set Model to gpt-4o-mini.
  2. Credential Required: Connect your openAiApi credentials in Agent Chat Model and Secondary Chat Model.
  3. In Scheduling Assistant Agent, keep Has Output Parser enabled and retain the provided System Message template (it includes variables like {{ $now.toISO() }} and {{ $('Incoming SMS Trigger').item.json.From }}).
  4. Connect Structured Response ParserAuto-Correcting ParserScheduling Assistant Agent exactly as shown; these parsers rely on Secondary Chat Model as their language model.
  5. Configure Cal.com tool nodes (Check Slot Availability, Retrieve Booking Details, Search Upcoming Booking, Reschedule Appointment, Cancel Appointment, Create New Booking) with the provided URLs and JSON bodies, including placeholders like {bookingUid} and {start}.
  6. Credential Required: Connect your calApi and httpHeaderAuth credentials to the Cal.com tool nodes; these tools are used by Scheduling Assistant Agent, so ensure the credentials are available for the agent’s tool calls.

Ensure Create New Booking uses a real eventTypeId instead of [YOUR_ID], and keep ISO datetime formats as specified in each tool’s description.

Step 6: Configure SMS Replies and Conversation Updates

Persist conversation data and send AI-generated SMS responses.

  1. Verify the flow Fetch Prior SessionScheduling Assistant AgentUpsert Conversation RecordSend SMS Reply to ensure all inbound messages are recorded and answered.
  2. In Send SMS Reply, set To to {{ $('Incoming SMS Trigger').item.json.From }}, From to {{ $('Incoming SMS Trigger').item.json.To }}, and Message to {{ $('Scheduling Assistant Agent').item.json.output.reply }}.
  3. Credential Required: Connect your twilioApi credentials in Send SMS Reply.

Step 7: Configure Follow-Up SMS Dispatch

Automate follow-up outreach using Airtable and Twilio.

  1. Confirm the flow Daily Schedule TriggerRetrieve Follow-Up LeadsGenerate Follow-Up TextUpdate Follow-Up MetricsDispatch Follow-Up SMS.
  2. In Dispatch Follow-Up SMS, set To to {{ $('Retrieve Follow-Up Leads').item.json.session_id }}, From to {{ $('Retrieve Follow-Up Leads').item.json.twilio_service_number }}, and Message to {{ $('Generate Follow-Up Text').item.json.text }} Reply STOP to stop recieving these messages..
  3. Credential Required: Connect your twilioApi credentials in Dispatch Follow-Up SMS.

If follow-ups are not sending, verify the filter formula in Retrieve Follow-Up Leads and ensure last_followup_at is updated in Update Follow-Up Metrics.

Step 8: Test and Activate Your Workflow

Run end-to-end tests for both inbound SMS and scheduled follow-ups before turning the workflow on.

  1. Manually execute Incoming SMS Trigger with a test payload and verify Send SMS Reply sends a response and Upsert Conversation Record updates Airtable.
  2. Test a STOP message and confirm Mark Opt-Out Status updates Airtable and Send Opt-Out Confirmation sends the opt-out reply.
  3. Manually execute Daily Schedule Trigger and confirm follow-ups are generated and sent through Dispatch Follow-Up SMS.
  4. When satisfied, toggle the workflow to Active to enable production processing.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Common Gotchas

  • Twilio credentials can expire or need specific permissions. If things break, check the Twilio console for webhook delivery and messaging logs first.
  • If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
  • Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.

Frequently Asked Questions

How long does it take to set up this Twilio Cal booking automation?

About an hour if your Twilio, Cal.com, and Airtable accounts are ready.

Do I need coding skills to automate Twilio Cal booking?

No. You’ll mostly connect accounts, paste API keys, and tweak a few fields and prompts.

Is n8n free to use for this Twilio Cal booking workflow?

Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (often just a few dollars a month for typical SMS volume) plus standard Twilio SMS fees.

Where can I host n8n to run this automation?

Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.

Can I customize this Twilio Cal booking workflow for my CRM instead of Airtable?

Yes, and it’s a common change. You would replace the Airtable nodes that fetch prior sessions and upsert conversation records with your CRM’s nodes (or an HTTP Request to your CRM API). Most teams also adjust the follow-up logic so it respects pipeline stage, lead source, and “do not contact” flags. If you’re moving to HubSpot, for example, the same structure works; you’re mainly swapping storage and field mapping.

Why is my Twilio connection failing in this workflow?

Usually it’s the webhook URL not matching what Twilio is posting to, or the Twilio auth token was rotated and n8n still has the old one. Check the Twilio message logs first to confirm delivery, then verify the webhook settings on the phone number. If inbound works but outbound fails, it can also be messaging permissions or geo restrictions on your Twilio account.

How many SMS conversations can this Twilio Cal booking automation handle?

A lot. On n8n Cloud, it depends on your plan’s monthly executions, while self-hosting has no fixed execution cap (it’s mainly your server size). In practice, most small teams run hundreds of inbound messages a week without thinking about it, then upgrade only when volume spikes.

Is this Twilio Cal booking automation better than using Zapier or Make?

Often, yes, frankly. This workflow isn’t just “send SMS then create event”; it uses an AI agent, keeps memory of prior sessions, and makes multiple API calls to Cal.com (check slots, create bookings, search bookings, reschedule, cancel). n8n handles that kind of branching and tool-calling without turning into a spaghetti mess or forcing you into expensive task pricing. Zapier or Make can still be fine for simple two-step flows, especially if you hate managing anything. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation.

This is what “responsive” looks like when you’re not glued to your phone. Set it up once, let the workflow handle the repetitive conversations, and keep your calendar moving.

Need Help Setting This Up?

Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal