This workflow corresponds to n8n.io template #14137 — we link there as the canonical source.
This workflow follows the Agent → Airtable 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "90fb7e98-29a0-4f57-9fbc-49a92ecb0bb6",
"name": "Google Gemini Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
5376,
3904
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "c1e12098-b371-4a04-b20b-c1453ad24a5d",
"name": "Nurture Email \u2014 Medium/Low Lead2",
"type": "n8n-nodes-base.emailSend",
"position": [
6816,
3840
],
"parameters": {
"html": "=<html><body style=\"font-family:Arial,sans-serif;background:#f0f4f8;padding:20px;\">\n<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"><tr><td align=\"center\">\n<table width=\"560\" style=\"background:#fff;border-radius:8px;overflow:hidden;\">\n<tr><td style=\"background:#4a5568;padding:30px;text-align:center;\">\n<h1 style=\"color:#fff;margin:0;\">We Received Your Inquiry</h1>\n<p style=\"color:#cbd5e0;margin:8px 0 0 0;\">Our team will be in touch shortly</p>\n</td></tr>\n<tr><td style=\"padding:32px;\">\n<h2 style=\"color:#2d3748;\">Hi {{ $('Parse AI Output2').first().json.full_name }},</h2>\n<p style=\"color:#4a5568;line-height:1.7;\">Thanks for your inquiry! Based on your requirements, we may have <strong>available properties</strong> that match what you are looking for.</p>\n<p style=\"color:#4a5568;line-height:1.7;\">Would you like to <strong>schedule a showing this week?</strong></p>\n<table width=\"100%\" style=\"background:#f7fafc;border:1px solid #e2e8f0;border-radius:4px;margin:20px 0;\"><tr><td style=\"padding:16px;\">\n<p style=\"margin:0 0 10px;font-weight:bold;color:#2d3748;\">Your Inquiry Summary</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Property:</strong> {{ $('Parse AI Output2').first().json.property_type }}</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Location:</strong> {{ $('Parse AI Output2').first().json.location }}</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Budget:</strong> {{ $('Parse AI Output2').first().json.budget }}</p>\n</td></tr></table>\n<p style=\"color:#4a5568;font-weight:bold;\">While you wait:</p>\n<p style=\"color:#4a5568;\">- Browse our latest listings on our website</p>\n<p style=\"color:#4a5568;\">- Prepare your documents: ID and proof of income</p>\n<p style=\"color:#4a5568;\">- Shortlist your must-have features</p>\n<p style=\"color:#4a5568;margin-top:24px;\">We will be in touch within <strong>1-2 business days</strong>.</p>\n<p style=\"color:#4a5568;margin-top:24px;\">Warm regards,<br><strong>The Leasing Team</strong></p>\n</td></tr>\n<tr><td style=\"background:#f7fafc;padding:12px;text-align:center;\">\n<p style=\"margin:0;color:#a0aec0;font-size:12px;\">You received this because you submitted a property inquiry.</p>\n</td></tr>\n</table></td></tr></table>\n</body></html>",
"options": {
"appendAttribution": false
},
"subject": "=Thanks for reaching out, {{ $('Parse AI Output2').first().json.full_name }}!",
"toEmail": "={{ $('Parse AI Output2').first().json.email }}",
"fromEmail": "user@example.com"
},
"typeVersion": 2.1
},
{
"id": "01540a94-d3a7-4e87-b47c-4ef9d62355c0",
"name": "Priority Email \u2014 High Lead2",
"type": "n8n-nodes-base.emailSend",
"position": [
6816,
3360
],
"parameters": {
"html": "=<html><body style=\"font-family:Arial,sans-serif;background:#f0f4f8;padding:20px;\">\n<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"><tr><td align=\"center\">\n<table width=\"560\" style=\"background:#fff;border-radius:8px;overflow:hidden;\">\n<tr><td style=\"background:#1a365d;padding:30px;text-align:center;\">\n<h1 style=\"color:#fff;margin:0;\">Great News!</h1>\n<p style=\"color:#bee3f8;margin:8px 0 0 0;\">We have matching properties for you</p>\n</td></tr>\n<tr><td style=\"padding:32px;\">\n<h2 style=\"color:#1a365d;\">Hi {{ $('Parse AI Output2').first().json.full_name }},</h2>\n<p style=\"color:#4a5568;line-height:1.7;\">Thanks for your inquiry! Based on your requirements, we may have <strong>available properties</strong> that are a great match.</p>\n<p style=\"color:#4a5568;line-height:1.7;\">Would you like to <strong>schedule a showing this week?</strong></p>\n<table width=\"100%\" style=\"background:#ebf8ff;border-left:4px solid #3182ce;border-radius:4px;margin:20px 0;\"><tr><td style=\"padding:16px;\">\n<p style=\"margin:0 0 10px;font-weight:bold;color:#2c5282;\">Your Inquiry Summary</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Property:</strong> {{ $('Parse AI Output2').first().json.property_type }}</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Purpose:</strong> {{ $('Parse AI Output2').first().json.purpose }}</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Location:</strong> {{ $('Parse AI Output2').first().json.location }}</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Budget:</strong> {{ $('Parse AI Output2').first().json.budget }}</p>\n<p style=\"margin:4px 0;color:#2d3748;\"><strong>Timeline:</strong> {{ $('Parse AI Output2').first().json.timeline }}</p>\n</td></tr></table>\n<table width=\"100%\" style=\"background:#f0fff4;border-left:4px solid #38a169;border-radius:4px;margin:0 0 20px;\"><tr><td style=\"padding:16px;\">\n<p style=\"margin:0 0 8px;font-weight:bold;color:#276749;\">Our Assessment</p>\n<p style=\"margin:0;color:#2d3748;\">{{ $('Parse AI Output2').first().json.notes }}</p>\n</td></tr></table>\n<p style=\"color:#4a5568;\">A senior agent will contact you within <strong>2 hours</strong>.</p>\n<p style=\"color:#4a5568;margin-top:24px;\">Warm regards,<br><strong>The Leasing Team</strong></p>\n</td></tr>\n<tr><td style=\"background:#f7fafc;padding:12px;text-align:center;\">\n<p style=\"margin:0;color:#a0aec0;font-size:12px;\">You received this because you submitted a property inquiry.</p>\n</td></tr>\n</table></td></tr></table>\n</body></html>",
"options": {
"appendAttribution": false
},
"subject": "=\ud83c\udfe0 {{ $('Parse AI Output2').first().json.full_name }}, we have properties matching your needs!",
"toEmail": "={{ $('Parse AI Output2').first().json.email }}",
"fromEmail": "user@example.com"
},
"typeVersion": 2.1
},
{
"id": "00840730-9479-431c-a116-49b158352763",
"name": "High Lead?2",
"type": "n8n-nodes-base.if",
"position": [
6464,
3600
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "check-high",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('Parse AI Output2').first().json.lead_score }}",
"rightValue": "High"
}
]
}
},
"typeVersion": 2.1
},
{
"id": "5da4dd2e-a654-44b0-9801-b60ce3189924",
"name": "Save to Airtable2",
"type": "n8n-nodes-base.airtable",
"position": [
6096,
3600
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "apphmQzLXYHppqZTB"
},
"table": {
"__rl": true,
"mode": "id",
"value": "tbl9t6jSZ8Eg2qn7d"
},
"columns": {
"value": {
"Notes": "={{ $json.notes }}",
"Intent": "={{ $json.intent }}",
"Purpose": "={{ $json.purpose }}",
"Timeline": "={{ $json.timeline }}",
"Full Name": "={{ $json.full_name }}",
"Lead Score": "={{ $json.lead_score }}",
"Submit Date": "={{ $json.submit_date }}",
"Budget Range": "={{ $json.budget }}",
"Requirements": "={{ $json.requirements }}",
"Email Address": "={{ $json.email }}",
"Property Type": "={{ $json.property_type }}",
"Preferred Location": "={{ $json.location }}",
"Mobile Phone Number": "={{ $json.phone }}"
},
"schema": [
{
"id": "Full Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Email Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mobile Phone Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Mobile Phone Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Type",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Purpose",
"type": "string",
"display": true,
"required": false,
"displayName": "Purpose",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Preferred Location",
"type": "string",
"display": true,
"required": false,
"displayName": "Preferred Location",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Budget Range",
"type": "string",
"display": true,
"required": false,
"displayName": "Budget Range",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Requirements",
"type": "string",
"display": true,
"required": false,
"displayName": "Requirements",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Submit Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Submit Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Lead Score",
"type": "string",
"display": true,
"required": false,
"displayName": "Lead Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Intent",
"type": "string",
"display": true,
"required": false,
"displayName": "Intent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Timeline",
"type": "string",
"display": true,
"required": false,
"displayName": "Timeline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow"
},
"options": {
"typecast": true
},
"operation": "create"
},
"typeVersion": 2.1
},
{
"id": "065a88d7-8ad2-421f-af63-f37d34519ccd",
"name": "Parse AI Output2",
"type": "n8n-nodes-base.code",
"position": [
5728,
3600
],
"parameters": {
"jsCode": "const aiRaw = $input.first().json.output || '';\nconst formData = $('Extract Typeform Fields1').first().json;\n\nconsole.log('Raw AI output:', aiRaw);\n\nlet parsed = null;\n\n// Attempt 1: direct parse\ntry { parsed = JSON.parse(aiRaw.trim()); } catch(e) {}\n\n// Attempt 2: strip markdown fences\nif (!parsed) {\n try {\n const s = aiRaw.replace(/```json/gi,'').replace(/```/g,'').trim();\n parsed = JSON.parse(s);\n } catch(e) {}\n}\n\n// Attempt 3: extract JSON block\nif (!parsed) {\n try {\n const m = aiRaw.match(/\\{[\\s\\S]*\\}/);\n if (m) parsed = JSON.parse(m[0]);\n } catch(e) {}\n}\n\n// Attempt 4: regex fallback\nif (!parsed) {\n const s = aiRaw.match(/lead_score[\"'\\s:]+([\"']?)(High|Medium|Low)\\1/i);\n const i = aiRaw.match(/intent[\"'\\s:]+[\"']([^\"'\\n,}]{3,100})[\"']/);\n const t = aiRaw.match(/timeline[\"'\\s:]+[\"']([^\"'\\n,}]{3,100})[\"']/);\n const n = aiRaw.match(/notes[\"'\\s:]+[\"']([^\"'\\n,}]{3,300})[\"']/);\n parsed = {\n lead_score: s ? s[2] : 'Medium',\n intent: i ? i[1].trim() : 'Needs review',\n timeline: t ? t[1].trim() : 'Not specified',\n notes: n ? n[1].trim() : 'Manual review required'\n };\n}\n\n// Ensure lead_score is exactly High / Medium / Low\nconst validScores = ['High', 'Medium', 'Low'];\nif (!validScores.includes(parsed.lead_score)) {\n parsed.lead_score = 'Medium';\n}\n\nconsole.log('Final parsed:', parsed);\n\nreturn [{\n json: {\n full_name: formData.name || '',\n email: formData.email || '',\n phone: formData.phone || '',\n property_type: formData.property_type || '',\n purpose: formData.purpose || '',\n location: formData.location || '',\n budget: formData.budget || '',\n requirements: formData.requirements || '',\n submit_date: formData.submit_date || new Date().toISOString(),\n lead_score: parsed.lead_score,\n intent: parsed.intent || '',\n timeline: parsed.timeline || '',\n notes: parsed.notes || ''\n }\n}];"
},
"typeVersion": 2
},
{
"id": "1e8ae181-0d83-4be2-a225-3f11cb7163dc",
"name": "AI Lead Qualifier2",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
5264,
3600
],
"parameters": {
"text": "=You are an AI leasing assistant for a real estate company.\n\nAnalyze this property inquiry and return ONLY a raw JSON object.\nNo markdown. No code fences. No explanation. Just the JSON.\n\nExact format:\n{\"lead_score\":\"High\",\"intent\":\"...\",\"timeline\":\"...\",\"notes\":\"...\"}\n\nlead_score must be exactly one of: High, Medium, Low\n\nLead Data:\n- Name: {{ $json.name }}\n- Email: {{ $json.email }}\n- Phone: {{ $json.phone }}\n- Property Type: {{ $json.property_type }}\n- Purpose: {{ $json.purpose }}\n- Location: {{ $json.location }}\n- Budget: {{ $json.budget }}\n- Requirements: {{ $json.requirements }}\n\nScoring Rules:\n- High = has budget + specific location + clear purpose (investment or near-term)\n- Medium = partial info, needs follow-up\n- Low = vague, missing budget or location\n\nReturn JSON only. No other text whatsoever.",
"options": {
"systemMessage": "You are a real estate lead qualification AI. Return raw JSON only. No markdown. No code blocks. No explanation. Just the JSON object on a single line."
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "597b672e-5187-47cd-8c11-9558c357affc",
"name": "Extract Typeform Fields1",
"type": "n8n-nodes-base.code",
"position": [
4912,
3600
],
"parameters": {
"jsCode": "// ============================================================\n// EXACT TYPEFORM FIELD EXTRACTOR\n// Based on confirmed payload with exact field refs\n// ============================================================\n\nconst input = $input.first().json;\n\n// Typeform sends data inside form_response\nconst fr = input.body?.form_response || input.form_response || input.body || input;\nconst answers = fr.answers || [];\n\nconsole.log('Total answers received:', answers.length);\nconsole.log('Raw answers:', JSON.stringify(answers));\n\n// Known field refs from your form\nconst REF_NAME = '12829b05-575d-4c31-9569-79ddd0d9f2c2';\nconst REF_PHONE = 'afd6483f-643d-4656-8e9d-d343c3745356';\nconst REF_EMAIL = 'ebf62b12-c7f5-437f-aefd-848d645794cc';\nconst REF_PROP_TYPE = 'eebd1c48-17b6-4139-a479-c6426b0fd968';\nconst REF_PURPOSE = '9bd9f234-e544-49ae-b8a7-db3ed0b7764e';\nconst REF_LOCATION = '44dc617b-f453-4ec3-8737-be40897c8505';\nconst REF_BUDGET = '15471e0f-d172-4b2f-aaf1-c7f0799fc4bf';\nconst REF_REQUIREMENTS= '60ddbcf2-dd8b-490a-a0dd-f48bd629a30d';\nconst REF_CONSENT = '5b0075bb-75fe-47e9-9b0c-ad4364d45ea9';\n\n// Build a ref -> answer map\nconst refMap = {};\nfor (const a of answers) {\n const ref = a.field?.ref;\n if (ref) refMap[ref] = a;\n}\n\n// Extract value from answer object\nfunction extract(ref) {\n const a = refMap[ref];\n if (!a) return '';\n if (a.type === 'text') return a.text || '';\n if (a.type === 'email') return a.email || '';\n if (a.type === 'phone_number') return a.phone_number || '';\n if (a.type === 'choice') return a.choice?.label || '';\n if (a.type === 'choices') return (a.choices?.labels || []).join(', ');\n if (a.type === 'boolean') return a.boolean ? 'Yes' : 'No';\n if (a.type === 'number') return String(a.number || '');\n return '';\n}\n\nconst name = extract(REF_NAME);\nconst phone = extract(REF_PHONE);\nconst email = extract(REF_EMAIL);\nconst propertyType = extract(REF_PROP_TYPE);\nconst purpose = extract(REF_PURPOSE);\nconst location = extract(REF_LOCATION);\nconst budget = extract(REF_BUDGET);\nconst requirements = extract(REF_REQUIREMENTS);\nconst consent = extract(REF_CONSENT);\nconst submitDate = fr.submitted_at || new Date().toISOString();\n\nconsole.log('Extracted:', { name, phone, email, propertyType, purpose, location, budget, requirements });\n\nreturn [{\n json: {\n name,\n email,\n phone,\n property_type: propertyType,\n purpose,\n location,\n budget,\n requirements,\n consent,\n submit_date: submitDate\n }\n}];"
},
"typeVersion": 2
},
{
"id": "1e8565dd-9538-4875-b31a-da53b69b849d",
"name": "Webhook1",
"type": "n8n-nodes-base.webhook",
"position": [
4528,
3600
],
"parameters": {
"path": "1676a463-d7fc-43e0-8eba-c654b1e31599",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "156265b2-b77d-4a56-9b4b-bfffda64f055",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
4448,
3072
],
"parameters": {
"width": 1100,
"height": 280,
"content": "## \ud83c\udfe0 Real Estate Lead Qualifier\n\nTypeform submission \u2192 AI scores the lead (High / Medium / Low) \u2192 saves to Airtable CRM \u2192 sends the right email automatically. No manual triage needed.\n\n**Setup checklist:**\n- Paste the Webhook production URL into Typeform \u2192 Connect \u2192 Webhooks\n- Add your Google Gemini API key to the Gemini Chat Model node (or swap for GPT-4o / Claude)\n- Connect your Airtable credential and replace the Base ID + Table ID in the Airtable node\n- Update `fromEmail` in both Send Email nodes before going live\n- If you rebuild the Typeform, update the `REF_` constants in the Extract Fields node"
},
"typeVersion": 1
},
{
"id": "fa3971b5-6761-46a1-aeae-896470486ee0",
"name": "Webhook note",
"type": "n8n-nodes-base.stickyNote",
"position": [
4448,
3408
],
"parameters": {
"color": 5,
"width": 290,
"height": 402,
"content": "**Webhook**\n\nTypeform POSTs here on every submission. Copy the production URL from this node and paste it into:\nTypeform \u2192 Connect \u2192 Webhooks"
},
"typeVersion": 1
},
{
"id": "13394412-3d94-4d79-aa57-ad7fbd837e9e",
"name": "Extractor note",
"type": "n8n-nodes-base.stickyNote",
"position": [
4816,
3408
],
"parameters": {
"color": 5,
"width": 322,
"height": 400,
"content": "**Extract Typeform Fields**\n\nTypeform sends field *reference IDs*, not names. This node maps refs \u2192 values.\n\n\u26a0\ufe0f If you rebuild the form, update the REF_ constants at the top of this node. Log a test webhook payload to find the new refs."
},
"typeVersion": 1
},
{
"id": "5e4aedfb-c1ef-406e-9452-8ae477e49a16",
"name": "AI note",
"type": "n8n-nodes-base.stickyNote",
"position": [
5184,
3408
],
"parameters": {
"color": 6,
"width": 370,
"height": 388,
"content": "**AI Lead Qualifier**\n\nGemini reads the lead and returns JSON:\n\u2022 `lead_score` \u2014 High / Medium / Low\n\u2022 `intent` \u2014 what they actually want\n\u2022 `timeline` \u2014 how urgent\n\u2022 `notes` \u2014 summary for sales\n\nEdit scoring rules in the prompt."
},
"typeVersion": 1
},
{
"id": "602203da-a46e-49fd-817e-932827389390",
"name": "Model note",
"type": "n8n-nodes-base.stickyNote",
"position": [
5104,
3856
],
"parameters": {
"color": 6,
"width": 450,
"height": 186,
"content": "Connect your Gemini credential here.\nCan swap for GPT-4o or Claude "
},
"typeVersion": 1
},
{
"id": "13568e8f-2eab-491f-8ecc-9d5bded2dac9",
"name": "Parse note",
"type": "n8n-nodes-base.stickyNote",
"position": [
5600,
3408
],
"parameters": {
"color": 6,
"width": 322,
"height": 388,
"content": "**Parse AI Output**\n\nGemini sometimes wraps JSON in backticks or adds extra text. This node tries 4 approaches to extract clean JSON \u2014 direct parse, strip fences, regex, field-by-field fallback.\n\nIf score is wrong, check the execution log here first."
},
"typeVersion": 1
},
{
"id": "0185f9e7-eecc-448b-90ca-e03473cca03d",
"name": "Airtable note",
"type": "n8n-nodes-base.stickyNote",
"position": [
5968,
3376
],
"parameters": {
"color": 3,
"width": 370,
"height": 418,
"content": "**Save to Airtable**\n\nCreates a new CRM record with all lead data + AI assessment.\n\nYour base needs these fields: Full Name, Email, Phone, Property Type, Purpose, Location, Budget, Requirements, Submit Date, Lead Score, Intent, Timeline, Notes.\n\n`typecast: true` handles field type mismatches."
},
"typeVersion": 1
},
{
"id": "5e628d9e-6d5f-4728-992c-c8c45b4ab2ca",
"name": "Route note",
"type": "n8n-nodes-base.stickyNote",
"position": [
6384,
3376
],
"parameters": {
"color": 3,
"width": 264,
"height": 418,
"content": "**Route by score**\n\nHigh \u2192 priority email\nAnything else \u2192 nurture email\n\nWant a third path for Low leads? Add another IF after this one."
},
"typeVersion": 1
},
{
"id": "c1592048-2cb9-43d3-8c84-bfd95f96c384",
"name": "High email note",
"type": "n8n-nodes-base.stickyNote",
"position": [
6720,
3200
],
"parameters": {
"color": 7,
"width": 348,
"height": 374,
"content": "**Priority email \u2014 High leads**\n\nGoes out immediately. Promises callback within 2 hours \u2014 make sure your team is ready when this fires.\n\nUpdate `fromEmail` before going live."
},
"typeVersion": 1
},
{
"id": "5c324e57-fba4-47c5-9db3-8965d9a4acdc",
"name": "Nurture email note",
"type": "n8n-nodes-base.stickyNote",
"position": [
6720,
3664
],
"parameters": {
"color": 7,
"width": 348,
"height": 354,
"content": "**Nurture email \u2014 Medium & Low**\n\nWarmer tone, no urgency. Promises 1\u20132 business days.\n\nSame SMTP credential as the priority email above."
},
"typeVersion": 1
}
],
"connections": {
"Webhook1": {
"main": [
[
{
"node": "Extract Typeform Fields1",
"type": "main",
"index": 0
}
]
]
},
"High Lead?2": {
"main": [
[
{
"node": "Priority Email \u2014 High Lead2",
"type": "main",
"index": 0
}
],
[
{
"node": "Nurture Email \u2014 Medium/Low Lead2",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Output2": {
"main": [
[
{
"node": "Save to Airtable2",
"type": "main",
"index": 0
}
]
]
},
"Save to Airtable2": {
"main": [
[
{
"node": "High Lead?2",
"type": "main",
"index": 0
}
]
]
},
"AI Lead Qualifier2": {
"main": [
[
{
"node": "Parse AI Output2",
"type": "main",
"index": 0
}
]
]
},
"Extract Typeform Fields1": {
"main": [
[
{
"node": "AI Lead Qualifier2",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model2": {
"ai_languageModel": [
[
{
"node": "AI Lead Qualifier2",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Every time a prospect submits your Typeform property inquiry, this workflow kicks in automatically. It extracts their details, runs them through an AI lead scoring engine, saves the record to Airtable, and sends a personalised email — a priority response for hot leads, a nurture…
Source: https://n8n.io/workflows/14137/ — 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 workflow continuously monitors CVE databases, threat intelligence feeds, and public security advisories to surface emerging zero-day threats, correlates them against your registered infrastructur
Tech CRM. Uses httpRequest, airtable, splitOut, markdown. Webhook trigger; 27 nodes.
This workflow monitors active construction projects in real time, ingests weather forecasts, supplier delivery statuses, and crew/resource availability, then uses Claude AI to predict delay risk, esti
How it Works: Trigger: The workflow is triggered by a webhook, initiated by an Airtable automation. This automation sends the Book or Chapter record ID and the desired action (e.g., "Generate Book Det
Automate candidate evaluation from CV submission to interview booking. Perfect for HR teams and recruiters.