Cal.com + Slack: qualify demo leads, follow up faster
Demo requests are supposed to be a good problem. Then your inbox fills up with “students,” competitors, and people who aren’t even in your market, while the real buyers wait too long.
This Cal.com Slack automation hits sales leads and marketing ops first, but founders feel it too. You get faster qualification, cleaner routing, and follow-ups that don’t sound like copy-paste templates.
Below, you’ll see how the workflow handles intake, enrichment, AI qualification, booking verification in Cal.com, and the handoff to Slack and your nurture campaign.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Cal.com + Slack: qualify demo leads, follow up faster
flowchart LR
subgraph sg0["Structured Output Pa Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Route to Clay"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields3", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Route to Clay2"]
n7@{ icon: "mdi:brain", form: "rounded", label: "Anthropic Chat Model", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "AI Qulification", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n11@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Check Cal.com For Booking"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If3", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Add to Instantly"]
n15@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n16@{ icon: "mdi:brain", form: "rounded", label: "Anthropic Chat Model1", pos: "b", h: 48 }
n17@{ icon: "mdi:wrench", form: "rounded", label: "Search Web", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Route to Clay1"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Trigify Enrichment"]
n1 --> n3
n1 --> n19
n5 --> n6
n5 --> n20
n13 --> n15
n11 --> n12
n0 --> n5
n15 --> n14
n17 -.-> n15
n2 --> n10
n3 --> n2
n19 --> n4
n9 --> n1
n10 --> n11
n20 --> n9
n7 -.-> n9
n16 -.-> n15
n8 -.-> n9
n12 --> n13
n18 -.-> n15
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n8,n9,n15,n18 ai
class n7,n16 aiModel
class n17 ai
class n1,n5,n13 decision
class n0,n3,n6,n10,n12,n14,n19,n20 api
classDef customIcon fill:none,stroke:none
class n0,n3,n6,n10,n12,n14,n19,n20 customIcon
The Problem: Demo requests pile up, but the wrong ones get attention
Inbound demo forms look simple until you’re living with them. Someone submits a request with a LinkedIn URL, a vague “use case,” and an email that might be personal, might be corporate. You check the profile, skim the company site, decide if they’re in your target region, then try to figure out if they actually booked a slot in Cal.com. Meanwhile, the fastest responder wins, which means you’re forced to treat every lead like it’s hot even when it clearly isn’t. It’s tiring. And honestly, it’s a quiet conversion killer.
It adds up fast. Here’s where the friction usually shows up in real teams.
- You lose 10–15 minutes per lead just verifying who they are and what they do.
- Low-quality sources sneak in, so sales ends up chasing leads that never convert.
- Booked and unbooked requests get mixed together, which means follow-ups are mistimed and awkward.
- “Personalized outreach” becomes a scramble, so messaging quality drops right when it matters.
The Solution: AI-qualify demo requests, verify bookings, and route follow-ups automatically
This n8n workflow turns every demo request into a clean, qualified record with the right next action attached. It starts the moment your website form hits an incoming webhook, then quickly filters out known low-quality sources so they don’t consume attention. For the leads that pass, the workflow enriches the person and company data using the Trigify API (based on the LinkedIn URL and other form fields). After that, an AI qualification agent reviews the enriched context and scores the lead against the rules that usually live in someone’s head: B2B fit, target geographies, seniority signals, and current employment. Finally, it checks Cal.com to see whether the lead actually booked. If not, the workflow generates research-backed follow-up messaging and pushes the lead into an Instantly.ai campaign, while keeping your systems updated through HTTP requests (for example, Clay tables) and internal flags.
The workflow begins with a real-time webhook submission. Then it enriches and qualifies the lead using AI, so you’re not relying on gut feel. After a short delay, it verifies booking status in Cal.com and routes non-booked but qualified leads into a personalized follow-up sequence.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get 20 demo requests a week. Manually, it’s easy to spend about 10 minutes checking LinkedIn, 5 minutes verifying the company, and another 5 minutes confirming Cal.com booking status, so roughly 20 minutes per lead (around 6–7 hours weekly). With this workflow, you spend maybe 2 minutes scanning the Slack alert and only step in when the lead is actually sales-ready or needs a human touch. The rest runs in the background, including enrichment and a personalized follow-up for qualified people who didn’t book.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Cal.com to verify booking status via API.
- Slack for instant alerts to your sales channel.
- Trigify API key (get it from your Trigify dashboard).
Skill level: Intermediate. You’ll connect a few APIs, map fields, and adjust the qualification rules to match your ICP.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A demo request hits your webhook. The form submission arrives in n8n in real time, including email, LinkedIn URL, use case, and referral source.
Low-quality sources get gated. An “If” check looks at the submission source (for example, “lead_capture_box”) and routes obvious junk away from the expensive steps like enrichment and AI analysis.
Enrichment + AI qualification happens next. n8n calls Trigify to pull richer LinkedIn and company data, then an AI agent evaluates fit (B2B validation, geography, seniority signals, and employment). The result is parsed into structured fields so it’s actually usable, not just a blob of text.
Cal.com booking status gets verified after a short delay. The workflow waits, checks the Cal.com API, and branches based on booked vs. not booked. Qualified-but-unbooked leads get personalized follow-up research (including web research) and are added to Instantly.ai for nurturing, while your systems are updated via HTTP requests.
You can easily modify the qualification criteria to match your ICP, or change where “qualified” leads go (Slack, Clay, Sheets, CRM) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Start by setting up the inbound webhook so your website intake data can enter the workflow and receive a response.
- Add the Incoming Webhook Trigger node and set HTTP Method to
POST. - Set the Path to
[REDACTED_WEBHOOK_PATH](replace with your live endpoint path). - Set Response Mode to
responseNodeso the workflow uses Return Webhook Reply for the HTTP response. - Connect Incoming Webhook Trigger to Source Gate Check to begin routing after intake.
⚠️ Common Pitfall: Make sure your website form sends JSON with body.source, body.email, and body.linkedinUrl so downstream expressions resolve correctly.
Step 2: Connect Clay and Trigify Enrichment
This step gates incoming traffic and routes unbooked leads to Clay, while enriching qualified sources via Trigify.
- In Source Gate Check, set the condition Left Value to
{{ $json.body.source }}and check it containslead_capture_box. - For the “true” path, configure Send to Clay Unbooked with URL
https://api.clay.com/v3/sources/webhook/pull-in-data-from-a-webhook-[REDACTED_CLAY_WEBHOOK_ID]and MethodPOST. - In Send to Clay Unbooked → Body Parameters, set: Data of Demo Booked to
{{ $('Incoming Webhook Trigger').item.json.body.timestamp }}, Qualified toNOT BOOKED, and Email to{{ $json.body.email }}. - For the “false” path, configure Fetch Trigify Enrichment with URL
/v1/profile/trackand set the query parameter url to{{ $json.body.linkedinUrl }}.
⚠️ Common Pitfall: Replace [REDACTED_CLAY_WEBHOOK_ID] with your Clay webhook ID and ensure your Trigify endpoint base URL is set at the node level or in environment variables.
Step 3: Set Up AI Qualification Logic
Use AI to determine qualification, then route leads into qualified or unqualified Clay pipelines and return the webhook response.
- Configure AI Qualification Logic with Text set to
=Analyse this person, ensure their current company the work for is a B2B company Based on this company descrption give me a True or false if this company is a B2B company - industry - {{ $json.position[0].companyIndustry }}company name - {{ $json.position[0].companyName }}company size - {{ $json.position[0].companyStaffCountRange }}I also only want to speak to countries that are in the US, UK, Europe or AustraliaLocation - {{ $json.geo.country }} {{ $json.geo.countryCode }}Their job title needs to also be a senior job title so anything that countains, Head of, Director, VP, C-level.ORIt contains the following keywords - Influencer, Strategy OR it contains GTM or Growth regardless of the seniorty wich is TRUE regardless of seniorty.Job title - {{ $json.position[0].title }}Employment Status - {{ $json.position[0].employmentType }}Start Date - {{ $json.position[0].start.year }}End Date - {{ $json.position[0].end.year }}IF all true mark as true is 1 thing is false mark as false. IF one of these is false and the rest are true mark as true. Unless the location contains India, Pakistan, Banglisdesh etc.If their job title contains Advisor, Contractor, Creator, Investor, Host etc (essentually any job title that suggests they could be wokring thier part time just their second job experience)industry - {{ $json.position[1].companyIndustry }}company name - {{ $json.position[1].companyName }}company size - {{ $json.position[1].companyStaffCountRange }}Start Date - {{ $json.position[1].start.year }}End Date - {{ $json.position[1].end.year }} {{ $json.position[1].end.month }} {{ $json.position[1].end.day }}If their end data in their second job has older than todays date you know they no longer work their.. - Attach Anthropic Chat Engine as the language model for AI Qualification Logic.
Credential Required: Connect your anthropicApi credentials. - Attach Parse AI Result as the output parser for AI Qualification Logic and set JSON Schema Example to
{ "result": true }. (Parser is a sub-node; keep credentials on Anthropic Chat Engine.) - In Qualification Branch, set the condition to evaluate Left Value
{{ $json.output.result }}with the boolean true operation. - Configure Send to Clay Qualified and Send to Clay Unqualified with their respective Clay webhook URLs and body parameters like Email
{{ $('Incoming Webhook Trigger').item.json.body.email }}and Company Name{{ $('Fetch Trigify Enrichment').item.json.position[0].companyName }}. - Set flags using Set Qualified Flag (output =
true) and Set Unqualified Flag (output =false), then connect Set Qualified Flag to Return Webhook Reply.
Tip: Keep Return Webhook Reply immediately after Set Qualified Flag to respond quickly to the webhook while follow-up tasks continue later.
Step 4: Configure Booking Check and Delay
After responding to the webhook, the workflow waits, checks for a booking in Cal.com, and only then triggers the AI follow-up.
- In Delay Timer, set Unit to
minutesand define your wait duration. - Configure Check Cal Booking with URL
https://api.cal.com/v2/bookingsand query parameter attendeeEmail set to{{ $('Incoming Webhook Trigger').item.json.body.email }}. - In Check Cal Booking → Header Parameters, set Authorization to
Bearer [CONFIGURE_YOUR_API_KEY]and cal-api-version to2024-08-13. - In Booking Status Check, set the condition to check Left Value
{{ $json.data[0].start }}is notEmpty.
⚠️ Common Pitfall: Replace [CONFIGURE_YOUR_API_KEY] with your Cal.com API key or the booking check will always fail.
Step 5: Configure AI Follow-up and Instantly Delivery
If no booking is found, an AI follow-up sentence is composed with web research and the lead is added to Instantly.
- Configure AI Followup Composer with Text set to
Run task.and System Message set to the provided prompt beginning with=Prospect Follow-Up Email Generatorand ending withNow, please research the prospect's company and provide your improved sentence.. - Attach Anthropic Chat Engine 2 as the language model for AI Followup Composer.
Credential Required: Connect your anthropicApi credentials. - Attach Parse Followup Output as the output parser and set JSON Schema Example to
{ "Sentence": "I'd love to show you exactly how you can leverage our Social Intelligence tool to help you research emerging telecom trends and customer sentiment patterns, giving HLR Lookup a competitive edge in identifying new market opportunities before other mobile validation providers even know they exist." }. (Parser is a sub-node; keep credentials on Anthropic Chat Engine 2.) - Configure Web Research Tool with URL
https://api.openai.com/v1/responses, MethodPOST, and JSON Body{ "model": "gpt-4o", "tools": [{"type": "web_search_preview"}], "input": "{placeholder}" }. Add Authorization headerBearer [CONFIGURE_YOUR_API_KEY]. This tool is attached to AI Followup Composer, so manage model credentials on the parent node. - Configure Add Lead to Instantly with URL
https://api.instantly.ai/api/v2/leadsand set the JSON Body to{ "campaign": "[YOUR_ID]", "email": "{{ $('Incoming Webhook Trigger').item.json.body.email }}", "first_name": "{{ $node['Fetch Trigify Enrichment'].json.firstName }}", "last_name": "{{ $node['Fetch Trigify Enrichment'].json.lastName }}", "company_name": "{{ $node['Fetch Trigify Enrichment'].json.position[0].companyName }}", "custom_variables": { "research": "{{ $json.output.Sentence }}" } }. - In Add Lead to Instantly → Header Parameters, set Authorization to
Bearer [CONFIGURE_YOUR_API_KEY]and Content-Type toapplication/json.
⚠️ Common Pitfall: Replace [YOUR_ID] and [CONFIGURE_YOUR_API_KEY] with live Instantly credentials, or lead creation will fail.
Step 6: Test and Activate Your Workflow
Verify data flows through qualification, booking checks, and follow-up delivery before enabling the workflow for production.
- Click Execute Workflow and send a test POST request to the Incoming Webhook Trigger URL with sample
body.source,body.email, andbody.linkedinUrl. - Confirm Source Gate Check routes correctly to Send to Clay Unbooked or Fetch Trigify Enrichment.
- Verify Qualification Branch routes to Send to Clay Qualified or Send to Clay Unqualified, and that Return Webhook Reply returns a response.
- After the delay, validate Check Cal Booking and Booking Status Check behavior, and ensure Add Lead to Instantly receives the AI-generated
Sentence. - When the test run is successful, toggle the workflow to Active to enable production intake.
Common Gotchas
- Cal.com credentials can expire or need specific permissions. If things break, check your Cal.com API token and the endpoint response in the n8n execution 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
Plan for about an hour if your API keys and form fields are ready.
No. You’ll mostly connect accounts, paste API keys, and map a handful of fields in n8n.
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 AI and enrichment costs (Trigify and Anthropic/OpenAI), which are usually a few dollars a month at low volume.
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.
Yes, and you should. The quickest win is adjusting the AI Qualification Logic prompt and the Qualification Branch “If” rules so they match your ICP. Many teams also tweak the geographic filters (US/UK/Europe/Australia), change what counts as “senior” titles, and add a hard rule for email domain type (personal vs. company).
Usually it’s an expired or incorrect Cal.com API token. Check the HTTP Request node that calls Cal.com, then look at the last execution output in n8n to see the status code and error message. If the token is fine, it can also be the endpoint path (some Cal.com setups vary) or a missing permission for the booking resource you’re trying to read.
On a typical small setup, hundreds per month is realistic, and self-hosting removes execution caps entirely.
Often, yes, because this flow needs branching logic, delayed checks, structured AI outputs, and multiple HTTP calls that can get pricey or awkward elsewhere. n8n handles that kind of “funnel logic” without turning every condition into a paid add-on. Zapier or Make can still be fine if you only want a simple Slack ping when a form is submitted, no enrichment, no qualification, no booking verification. The moment you care about fit, timing, and consistent follow-ups, you’ll want the extra control. If you’re torn, Talk to an automation expert and we’ll sanity-check your use case.
Once this is running, demo requests stop being a daily fire drill. The workflow handles the repetitive sorting and follow-up setup so your team can focus on the conversations that actually convert.
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.