AutomationFlowsMarketing & Ads › Lh → N8n → Apollo + Dropcontact → Airtable → Smartlead

Lh → N8n → Apollo + Dropcontact → Airtable → Smartlead

LH → n8n → Apollo + Dropcontact → Airtable → Smartlead. Uses airtable, httpRequest. Webhook trigger; 13 nodes.

Webhook trigger★★★★☆ complexity13 nodesAirtableHTTP Request
Marketing & Ads Trigger: Webhook Nodes: 13 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Marketing & Ads

AI Lead Qualification & Roting System. Uses httpRequest, twilio, airtable. Webhook trigger; 26 nodes.

HTTP Request, Twilio, Airtable
Marketing & Ads

TechSavvy Hawaii — Main Lead Intake. Uses airtable, emailSend, httpRequest. Webhook trigger; 9 nodes.

Airtable, Email Send, HTTP Request
Marketing & Ads

Ad Agency in a box. Uses httpRequest, splitOut, outputParserStructured, chainLlm. Webhook trigger; 54 nodes.

HTTP Request, Output Parser Structured, Chain Llm +5
Marketing & Ads

LinkedinComments (youtube). Uses stickyNote, httpRequest, lmChatGoogleGemini, outputParserAutofixing. Webhook trigger; 27 nodes.

HTTP Request, Google Gemini Chat, Output Parser Autofixing +3
Marketing & Ads

This workflow automates bulk email campaigns with built-in validation, deliverability protection, and smart send-time optimization.

HTTP Request, Postgres, Gmail