This workflow follows the Airtable → HTTP Request 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 →
{
"name": "cold-outbound-engine-openai",
"nodes": [
{
"id": "b2c3d4e5-0001-4000-8000-000000000001",
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
300
],
"parameters": {
"httpMethod": "POST",
"path": "cold-outbound-lead",
"responseMode": "onReceived",
"options": {}
}
},
{
"id": "b2c3d4e5-0002-4000-8000-000000000002",
"name": "Enrich: Fetch Company Website",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
220,
300
],
"parameters": {
"method": "GET",
"url": "={{ $json.website }}",
"options": {
"timeout": 10000,
"response": {
"response": {
"responseFormat": "text"
}
}
}
}
},
{
"id": "b2c3d4e5-0003-4000-8000-000000000003",
"name": "Score Fit",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1,
"position": [
440,
300
],
"parameters": {
"model": "gpt-4o",
"messages": {
"values": [
{
"role": "system",
"content": "You are an ICP scoring assistant. Given a lead record and their company website content, score the lead's fit against the following ICP criteria:\n- B2B SaaS or professional services company\n- 10 to 500 employees\n- English-speaking market\n- Signs of growth (hiring, new products, funding mentions)\n\nReturn ONLY valid JSON in this exact format with no additional text:\n{\"score\": 7, \"reason\": \"Brief one-sentence reason\", \"icp_match\": true}"
},
{
"role": "user",
"content": "Lead record:\nName: {{ $('Webhook Trigger').item.json.name }}\nCompany: {{ $('Webhook Trigger').item.json.company }}\nRole: {{ $('Webhook Trigger').item.json.role }}\nWebsite: {{ $('Webhook Trigger').item.json.website }}\n\nWebsite content (truncated to 3000 chars):\n{{ $json.data.substring(0, 3000) }}"
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"id": "b2c3d4e5-0004-4000-8000-000000000004",
"name": "Parse Score",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
660,
300
],
"parameters": {
"mode": "manual",
"fields": {
"values": [
{
"name": "score",
"type": "expression",
"value": "={{ JSON.parse($json.message.content).score }}"
},
{
"name": "reason",
"type": "expression",
"value": "={{ JSON.parse($json.message.content).reason }}"
},
{
"name": "icp_match",
"type": "expression",
"value": "={{ JSON.parse($json.message.content).icp_match }}"
},
{
"name": "lead_name",
"type": "expression",
"value": "={{ $('Webhook Trigger').item.json.name }}"
},
{
"name": "lead_company",
"type": "expression",
"value": "={{ $('Webhook Trigger').item.json.company }}"
},
{
"name": "lead_role",
"type": "expression",
"value": "={{ $('Webhook Trigger').item.json.role }}"
},
{
"name": "lead_website",
"type": "expression",
"value": "={{ $('Webhook Trigger').item.json.website }}"
}
]
}
}
},
{
"id": "b2c3d4e5-0005-4000-8000-000000000005",
"name": "IF: Score Check",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
880,
300
],
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "cond-001",
"leftValue": "={{ $json.score }}",
"rightValue": 7,
"operator": {
"type": "number",
"operation": "gte"
}
}
],
"combinator": "and"
}
}
},
{
"id": "b2c3d4e5-0006-4000-8000-000000000006",
"name": "Draft Email",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1,
"position": [
1100,
180
],
"parameters": {
"model": "gpt-4o",
"messages": {
"values": [
{
"role": "system",
"content": "You are an expert cold outreach copywriter. Write concise, personalized cold emails that feel human and specific. Never use em-dashes, never use filler phrases like 'I hope this finds you well', and never start with 'I'. Max 3 short paragraphs. Output format:\nSubject: [subject line]\n\n[email body]"
},
{
"role": "user",
"content": "Write a cold outreach email for this lead:\nName: {{ $json.lead_name }}\nCompany: {{ $json.lead_company }}\nRole: {{ $json.lead_role }}\nWebsite: {{ $json.lead_website }}\nICP fit reason: {{ $json.reason }}\n\nThe email should reference something specific about their company, propose a concrete next step, and be under 120 words."
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"id": "b2c3d4e5-0007-4000-8000-000000000007",
"name": "Low Fit - Stop",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
1100,
440
],
"parameters": {}
},
{
"id": "b2c3d4e5-0008-4000-8000-000000000008",
"name": "Parse Email Draft",
"type": "n8n-nodes-base.set",
"typeVersion": 3,
"position": [
1320,
180
],
"parameters": {
"mode": "manual",
"fields": {
"values": [
{
"name": "email_draft",
"type": "expression",
"value": "={{ $json.message.content }}"
},
{
"name": "lead_name",
"type": "expression",
"value": "={{ $('Parse Score').item.json.lead_name }}"
},
{
"name": "lead_company",
"type": "expression",
"value": "={{ $('Parse Score').item.json.lead_company }}"
},
{
"name": "lead_role",
"type": "expression",
"value": "={{ $('Parse Score').item.json.lead_role }}"
},
{
"name": "score",
"type": "expression",
"value": "={{ $('Parse Score').item.json.score }}"
},
{
"name": "icp_match",
"type": "expression",
"value": "={{ $('Parse Score').item.json.icp_match }}"
}
]
}
}
},
{
"id": "b2c3d4e5-0009-4000-8000-000000000009",
"name": "Log to Airtable",
"type": "n8n-nodes-base.airtable",
"typeVersion": 2,
"position": [
1540,
180
],
"parameters": {
"operation": "create",
"baseId": "YOUR_AIRTABLE_BASE_ID",
"tableId": "Leads",
"fields": {
"fieldMappingMode": "defineBelow",
"value": {
"Name": "={{ $json.lead_name }}",
"Company": "={{ $json.lead_company }}",
"Role": "={{ $json.lead_role }}",
"Score": "={{ $json.score }}",
"ICP Match": "={{ $json.icp_match }}",
"Email Draft": "={{ $json.email_draft }}",
"Status": "Draft Ready"
}
}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
},
{
"id": "b2c3d4e5-0010-4000-8000-000000000010",
"name": "Notify Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2,
"position": [
1760,
180
],
"parameters": {
"operation": "post",
"select": "channel",
"channelId": {
"value": "#outbound"
},
"text": "New qualified lead logged to Airtable.\nName: {{ $('Parse Email Draft').item.json.lead_name }}\nCompany: {{ $('Parse Email Draft').item.json.lead_company }}\nScore: {{ $('Parse Email Draft').item.json.score }}/10\nEmail draft is ready for review in Airtable.",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Enrich: Fetch Company Website",
"type": "main",
"index": 0
}
]
]
},
"Enrich: Fetch Company Website": {
"main": [
[
{
"node": "Score Fit",
"type": "main",
"index": 0
}
]
]
},
"Score Fit": {
"main": [
[
{
"node": "Parse Score",
"type": "main",
"index": 0
}
]
]
},
"Parse Score": {
"main": [
[
{
"node": "IF: Score Check",
"type": "main",
"index": 0
}
]
]
},
"IF: Score Check": {
"main": [
[
{
"node": "Draft Email",
"type": "main",
"index": 0
}
],
[
{
"node": "Low Fit - Stop",
"type": "main",
"index": 0
}
]
]
},
"Draft Email": {
"main": [
[
{
"node": "Parse Email Draft",
"type": "main",
"index": 0
}
]
]
},
"Parse Email Draft": {
"main": [
[
{
"node": "Log to Airtable",
"type": "main",
"index": 0
}
]
]
},
"Log to Airtable": {
"main": [
[
{
"node": "Notify Slack",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": [],
"triggerCount": 1,
"updatedAt": "2026-05-17T00:00:00.000Z",
"versionId": "v1"
}
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.
airtableTokenApiopenAiApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
cold-outbound-engine-openai. Uses httpRequest, lmChatOpenAi, airtable, slack. Webhook trigger; 10 nodes.
Source: https://github.com/sondersos/n8n-workflows/blob/main/workflows/01-cold-outbound-engine/cold-outbound-engine-openai.json — 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.
Automatically scrape trending TikTok videos, analyze their virality using Gemini AI, and store insights directly into Airtable for creative research or content planning.
cold-outbound-engine-claude. Uses httpRequest, lmChatAnthropic, airtable, slack. Webhook trigger; 10 nodes.
The Ultimate Scraper for n8n uses Selenium and AI to retrieve any information displayed on a webpage. You can also use session cookies to log in to the targeted webpage for more advanced scraping need
z-Api. Uses httpRequest, openAi, redis, postgres. Webhook trigger; 61 nodes.
This workflow will allow you to use OpenAI Assistant API together with a chatting platform. This version is configured to work with Hubspot, however, the Hubspot modules can be replaced by other platf