Transform your lead list into an AI-powered calling machine. This workflow automates your entire cold calling process using Vapi's conversational AI to initiate calls, qualify leads, capture detailed insights, and manage intelligent follow-ups - achieving 10x more calls than manual efforts while maintaining personalized, professional conversations.
Built for sales teams, recruiters, and customer success professionals who need to scale outreach without sacrificing quality or adding headcount.
The workflow operates through two parallel processes:
Create a Google Sheet with these exact columns (case-sensitive):
Customer_id | Name | Phone Number | Email | Status | Recording URL | Transcript | Summary | Interest | Call Duration | Retry count | Last attempt | Call ID
Initial Setup:
Customer_id
: Unique identifier (e.g., LEAD001)Name
: Full name for personalizationPhone Number
: International format (+14155551234)Email
: For follow-up campaignsStatus
: Set to "Pending"Retry count
: Set to 0Create Your AI Voice Agent
Assistant ID
Set Up Phone Number
Phone Number ID
Import to n8n
Cold_calling_loop.json
Connect Credentials
Authorization
Bearer YOUR_API_KEY
Update Configuration
assistantId
and phoneNumberId
[New Lead: Pending] → [Call Initiated] → [Completed/Failed]
↓
[Retry Scheduled] ← (if failed & retry < 5)
Retry Limit Check (If1 Node)
Retry count ≤ 5
Call Completion Check (If2 Node)
Status Routing (If4 Node)
Node | Type | Purpose | Configuration |
---|---|---|---|
Get Leads from Sheet1 | Google Sheets | Fetches eligible leads | Filter: Status = "Pending" OR "Retry Scheduled" |
HTTP Request | HTTP | Initiates Vapi call | POST to api.vapi.ai/call with assistant config |
Loop Over Items | Split In Batches | Processes leads individually | Batch size: 1, ensures sequential processing |
Get Call Data | HTTP | Retrieves call results | GET from api.vapi.ai/call?id={callId} |
Edit Fields2 | Set | Formats result data | Maps Vapi response to sheet columns |
Node | Updates | Trigger |
---|---|---|
Update Status - Calling1 | "Call Initiated" | After successful API call |
Update Status - Calling | "Done" + results | When call completed successfully |
Update Status - for Missed call | "Retry Scheduled" | When call failed/no answer |
Update Status - Calling3 | "Retry Done" | After retry limit reached |
Node | Function | Logic |
---|---|---|
If1 | Retry validation | Checks retry count ≤ 5 |
If2 | Result validation | Verifies call completion |
Wait | Retry delay | Pauses before retry attempt |
Merge | Path combination | Unifies success/retry flows |
// Add to Code node for progressive delays
const retryCount = $json["Retry count"];
const delays = {
1: 30, // 30 minutes
2: 120, // 2 hours
3: 1440, // Next day
4: 2880, // 2 days
5: 10080 // 1 week
};
return { waitMinutes: delays[retryCount] || 60 };
// Add before HTTP Request node
const now = new Date();
const hour = now.getHours();
const day = now.getDay();
const isWeekday = day >= 1 && day <= 5;
const isBusinessHours = hour >= 9 && hour <= 17;
if (!isWeekday || !isBusinessHours) {
throw new Error('Outside calling hours');
}
{
"assistantId": "your-assistant-id",
"phoneNumberId": "your-phone-id",
"customer": {
"number": "+{{ $json['Phone Number'] }}",
"name": "{{ $json.Name }}",
"customData": {
"company": "{{ $json.Company }}",
"lastPurchase": "{{ $json['Last Purchase Date'] }}",
"accountValue": "{{ $json['Account Value'] }}",
"preferredProduct": "{{ $json['Product Interest'] }}"
}
}
}
Location: Near Google Sheets nodes
📊 LEAD STATUS FLOW:
Pending → Call Initiated → Done/Retry Scheduled
Retry Scheduled → Call Initiated → Done/Failed
⚠️ Max retries: 5 attempts
❌ Failed = No answer after 5 tries
✅ Done = Call completed with results
Location: Near HTTP Request nodes
📱 PHONE NUMBER FORMAT:
✅ Correct: +14155551234
❌ Wrong: (415) 555-1234
❌ Wrong: 415-555-1234
Must include:
- Plus sign (+)
- Country code
- No spaces or symbols
Location: At workflow start
🔧 VAPI CONFIGURATION:
□ Assistant ID copied from Vapi
□ Phone Number ID from Vapi
□ API Key in credentials
□ Credits available
□ Assistant tested in playground
Location: Near Loop nodes
⚡ OPTIMIZATION TIPS:
• Batch size: 10-20 leads
• Call hours: 9 AM - 5 PM local
• Delay between calls: 5 seconds
• Monthly archive old records
• Monitor Vapi credit usage
Cause: Expired or invalid credentials
Fix:
Cause: Invalid phone format or Vapi configuration
Fix:
Cause: Call still processing or webhook failure
Fix:
Cause: Status not updating correctly
Fix:
Cause: Bot permissions or channel access
Fix:
File | Description | Location |
---|---|---|
Cold_calling_loop.json |
Complete workflow configuration | Main workflow file |
lead_template.xlsx |
Google Sheets template with headers | Sample data file |
Sales & Marketing Automation
cold-calling
vapi-ai
voice-automation
lead-generation
ai-sales
google-sheets
outbound-calling
sales-automation
conversational-ai
crm-automation
b2b-sales
recruitment
customer-success
market-research
appointment-setting
lead-qualification
follow-up-automation
vapi
google-sheets
slack
voice-ai
telephony
Support email : [email protected]