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": "LH \u2192 n8n \u2192 Apollo + Dropcontact \u2192 Airtable \u2192 Smartlead",
"nodes": [
{
"id": "webhook_in",
"name": "Webhook IN (Linked Helper)",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
80,
240
],
"parameters": {
"httpMethod": "POST",
"path": "lh-in",
"responseMode": "onReceived",
"options": {
"responseCode": 200,
"responseData": "Received"
}
}
},
{
"id": "extract_map",
"name": "Map Payload",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
300,
240
],
"parameters": {
"functionCode": "const i = items[0].json;\nreturn [{json:{\n source: 'LinkedHelper',\n campaign: i.campaignName || i.CONSTANT_VALUE || '',\n fullName: i.fullName || '',\n firstName: i.firstName || i.originalFirstName || '',\n lastName: i.lastName || i.originalLastName || '',\n title: i.title || '',\n company: i.organization?.name || i.companyName || '',\n linkedinUrl: i.profileUrl || i.publicProfileUrl || '',\n email: i.email || '',\n location: i.location || '',\n industry: i.industry || '',\n publicId: i.publicId || '',\n companyId: i.organization?.companyId || '',\n companyLinkedin: i.organization?.profileUrl || '',\n note: i.note || ''\n}}];"
}
},
{
"id": "airtable_lookup",
"name": "Airtable Lookup (by linkedinUrl/email)",
"type": "n8n-nodes-base.airtable",
"typeVersion": 3,
"position": [
520,
160
],
"credentials": {
"airtableApi": {
"name": "<your credential>"
}
},
"parameters": {
"operation": "list",
"application": "={{$env.AIRTABLE_BASE}}",
"table": "={{$env.AIRTABLE_TABLE}}",
"additionalOptions": {
"filterByFormula": "OR({linkedinUrl}='{{$json.linkedinUrl}}',AND({email}!='',LOWER({email})=LOWER('{{ $json.email }}')))",
"maxRecords": 1
}
}
},
{
"id": "if_exists",
"name": "IF Exists?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
740,
160
],
"parameters": {
"conditions": {
"boolean": [],
"number": [],
"string": [
{
"value1": "={{$json.records && $json.records.length}}",
"operation": "notEmpty"
}
]
}
}
},
{
"id": "apollo_enrich",
"name": "Apollo Enrich (Person)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
520,
340
],
"parameters": {
"url": "https://api.apollo.io/v1/people/match",
"method": "POST",
"jsonParameters": true,
"options": {
"response": {
"responseFormat": "json"
}
},
"sendHeaders": true,
"headerParametersJson": "{\"Content-Type\":\"application/json\",\"Cache-Control\":\"no-cache\",\"X-Api-Key\":\"{{$env.APOLLO_KEY}}\"}",
"bodyParametersJson": "{\"linkedin_url\":\"{{$json.linkedinUrl}}\",\"email\":\"{{$json.email}}\",\"first_name\":\"{{$json.firstName}}\",\"last_name\":\"{{$json.lastName}}\",\"organization_name\":\"{{$json.company}}\"}"
}
},
{
"id": "merge_apollo",
"name": "Merge Apollo \u2192 Lead",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
740,
340
],
"parameters": {
"functionCode": "const lead = items[0].pairedItem(0,{item:0});\nconst ap = items[0].json || {};\nconst out = {...lead.json};\nout.domain = ap.person?.organization?.website_url || ap.person?.organization?.primary_domain || out.domain || '';\nout.company_size = ap.person?.organization?.employee_count || '';\nout.phone = ap.person?.phone_numbers?.[0]?.sanitized_number || '';\nreturn [{json: out}];"
}
},
{
"id": "dropcontact_verify",
"name": "Dropcontact Verify",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
960,
340
],
"parameters": {
"url": "https://api.dropcontact.io/batch",
"method": "POST",
"jsonParameters": true,
"sendHeaders": true,
"headerParametersJson": "{\"X-Access-Token\":\"{{$env.DROPCONTACT_TOKEN}}\",\"Content-Type\":\"application/json\"}",
"options": {
"response": {
"responseFormat": "json"
}
},
"bodyParametersJson": "{\"data\":[{\"first_name\":\"{{$json.firstName}}\",\"last_name\":\"{{$json.lastName}}\",\"company\":\"{{$json.company}}\",\"website\":\"{{$json.domain}}\",\"email\":\"{{$json.email}}\"}],\"siren\":false,\"language\":\"fr\"}"
}
},
{
"id": "merge_dc",
"name": "Merge Dropcontact",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
1180,
340
],
"parameters": {
"functionCode": "const lead = items[0].pairedItem(0,{item:0});\nconst dc = items[0].json || {};\nconst r = dc.data?.[0] || {};\nconst out = {...lead.json};\nout.email = r.email || out.email || '';\nout.email_status = r.email_status || r.score || '';\nreturn [{json: out}];"
}
},
{
"id": "airtable_upsert",
"name": "Airtable Upsert",
"type": "n8n-nodes-base.airtable",
"typeVersion": 3,
"position": [
1400,
260
],
"credentials": {
"airtableApi": {
"name": "<your credential>"
}
},
"parameters": {
"operation": "upsert",
"application": "={{$env.AIRTABLE_BASE}}",
"table": "={{$env.AIRTABLE_TABLE}}",
"updateKey": "linkedinUrl",
"options": {},
"fields": {
"linkedinUrl": "={{$json.linkedinUrl}}",
"fullName": "={{$json.fullName}}",
"firstName": "={{$json.firstName}}",
"lastName": "={{$json.lastName}}",
"title": "={{$json.title}}",
"company": "={{$json.company}}",
"email": "={{$json.email}}",
"email_status": "={{$json.email_status}}",
"domain": "={{$json.domain}}",
"company_size": "={{$json.company_size}}",
"status": "Prospect",
"source": "Linked Helper"
}
}
},
{
"id": "smartlead_add",
"name": "Smartlead Add to Campaign",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
1620,
260
],
"parameters": {
"url": "https://api.smartlead.ai/v1/contacts",
"method": "POST",
"jsonParameters": true,
"sendHeaders": true,
"headerParametersJson": "{\"X-API-Key\":\"{{$env.SMARTLEAD_KEY}}\",\"Content-Type\":\"application/json\"}",
"options": {
"response": {
"responseFormat": "json"
}
},
"bodyParametersJson": "{\"first_name\":\"{{$json.firstName}}\",\"last_name\":\"{{$json.lastName}}\",\"company\":\"{{$json.company}}\",\"email\":\"{{$json.email}}\",\"custom_variables\":{\"linkedinUrl\":\"{{$json.linkedinUrl}}\"},\"campaign_id\":YOUR_SMARTLEAD_CAMPAIGN_ID}"
}
},
{
"id": "respond",
"name": "Respond 200",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [
1840,
260
],
"parameters": {
"responseBody": "OK",
"responseCode": 200
}
},
{
"id": "webhook_replies",
"name": "Webhook IN (Replies)",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
80,
520
],
"parameters": {
"httpMethod": "POST",
"path": "lh-replies",
"responseMode": "onReceived",
"options": {
"responseCode": 200,
"responseData": "Received"
}
}
},
{
"id": "update_reply",
"name": "Airtable Update (on Reply)",
"type": "n8n-nodes-base.airtable",
"typeVersion": 3,
"position": [
300,
520
],
"credentials": {
"airtableApi": {
"name": "<your credential>"
}
},
"parameters": {
"operation": "update",
"application": "={{$env.AIRTABLE_BASE}}",
"table": "={{$env.AIRTABLE_TABLE}}",
"updateKey": "linkedinUrl",
"fields": {
"status": "Replied",
"last_reply_text": "={{$json.message || ''}}",
"last_reply_date": "={{$json.replyAt || new Date().toISOString()}}"
}
}
}
],
"connections": {
"Webhook IN (Linked Helper)": {
"main": [
[
{
"node": "Map Payload",
"type": "main",
"index": 0
}
]
]
},
"Map Payload": {
"main": [
[
{
"node": "Airtable Lookup (by linkedinUrl/email)",
"type": "main",
"index": 0
},
{
"node": "Apollo Enrich (Person)",
"type": "main",
"index": 0
}
]
]
},
"Airtable Lookup (by linkedinUrl/email)": {
"main": [
[
{
"node": "IF Exists?",
"type": "main",
"index": 0
}
]
]
},
"IF Exists?": {
"main": [
[
{
"node": "Airtable Upsert",
"type": "main",
"index": 0
}
],
[
{
"node": "Apollo Enrich (Person)",
"type": "main",
"index": 0
}
]
]
},
"Apollo Enrich (Person)": {
"main": [
[
{
"node": "Merge Apollo \u2192 Lead",
"type": "main",
"index": 0
}
]
]
},
"Merge Apollo \u2192 Lead": {
"main": [
[
{
"node": "Dropcontact Verify",
"type": "main",
"index": 0
}
]
]
},
"Dropcontact Verify": {
"main": [
[
{
"node": "Merge Dropcontact",
"type": "main",
"index": 0
}
]
]
},
"Merge Dropcontact": {
"main": [
[
{
"node": "Airtable Upsert",
"type": "main",
"index": 0
}
]
]
},
"Airtable Upsert": {
"main": [
[
{
"node": "Smartlead Add to Campaign",
"type": "main",
"index": 0
}
]
]
},
"Smartlead Add to Campaign": {
"main": [
[
{
"node": "Respond 200",
"type": "main",
"index": 0
}
]
]
},
"Webhook IN (Replies)": {
"main": [
[
{
"node": "Airtable Update (on Reply)",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"templateCredsSetup": true
}
}
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.
airtableApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
LH → n8n → Apollo + Dropcontact → Airtable → Smartlead. Uses airtable, httpRequest. Webhook trigger; 13 nodes.
Source: https://gist.github.com/HATEM6584/2db18f18c1cff7aa7348dcb351f2f0af — 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.
AI Lead Qualification & Roting System. Uses httpRequest, twilio, airtable. Webhook trigger; 26 nodes.
TechSavvy Hawaii — Main Lead Intake. Uses airtable, emailSend, httpRequest. Webhook trigger; 9 nodes.
Ad Agency in a box. Uses httpRequest, splitOut, outputParserStructured, chainLlm. Webhook trigger; 54 nodes.
LinkedinComments (youtube). Uses stickyNote, httpRequest, lmChatGoogleGemini, outputParserAutofixing. Webhook trigger; 27 nodes.
This workflow automates bulk email campaigns with built-in validation, deliverability protection, and smart send-time optimization.