This workflow corresponds to n8n.io template #12742 — we link there as the canonical source.
This workflow follows the Agent → Emailsend recipe pattern — see all workflows that pair these two integrations.
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": "XiyfwUtCqlOClXGM",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "HVAC Lead Capture and Automated Service Routing",
"tags": [],
"nodes": [
{
"id": "6d09359d-ead5-4b51-90aa-df4747713963",
"name": "Lead Submission Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
-1888,
432
],
"parameters": {
"options": {
"appendAttribution": false
},
"formTitle": "HVAC Service Request",
"formFields": {
"values": [
{
"fieldLabel": "Full Name",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Email Address",
"requiredField": true
},
{
"fieldLabel": "Phone Number",
"requiredField": true
},
{
"fieldLabel": "Property Address",
"requiredField": true
},
{
"fieldType": "dropdown",
"fieldLabel": "Service Type",
"fieldOptions": {
"values": [
{
"option": "Installation"
},
{
"option": "Repair"
},
{
"option": "Maintenance"
}
]
},
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Describe Your HVAC Need",
"requiredField": true
}
]
},
"formDescription": "Submit your HVAC service needs and we will get back to you shortly"
},
"typeVersion": 2.3
},
{
"id": "c60a3794-48b2-4cd9-b04e-333046bc82c7",
"name": "Workflow Configuration",
"type": "n8n-nodes-base.set",
"position": [
-1664,
432
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "installationSlackChannel",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Installation Team Slack Channel ID__>"
},
{
"id": "id-2",
"name": "repairSlackChannel",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Repair Team Slack Channel ID__>"
},
{
"id": "id-3",
"name": "maintenanceSlackChannel",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Maintenance Team Slack Channel ID__>"
},
{
"id": "id-4",
"name": "calendarId",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Google Calendar ID for appointments__>"
},
{
"id": "id-5",
"name": "crmApiUrl",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__CRM/Dispatch System API URL__>"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "00d690f5-6fe8-4b47-869e-0f918bb096d1",
"name": "Normalize Lead Data",
"type": "n8n-nodes-base.set",
"position": [
-1440,
432
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "leadName",
"type": "string",
"value": "={{ $json['Full Name'] }}"
},
{
"id": "id-2",
"name": "leadEmail",
"type": "string",
"value": "={{ $json['Email Address'] }}"
},
{
"id": "id-3",
"name": "leadPhone",
"type": "string",
"value": "={{ $json['Phone Number'] }}"
},
{
"id": "id-4",
"name": "leadAddress",
"type": "string",
"value": "={{ $json['Property Address'] }}"
},
{
"id": "id-5",
"name": "serviceType",
"type": "string",
"value": "={{ $json['Service Type'] }}"
},
{
"id": "id-6",
"name": "serviceDescription",
"type": "string",
"value": "={{ $json['Describe Your HVAC Need'] }}"
},
{
"id": "id-7",
"name": "submittedAt",
"type": "string",
"value": "={{ $now.toISO() }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "da3bb476-8152-4a84-8d77-ba162899e1b6",
"name": "Store Lead in Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1216,
432
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"leadEmail"
]
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "<__PLACEHOLDER_VALUE__Sheet Name (e.g., Leads)__>"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "<__PLACEHOLDER_VALUE__Google Sheets Document ID__>"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "4594e557-307a-4bd6-905a-955b1382970c",
"name": "Classify Lead Urgency and Service Type",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-992,
432
],
"parameters": {
"text": "=Lead Information:\nName: {{ $json.leadName }}\nService Type: {{ $json.serviceType }}\nDescription: {{ $json.serviceDescription }}\nAddress: {{ $json.leadAddress }}",
"options": {
"systemMessage": "You are an HVAC service lead classifier. Analyze the lead information and classify:\n1. Urgency level (Low, Medium, High, Emergency)\n2. Service category (Installation, Repair, Maintenance)\n\nConsider these factors for urgency:\n- Emergency: Words like \"not working\", \"broken\", \"no heat\", \"no cooling\", extreme temperatures\n- High: \"soon\", \"urgent\", \"ASAP\", comfort issues\n- Medium: Scheduled maintenance, non-critical repairs\n- Low: General inquiries, future planning\n\nReturn your classification in the structured format."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "d0ae0912-8325-4668-884b-d5ff361043c0",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-984,
656
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "eb3c050e-c91a-4d2e-a48f-af3d3cde5500",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-856,
656
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"urgency\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\": \"Urgency level: Low, Medium, High, or Emergency\"\n\t\t},\n\t\t\"serviceCategory\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\": \"Service category: Installation, Repair, or Maintenance\"\n\t\t},\n\t\t\"reasoning\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\": \"Brief explanation of the classification\"\n\t\t}\n\t}\n}"
},
"typeVersion": 1.3
},
{
"id": "6c3c9799-2435-4f6c-bfa1-6fd6fe0a0f3f",
"name": "Route by Service Type",
"type": "n8n-nodes-base.switch",
"position": [
-640,
416
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Installation",
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.output.serviceCategory }}",
"rightValue": "Installation"
}
]
},
"renameOutput": true
},
{
"outputKey": "Repair",
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.output.serviceCategory }}",
"rightValue": "Repair"
}
]
},
"renameOutput": true
},
{
"outputKey": "Maintenance",
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.output.serviceCategory }}",
"rightValue": "Maintenance"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.4
},
{
"id": "931273b7-3482-4420-8f62-8a633d77a7b0",
"name": "Notify Installation Team",
"type": "n8n-nodes-base.slack",
"position": [
-416,
240
],
"parameters": {
"text": "=\ud83c\udfe0 New Installation Lead - {{ $json.output.urgency }} Priority\n\n\ud83d\udc64 Customer: {{ $json.leadName }}\n\ud83d\udce7 Email: {{ $json.leadEmail }}\n\ud83d\udcde Phone: {{ $json.leadPhone }}\n\ud83d\udccd Address: {{ $json.leadAddress }}\n\n\ud83d\udcdd Details: {{ $json.serviceDescription }}\n\n\ud83e\udd16 AI Analysis: {{ $json.output.reasoning }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.installationSlackChannel }}"
},
"otherOptions": {}
},
"typeVersion": 2.4
},
{
"id": "0deb64ec-8ac0-4b40-94af-f9fb0c964534",
"name": "Notify Repair Team",
"type": "n8n-nodes-base.slack",
"position": [
-416,
432
],
"parameters": {
"text": "=\ud83d\udd27 New Repair Lead - {{ $json.output.urgency }} Priority\n\n\ud83d\udc64 Customer: {{ $json.leadName }}\n\ud83d\udce7 Email: {{ $json.leadEmail }}\n\ud83d\udcde Phone: {{ $json.leadPhone }}\n\ud83d\udccd Address: {{ $json.leadAddress }}\n\n\ud83d\udcdd Details: {{ $json.serviceDescription }}\n\n\ud83e\udd16 AI Analysis: {{ $json.output.reasoning }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.repairSlackChannel }}"
},
"otherOptions": {}
},
"typeVersion": 2.4
},
{
"id": "febdf0e7-ee89-489a-9bfe-800233e8400c",
"name": "Notify Maintenance Team",
"type": "n8n-nodes-base.slack",
"position": [
-416,
624
],
"parameters": {
"text": "=\ud83d\udee0\ufe0f New Maintenance Lead - {{ $json.output.urgency }} Priority\n\n\ud83d\udc64 Customer: {{ $json.leadName }}\n\ud83d\udce7 Email: {{ $json.leadEmail }}\n\ud83d\udcde Phone: {{ $json.leadPhone }}\n\ud83d\udccd Address: {{ $json.leadAddress }}\n\n\ud83d\udcdd Details: {{ $json.serviceDescription }}\n\n\ud83e\udd16 AI Analysis: {{ $json.output.reasoning }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.maintenanceSlackChannel }}"
},
"otherOptions": {}
},
"typeVersion": 2.4
},
{
"id": "0c4ce068-7555-477e-a20b-6db95e9731c7",
"name": "Send Confirmation Email to Lead",
"type": "n8n-nodes-base.emailSend",
"position": [
-192,
432
],
"parameters": {
"html": "=<html>\n<body>\n<h2>Thank You, {{ $json.leadName }}!</h2>\n<p>We have received your {{ $json.output.serviceCategory }} service request and our team will contact you shortly.</p>\n<p><strong>Request Details:</strong></p>\n<ul>\n<li>Service Type: {{ $json.output.serviceCategory }}</li>\n<li>Priority: {{ $json.output.urgency }}</li>\n<li>Address: {{ $json.leadAddress }}</li>\n</ul>\n<p>We will reach out to you at {{ $json.leadPhone }} or {{ $json.leadEmail }} to schedule your appointment.</p>\n<p>Best regards,<br>Your HVAC Team</p>\n</body>\n</html>",
"options": {},
"subject": "Thank You for Your HVAC Service Request",
"toEmail": "={{ $json.leadEmail }}",
"fromEmail": "<__PLACEHOLDER_VALUE__Your company email address__>"
},
"typeVersion": 2.1
},
{
"id": "51c9640e-b444-4163-9659-0cc9c950fc19",
"name": "Schedule Appointment",
"type": "n8n-nodes-base.googleCalendar",
"position": [
32,
432
],
"parameters": {
"end": "={{ $now().plus({ days: 1, hours: 2 }).toISO() }}",
"start": "={{ $now().plus({ days: 1 }).toISO() }}",
"calendar": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.calendarId }}"
},
"additionalFields": {
"summary": "=HVAC {{ $json.output.serviceCategory }} - {{ $json.leadName }}",
"description": "=Customer: {{ $json.leadName }}\nPhone: {{ $json.leadPhone }}\nEmail: {{ $json.leadEmail }}\nAddress: {{ $json.leadAddress }}\nService: {{ $json.output.serviceCategory }}\nPriority: {{ $json.output.urgency }}\n\nDetails: {{ $json.serviceDescription }}"
}
},
"typeVersion": 1.3
},
{
"id": "18143404-663a-411c-bdbb-2eee7ce2d7c8",
"name": "Send SMS Reminder",
"type": "n8n-nodes-base.twilio",
"position": [
256,
432
],
"parameters": {
"to": "={{ $json.leadPhone }}",
"from": "<__PLACEHOLDER_VALUE__Your Twilio phone number__>",
"message": "=Hi {{ $json.leadName }}, your HVAC {{ $json.output.serviceCategory }} appointment is scheduled for tomorrow. We'll see you at {{ $json.leadAddress }}. Reply CONFIRM to confirm or call us to reschedule.",
"options": {}
},
"typeVersion": 1
},
{
"id": "c4207810-dbce-44ff-9939-48e3cdce75c1",
"name": "Send to CRM/Dispatch System",
"type": "n8n-nodes-base.httpRequest",
"position": [
480,
432
],
"parameters": {
"url": "={{ $('Workflow Configuration').first().json.crmApiUrl }}",
"method": "POST",
"options": {},
"jsonBody": "={{ {\n \"leadName\": $json.leadName,\n \"leadEmail\": $json.leadEmail,\n \"leadPhone\": $json.leadPhone,\n \"leadAddress\": $json.leadAddress,\n \"serviceType\": $json.output.serviceCategory,\n \"urgency\": $json.output.urgency,\n \"description\": $json.serviceDescription,\n \"submittedAt\": $json.submittedAt\n} }}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.3
},
{
"id": "4ac9cecb-30a5-4906-9e89-2b82668f55fb",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1936,
224
],
"parameters": {
"color": 7,
"width": 656,
"height": 640,
"content": "## Trigger & Config"
},
"typeVersion": 1
},
{
"id": "c0e00b46-b0ed-4cc3-b02c-372df648c3ca",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1264,
224
],
"parameters": {
"color": 7,
"width": 736,
"height": 640,
"content": "## AI Logic"
},
"typeVersion": 1
},
{
"id": "18060c7a-9898-4589-8ecb-cd0e9cf2f1e0",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-512,
176
],
"parameters": {
"color": 7,
"width": 496,
"height": 688,
"content": "## Notify"
},
"typeVersion": 1
},
{
"id": "17c6ee2d-41a8-4d95-9822-d03785d36a07",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
176
],
"parameters": {
"color": 7,
"width": 624,
"height": 688,
"content": "## Appointment & Reminder"
},
"typeVersion": 1
},
{
"id": "5dba32bb-9b7f-49f7-b0d5-ab8efa89f9f8",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2304,
224
],
"parameters": {
"width": 336,
"height": 528,
"content": "## Main\nAutomates door-to-door HVAC lead capture and appointment scheduling. AI classifies leads, routes to appropriate service, logs info, sends confirmations, and schedules appointments.\n\n## Setup\n1. Connect Webhook/Form for lead capture\n2. Connect OpenAI for lead classification\n3. Connect Google Sheets for lead logging\n4. Connect Slack for internal notifications\n5. Connect email and SMS for client communication\n6. Connect calendar for scheduling\n7. Optional CRM/dispatch integration\n\n**Author:** Hyrum Hurst, AI Automation Engineer\n**Company:** QuarterSmart\n**Contact:** hyrum@quartersmart.com\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "1daa6fe0-e0d8-47b8-8c8a-c457c79af1b3",
"connections": {
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Classify Lead Urgency and Service Type",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Send SMS Reminder": {
"main": [
[
{
"node": "Send to CRM/Dispatch System",
"type": "main",
"index": 0
}
]
]
},
"Notify Repair Team": {
"main": [
[
{
"node": "Send Confirmation Email to Lead",
"type": "main",
"index": 0
}
]
]
},
"Normalize Lead Data": {
"main": [
[
{
"node": "Store Lead in Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Lead Submission Form": {
"main": [
[
{
"node": "Workflow Configuration",
"type": "main",
"index": 0
}
]
]
},
"Schedule Appointment": {
"main": [
[
{
"node": "Send SMS Reminder",
"type": "main",
"index": 0
}
]
]
},
"Route by Service Type": {
"main": [
[
{
"node": "Notify Installation Team",
"type": "main",
"index": 0
}
],
[
{
"node": "Notify Repair Team",
"type": "main",
"index": 0
}
],
[
{
"node": "Notify Maintenance Team",
"type": "main",
"index": 0
}
]
]
},
"Workflow Configuration": {
"main": [
[
{
"node": "Normalize Lead Data",
"type": "main",
"index": 0
}
]
]
},
"Notify Maintenance Team": {
"main": [
[
{
"node": "Send Confirmation Email to Lead",
"type": "main",
"index": 0
}
]
]
},
"Notify Installation Team": {
"main": [
[
{
"node": "Send Confirmation Email to Lead",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Classify Lead Urgency and Service Type",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Store Lead in Google Sheets": {
"main": [
[
{
"node": "Classify Lead Urgency and Service Type",
"type": "main",
"index": 0
}
]
]
},
"Send Confirmation Email to Lead": {
"main": [
[
{
"node": "Schedule Appointment",
"type": "main",
"index": 0
}
]
]
},
"Classify Lead Urgency and Service Type": {
"main": [
[
{
"node": "Route by Service Type",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Door-to-door HVAC companies seeking automated lead capture and appointment scheduling.
Source: https://n8n.io/workflows/12742/ — 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.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
This end-to-end AI-powered recruitment automation workflow helps HR and talent acquisition teams automate the complete hiring pipeline—from resume intake and parsing to GPT-4-based evaluation, TA appr
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
YouTube Strategist. Uses formTrigger, splitOut, splitInBatches, agent. Event-driven trigger; 50 nodes.
This advanced multi-phase n8n workflow automates the complete research, analysis, and ideation pipeline for a YouTube strategist. It scrapes competitor channels, analyzes top-performing titles and thu