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 IDSet Up Phone Number
Phone Number IDImport to n8n
Cold_calling_loop.jsonConnect Credentials
AuthorizationBearer YOUR_API_KEYUpdate Configuration
assistantId and phoneNumberId[New Lead: Pending] → [Call Initiated] → [Completed/Failed]
↓
[Retry Scheduled] ← (if failed & retry < 5)
Retry Limit Check (If1 Node)
Retry count ≤ 5Call 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]