This workflow corresponds to n8n.io template #8339 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "2LmDZfiiWbiwfr3O",
"name": "Replace Your Call Center with an AI Agent using GHL, VAPI & Twilio",
"tags": [
{
"id": "7ASMGI4lVr4Eo8rL",
"name": "tuguidragos.com",
"createdAt": "2025-08-23T19:10:40.177Z",
"updatedAt": "2025-08-23T19:10:40.177Z"
}
],
"nodes": [
{
"id": "87c2c60a-51e9-4770-b345-609654a8e61a",
"name": "Step 1 - Create Customer",
"type": "n8n-nodes-base.httpRequest",
"position": [
1568,
416
],
"parameters": {},
"typeVersion": 4.2
},
{
"id": "eac43602-e32b-483b-b083-1e7f3a521343",
"name": "Step 2 - Initiate Call",
"type": "n8n-nodes-base.httpRequest",
"position": [
2032,
416
],
"parameters": {},
"typeVersion": 4.2
},
{
"id": "b5f84758-e905-4318-aac1-ef40ee0a3f4d",
"name": "Step 3 - Get Call Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
48,
800
],
"parameters": {},
"typeVersion": 4.2
},
{
"id": "76b0d242-7903-489d-a881-92913f0f0047",
"name": "Step 4 - Set (Parse Call Result)",
"type": "n8n-nodes-base.set",
"position": [
480,
800
],
"parameters": {},
"typeVersion": 3.4
},
{
"id": "bd6e0c9d-40b9-46a5-a1f5-df4419b20ab9",
"name": "Step 5 - If (Call Answered?)",
"type": "n8n-nodes-base.if",
"position": [
720,
800
],
"parameters": {},
"typeVersion": 2.2
},
{
"id": "7890936a-3524-439e-ad9b-470b432f0108",
"name": "Set Attempt Count + Init Status",
"type": "n8n-nodes-base.code",
"position": [
1552,
800
],
"parameters": {},
"typeVersion": 2
},
{
"id": "87d1c39d-93e8-4233-af70-d89b9f5cd0f8",
"name": "Get Call Status from VAPI",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
1792,
800
],
"parameters": {},
"retryOnFail": true,
"typeVersion": 4.2
},
{
"id": "65608f46-d233-4eb2-a3d7-d7840678c913",
"name": "Check Final Status + shouldContinue Logic",
"type": "n8n-nodes-base.code",
"position": [
2032,
800
],
"parameters": {},
"typeVersion": 2
},
{
"id": "2076cd94-af6e-4a73-b19a-90ffbac9eec4",
"name": "Prepare Loop Payload",
"type": "n8n-nodes-base.set",
"position": [
2784,
784
],
"parameters": {},
"typeVersion": 3.4
},
{
"id": "e7b46a53-8a57-4d1e-9741-4dc1056f0c67",
"name": "Should Continue Loop?",
"type": "n8n-nodes-base.if",
"position": [
2288,
800
],
"parameters": {},
"typeVersion": 2.2
},
{
"id": "a04b6957-a80c-4d70-b24e-a43dc5979777",
"name": "Wait Before Retry",
"type": "n8n-nodes-base.wait",
"position": [
2560,
784
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "6563cd57-bc97-46c9-b4b8-4009d181d267",
"name": "Filter Valid Leads",
"type": "n8n-nodes-base.code",
"position": [
720,
432
],
"parameters": {},
"typeVersion": 2
},
{
"id": "56d5586a-9e5b-4842-afe5-617d215bfedd",
"name": "Has Leads to Process?",
"type": "n8n-nodes-base.if",
"position": [
960,
432
],
"parameters": {},
"executeOnce": false,
"typeVersion": 2.2,
"alwaysOutputData": false
},
{
"id": "4e562af9-9fb2-4e53-bf74-b6eb3e2284d0",
"name": "Loop Setup Variables",
"type": "n8n-nodes-base.set",
"position": [
2288,
416
],
"parameters": {},
"typeVersion": 3.4
},
{
"id": "49f0f3d6-eeaf-4fb5-8164-237db332e1d6",
"name": "Wait Before Contacts Refresh",
"type": "n8n-nodes-base.wait",
"position": [
48,
80
],
"parameters": {},
"executeOnce": false,
"typeVersion": 1.1
},
{
"id": "aceec85a-b410-4af7-80c7-94e50a183696",
"name": "Add Call Status Tag",
"type": "n8n-nodes-base.highLevel",
"position": [
272,
800
],
"parameters": {},
"typeVersion": 2
},
{
"id": "813de614-018b-40dc-a3c9-ec252d1f7576",
"name": "Update Contact - Call Summary",
"type": "n8n-nodes-base.highLevel",
"position": [
992,
800
],
"parameters": {},
"typeVersion": 2
},
{
"id": "3787960c-7b84-419c-b958-09af52259681",
"name": "Wait Before Refresh",
"type": "n8n-nodes-base.wait",
"position": [
960,
80
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "5442819c-12a6-4164-bfaf-1dacec9f9bfb",
"name": "GHL Paginated Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
496,
432
],
"parameters": {},
"typeVersion": 4.2
},
{
"id": "b419734c-9df6-47e8-a53b-c0a0c1c10cb2",
"name": "Step 1.5 - Select Random Agent",
"type": "n8n-nodes-base.code",
"position": [
1792,
416
],
"parameters": {},
"typeVersion": 2
},
{
"id": "e8e02d25-396c-4e67-90c9-79295e554258",
"name": "GHL Paginated Updated",
"type": "n8n-nodes-base.httpRequest",
"position": [
496,
80
],
"parameters": {},
"typeVersion": 4.2
},
{
"id": "9327ef48-0528-45c0-a57e-bb5c8473ad6d",
"name": "Start Calls - 9AM EST",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
48,
432
],
"parameters": {},
"typeVersion": 1.2
},
{
"id": "7a7cf8dd-f84b-4b1c-83c5-4c1a6c9cdecb",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
720
],
"parameters": {
"content": ""
},
"typeVersion": 1
},
{
"id": "6d9ed469-92ec-499c-8585-776ad30723b4",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1504,
720
],
"parameters": {
"content": ""
},
"typeVersion": 1
},
{
"id": "7ecbe991-add5-4f9b-b0d9-30fc6db5c544",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1504,
320
],
"parameters": {
"content": ""
},
"typeVersion": 1
},
{
"id": "7d6631d9-3ee3-44db-a668-a0282b871333",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
320
],
"parameters": {
"content": ""
},
"typeVersion": 1
},
{
"id": "f842e9c2-b51c-49a1-bfc2-206cc7a9fce6",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"content": ""
},
"typeVersion": 1
},
{
"id": "672cfaee-b7bf-4764-8863-01d25a5458cd",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
320
],
"parameters": {
"content": ""
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "1d04251d-c977-4d1f-b41d-e8194ff948d6",
"connections": {
"Wait Before Retry": {
"main": [
[
{
"node": "Prepare Loop Payload",
"type": "main",
"index": 0
}
]
]
},
"Filter Valid Leads": {
"main": [
[
{
"node": "Has Leads to Process?",
"type": "main",
"index": 0
}
]
]
},
"Add Call Status Tag": {
"main": [
[
{
"node": "Step 4 - Set (Parse Call Result)",
"type": "main",
"index": 0
}
]
]
},
"Wait Before Refresh": {
"main": [
[
{
"node": "GHL Paginated Request",
"type": "main",
"index": 0
}
]
]
},
"Loop Setup Variables": {
"main": [
[
{
"node": "Set Attempt Count + Init Status",
"type": "main",
"index": 0
}
]
]
},
"Prepare Loop Payload": {
"main": [
[
{
"node": "Set Attempt Count + Init Status",
"type": "main",
"index": 0
}
]
]
},
"GHL Paginated Request": {
"main": [
[
{
"node": "Filter Valid Leads",
"type": "main",
"index": 0
}
]
]
},
"GHL Paginated Updated": {
"main": [
[
{
"node": "Wait Before Refresh",
"type": "main",
"index": 0
}
]
]
},
"Has Leads to Process?": {
"main": [
[
{
"node": "Step 1 - Create Customer",
"type": "main",
"index": 0
}
]
]
},
"Should Continue Loop?": {
"main": [
[
{
"node": "Wait Before Retry",
"type": "main",
"index": 0
}
],
[
{
"node": "Step 3 - Get Call Data",
"type": "main",
"index": 0
}
]
]
},
"Start Calls - 9AM EST": {
"main": [
[
{
"node": "GHL Paginated Request",
"type": "main",
"index": 0
}
]
]
},
"Step 2 - Initiate Call": {
"main": [
[
{
"node": "Loop Setup Variables",
"type": "main",
"index": 0
}
]
]
},
"Step 3 - Get Call Data": {
"main": [
[
{
"node": "Add Call Status Tag",
"type": "main",
"index": 0
}
]
]
},
"Step 1 - Create Customer": {
"main": [
[
{
"node": "Step 1.5 - Select Random Agent",
"type": "main",
"index": 0
}
]
]
},
"Get Call Status from VAPI": {
"main": [
[
{
"node": "Check Final Status + shouldContinue Logic",
"type": "main",
"index": 0
}
]
]
},
"Step 5 - If (Call Answered?)": {
"main": [
[
{
"node": "Wait Before Contacts Refresh",
"type": "main",
"index": 0
},
{
"node": "Update Contact - Call Summary",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait Before Contacts Refresh",
"type": "main",
"index": 0
},
{
"node": "Update Contact - Call Summary",
"type": "main",
"index": 0
}
]
]
},
"Wait Before Contacts Refresh": {
"main": [
[
{
"node": "GHL Paginated Updated",
"type": "main",
"index": 0
}
]
]
},
"Step 1.5 - Select Random Agent": {
"main": [
[
{
"node": "Step 2 - Initiate Call",
"type": "main",
"index": 0
}
]
]
},
"Set Attempt Count + Init Status": {
"main": [
[
{
"node": "Get Call Status from VAPI",
"type": "main",
"index": 0
}
]
]
},
"Step 4 - Set (Parse Call Result)": {
"main": [
[
{
"node": "Step 5 - If (Call Answered?)",
"type": "main",
"index": 0
}
]
]
},
"Check Final Status + shouldContinue Logic": {
"main": [
[
{
"node": "Should Continue Loop?",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
The AI Calling Agent is a fully automated phone assistant built with n8n, GoHighLevel (GHL), VAPI, and Twilio. This workflow allows you to: Trigger outbound calls from your CRM (GHL). Use a voice AI assistant (VAPI) to talk with leads in real time. Route calls through Twilio.…
Source: https://n8n.io/workflows/8339/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This project is specifically built for an HVAC business to automatically upsell to old customers when their locality has a heatwave or snow wave forecast in the upcoming five days.
Master Agent - Orchestrator. Uses httpRequest, telegram, telegramTrigger. Scheduled trigger; 46 nodes.
Reputation Engine — Content Research Agent. Uses httpRequest. Scheduled trigger; 45 nodes.
Master Agent - Orchestrator. Uses httpRequest, telegram, telegramTrigger. Scheduled trigger; 43 nodes.
Linkedin Workflow. Uses httpRequest, googleSheets. Scheduled trigger; 39 nodes.