{"id":"QO4Mg23JvVfNCICy","meta":{"instanceId":"workflow-8ac7d4ad","versionId":"1.0.0","createdAt":"2025-09-29T07:07:59.228758","updatedAt":"2025-09-29T07:07:59.228773","owner":"n8n-user","license":"MIT","category":"automation","status":"active","priority":"high","environment":"production"},"name":"Build a Phone Agent to qualify outbound leads and inbound calls with RetellAI -vide","nodes":[{"id":"78f39980-c9f8-49b6-93bb-a1f61d347ac3","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-240,0],"parameters":{"width":1260,"height":320,"content":"# Outbound lead qualification call workflow"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"661006b9-dac7-4ac0-882a-2e0cba9dbae1","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-240,360],"parameters":{"color":5,"width":1260,"height":320,"content":"# Inbound call appointment scheduler workflow"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"96a278b9-8d2e-4f85-9f6a-2997932a7ca4","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[1060,-420],"parameters":{"color":4,"width":1400,"height":1100,"content":"# Post-call workflow\n## Triggers when a new lead is added in Google Sheets:\n\n### 1 -Sends SMS to remind rep to call in 5 min\n### 2- (Optional delay step)\n### 3- Triggers RetellAI to place an automated call to the lead\n\n## 💡 Requires phone numbers to be formatted in E.164"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"d082f904-f185-4615-b0d8-9438c731786f","name":"Detect new lead in Google Sheets","type":"n8n-nodes-base.googleSheetsTrigger","position":[-160,100],"parameters":{"event":"rowAdded","options":{},"pollTimes":{"item":[{"mode":"everyHour"}]},"sheetName":{"__rl":true,"mode":"id","value":"="},"documentId":{"__rl":true,"mode":"id","value":"="}},"credentials":{"googleSheetsTriggerOAuth2Api":{"id":"pXaVMshaL2QzVDYh","name":"Google Sheets Trigger account"}},"typeVersion":1,"notes":"This googleSheetsTrigger node performs automated tasks as part of the workflow."},{"id":"c61172c2-7795-47be-acaa-d4824ca69680","name":"Send SMS reminder to call lead in 5 minutes","type":"n8n-nodes-base.twilio","position":[140,100],"parameters":{"to":"={{ $json['Phone Number'] }}","from":"+33600000000","message":"Hello, thanks for your interest in our roofing services. We'll be calling you shortly to ask about your project!","options":{},"resource":"call"},"credentials":{"twilioApi":{"id":"udXVmM3xHYZbMW4g","name":"Twilio account"}},"typeVersion":1,"notes":"This twilio node performs automated tasks as part of the workflow."},{"id":"d88573d4-ec99-40e4-8603-f1e910d034d1","name":"Wait 5 minutes before making call","type":"n8n-nodes-base.wait","position":[460,100],"webhookId":"344c2d5d-5629-4466-866b-ac6359b3b042","parameters":{"unit":"minutes","amount":1},"typeVersion":1.1,"notes":"This wait node performs automated tasks as part of the workflow."},{"id":"d6778895-90dd-471e-9d9d-c48a35154291","name":"Call new lead using RetellAI","type":"n8n-nodes-base.httpRequest","position":[760,100],"parameters":{"url":"{{ $env.API_BASE_URL }}","method":"POST","options":{},"jsonBody":"={\n  \"from_number\": \"+33600000000\",\n  \"to_number\": \"{{ $json['Phone Number'] }}\",\n  \"retell_llm_dynamic_variables\": {\n    \"uuid\": \"{{ $('Detect new lead in Google Sheets').item.json.UUID }}\"\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer key_XXXXXXXXX"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2,"notes":"This httpRequest node performs automated tasks as part of the workflow."},{"id":"8e7e7c0c-2600-4b20-ba30-b855d456d302","name":"Receive inbound call from RetellAI (webhook)","type":"n8n-nodes-base.webhook","position":[-160,460],"webhookId":"ebd11c9b-129c-4b59-8c27-9a4b567305f7","parameters":{"path":"ebd11c9b-129c-4b59-8c27-9a4b567305f7","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2,"notes":"This webhook node performs automated tasks as part of the workflow."},{"id":"36bf25b0-d39d-4127-b005-5e3619069744","name":"Check if phone number exists in Google Sheets","type":"n8n-nodes-base.googleSheets","position":[300,460],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"={{ $json.body.call_inbound.from_number }}","lookupColumn":"Phone Number"}]},"sheetName":{"__rl":true,"mode":"id","value":"="},"documentId":{"__rl":true,"mode":"id","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"51us92xkOlrvArhV","name":"Google Sheets account"}},"typeVersion":4.5,"notes":"This googleSheets node performs automated tasks as part of the workflow."},{"id":"0b2dc7b9-84c1-488b-9d02-47cf6ee460c7","name":"Send response to inbound webhook call","type":"n8n-nodes-base.respondToWebhook","position":[760,460],"parameters":{"options":{},"respondWith":"json","responseBody":"={\n  \"call_inbound\": {\n    \"dynamic_variables\": {\n        \"name\": \"{{ $json.Name }}\"\n    }\n  }\n}"},"typeVersion":1.1,"notes":"This respondToWebhook node performs automated tasks as part of the workflow."},{"id":"063a4a31-429f-4cf0-b248-869131e92633","name":"Receive post-call data from RetellAI (webhook)","type":"n8n-nodes-base.webhook","position":[1180,80],"webhookId":"f8878b78-43ea-4caa-b16c-cde9aaf2e9b1","parameters":{"path":"f8878b78-43ea-4caa-b16c-cde9aaf2e9b1","options":{},"httpMethod":"POST"},"typeVersion":2,"notes":"This webhook node performs automated tasks as part of the workflow."},{"id":"215e2031-983a-4785-b46d-026f64c115e4","name":"Filter for analyzed calls only","type":"n8n-nodes-base.filter","position":[1400,80],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"a0e40476-0054-43ec-b7a7-e872d1c6061a","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.body.event }}","rightValue":"call_analyzed"}]}},"typeVersion":2.2,"notes":"This filter node performs automated tasks as part of the workflow."},{"id":"f8cae0c3-1b5d-47e6-b7fd-b47558c30d3f","name":"Check if call was outbound","type":"n8n-nodes-base.if","position":[1620,80],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"46590184-4e33-48fd-a9f4-c63b13f88c1f","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.body.call.direction }}","rightValue":"outbound"}]}},"typeVersion":2.2,"notes":"This if node performs automated tasks as part of the workflow."},{"id":"8997d5ec-bfb9-4ce9-9e13-6035f02b634e","name":"Update lead record in Google Sheets","type":"n8n-nodes-base.googleSheets","position":[1860,-40],"parameters":{"columns":{"value":{"UUID":"={{ $json.body.call.retell_llm_dynamic_variables.uuid }}","Qualification":"={{ $json.body.call.call_analysis.custom_analysis_data.qualification }}"},"schema":[{"id":"UUID","type":"string","display":true,"removed":false,"required":false,"displayName":"UUID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Name","type":"string","display":true,"required":false,"displayName":"Name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Phone Number","type":"string","display":true,"required":false,"displayName":"Phone Number","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Datetime Called","type":"string","display":true,"required":false,"displayName":"Datetime Called","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Qualification","type":"string","display":true,"required":false,"displayName":"Qualification","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":true,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["UUID"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"id","value":"="},"documentId":{"__rl":true,"mode":"id","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"51us92xkOlrvArhV","name":"Google Sheets account"}},"typeVersion":4.5,"notes":"This googleSheets node performs automated tasks as part of the workflow."},{"id":"20757ff8-6604-4c80-96ec-32bfac983ed7","name":"Send call summary email","type":"n8n-nodes-base.gmail","position":[2220,-40],"webhookId":"806ec3f9-8bcb-48ef-8e22-9d1ce3b06bf0","parameters":{"sendTo":"youremail@gmail.com","message":"=Name:\n{{ $json.body.call.call_analysis.custom_analysis_data.first_name }}\n\nNumber:\n{{ $json.body.call.call_analysis.custom_analysis_data.phone_number }}\n\nQualification:\n{{ $json.body.call.call_analysis.custom_analysis_data.qualification }}\n\n\nCall Summary:\n{{ $json.body.call.call_analysis.custom_analysis_data.call_summary }}","options":{},"subject":"=New Lead - Call Summary","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"rKxQHWZ2F5XLJmwF","name":"Gmail account"}},"typeVersion":2.1,"notes":"This gmail node performs automated tasks as part of the workflow."},{"id":"753bd92d-b95b-4710-bf49-6da89a43223f","name":"Generate call summary with OpenAI","type":"n8n-nodes-base.noOp","position":[1860,180],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4.1","cachedResultName":"GPT-4.1"},"options":{},"messages":{"values":[{"content":"=Analyze this call transcript to identify how the call went and identify possible improvements to the voice prompt:\n\n{{ $json.body.call.transcript }}"}]}},"credentials":{"openAiApi":{"id":"6h3DfVhNPw9I25nO","name":"OpenAi account"}},"typeVersion":1,"notes":"This openAi node performs automated tasks as part of the workflow."},{"id":"cf600277-bb07-4f7a-a9b7-3e20017f716d","name":"Send confirmation email to lead","type":"n8n-nodes-base.gmail","position":[2220,180],"webhookId":"453fe9d9-1de6-40a2-bd0c-88cb9c1cc7ef","parameters":{"sendTo":"youremail@gmail.com","message":"=New roofing appointment:\n\nClient Name:\n{{ $('Check if call was outbound').item.json.body.call.call_analysis.custom_analysis_data.first_name }}\n\nClient Number:\n{{ $('Check if call was outbound').item.json.body.call.call_analysis.custom_analysis_data.phone_number }}\n\nAvailabilities:\n{{ $('Check if call was outbound').item.json.body.call.call_analysis.custom_analysis_data.availabilities }}\n\n\nCall Summary:\n{{ $('Check if call was outbound').item.json.body.call.call_analysis.call_summary }}\n\n\nChatGPT analysis of how the call went and suggestions for improving the voice prompt:\n{{ $json.message.content }}","options":{},"subject":"=Roofing Appointment Scheduled","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"rKxQHWZ2F5XLJmwF","name":"Gmail account"}},"typeVersion":2.1,"notes":"This gmail node performs automated tasks as part of the workflow."},{"id":"f75763b6-0867-4625-89e1-cafa3c9e6e44","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-240,-420],"parameters":{"width":1260,"height":400,"content":"# ✅ General Workflow Explanation\n##  This workflow automates outbound and inbound lead calls with RetellAI, Google Sheets, OpenAI, and Gmail. It handles:\n\nScheduling and reminding outbound qualification calls\nHandling inbound appointment calls\nAutomatically updating records and sending summaries post-call\n\n## 👉 Dependencies:\n\nActive RetellAI API key\nGoogle Sheet set up with lead data\nGmail API credentials configured"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."}],"active":false,"settings":{"executionOrder":"v1","saveManualExecutions":true,"callerPolicy":"workflowsFromSameOwner","errorWorkflow":null,"timezone":"UTC","executionTimeout":3600,"maxExecutions":1000,"retryOnFail":true,"retryCount":3,"retryDelay":1000},"versionId":"879f8e4d-91d7-41fc-825d-08f2ef283c25","connections":{"Call new lead using RetellAI":{"main":[[],[],[],[],[],[],[],[],[]]},"Receive inbound call from RetellAI (webhook)":{"main":[[],[],[],[],[],[],[],[],[]]},"Send response to inbound webhook call":{"main":[[],[],[],[],[],[],[],[],[]]},"Receive post-call data from RetellAI (webhook)":{"main":[[],[],[],[],[],[],[],[],[]]},"Detect new lead in Google Sheets":{"main":[[]]},"Check if phone number exists in Google Sheets":{"main":[[]]},"Update lead record in Google Sheets":{"main":[[]]},"Generate call summary with OpenAI":{"main":[[]]}},"description":"Automated workflow: Build a Phone Agent to qualify outbound leads and inbound calls with RetellAI -vide. This workflow integrates 13 different services: webhook, stickyNote, httpRequest, filter, wait. It contains 30 nodes and follows best practices for error handling and security.","notes":"Excellent quality workflow: Build a Phone Agent to qualify outbound leads and inbound calls with RetellAI -vide. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}