This workflow corresponds to n8n.io template #17178 — we link there as the canonical source.
This workflow follows the Airtable → Chainllm 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": "hNLQWQnsasikgoM6",
"meta": {
"builderVariant": "mcp",
"aiBuilderAssisted": true
},
"name": "LinkedIn Outreach Automation - Personalized Connect, Track & Follow-up (Airtable + Unipile + AI)",
"tags": [],
"nodes": [
{
"id": "dcb8c985-2e61-41fa-b173-02a4e314ee48",
"name": "Every Weekday 09:00",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-80,
400
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.3
},
{
"id": "f0c684db-af33-4a21-b569-1dabcda3dfa0",
"name": "Set Config",
"type": "n8n-nodes-base.set",
"position": [
144,
400
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cfg1",
"name": "accountId",
"type": "string",
"value": "REPLACE_WITH_UNIPILE_ACCOUNT_ID"
},
{
"id": "cfg2",
"name": "dsn",
"type": "string",
"value": "YOUR_DSN"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "11d5b7c6-5b8a-48c8-aa70-e10aacb226b8",
"name": "Fetch New Leads",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
368,
400
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"limit": 15,
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"options": {},
"operation": "search",
"returnAll": false,
"filterByFormula": "{Connection Status}='New'"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "13b98ea0-72f0-47ff-8999-0acd1bf8194d",
"name": "All Leads Processed",
"type": "n8n-nodes-base.noOp",
"position": [
832,
48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "db6c49e7-1447-4aac-9f4d-a9386306ba34",
"name": "Prepare Identifier",
"type": "n8n-nodes-base.set",
"position": [
848,
336
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "h1",
"name": "handle",
"type": "string",
"value": "={{ (() => { const pid = ($json[\"Public Identifier\"] || \"\").trim(); if (pid) return pid; const url = ($json[\"LinkedIn URL\"] || \"\"); const seg = url.split(\"/in/\")[1]; return seg ? seg.split(/[/?#]/)[0] : \"\"; })() }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "fb0c1a96-1e52-4151-a196-d54d7d9ff1b0",
"name": "Get LinkedIn Profile",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"maxTries": 3,
"position": [
1088,
336
],
"parameters": {
"url": "=https://{{ $('Set Config').first().json.dsn }}/api/v1/users/{{ encodeURIComponent($json.handle) }}",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "account_id",
"value": "={{ $('Set Config').first().json.accountId }}"
},
{
"name": "linkedin_sections",
"value": "*"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
},
"nodeCredentialType": "unipileApi"
},
"credentials": {
"unipileApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 4.4,
"waitBetweenTries": 5000
},
{
"id": "9fdddee9-f438-44d3-b114-ccc18a985fef",
"name": "Write Connection Note",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1456,
192
],
"parameters": {
"text": "=Prospect details:\nName: {{ $('Prepare Identifier').item.json.Name || $('Get LinkedIn Profile').item.json.first_name || 'there' }}\nHeadline: {{ $('Get LinkedIn Profile').item.json.headline || $('Prepare Identifier').item.json.Headline || '' }}\nAbout: {{ ($('Get LinkedIn Profile').item.json.summary || $('Get LinkedIn Profile').item.json.about || '').slice(0, 500) }}\nCompany: {{ $('Prepare Identifier').item.json.Company || '' }}\n\nWrite the connection note now (max 280 characters, output only the note).",
"batching": {},
"messages": {
"messageValues": [
{
"message": "You are an expert B2B LinkedIn outreach copywriter writing on behalf of a company that builds done-for-you AI outreach and lead-generation automations for founders, agencies and sales teams.\n\nWrite ONE personalized LinkedIn connection-request note to the prospect described by the user.\n\nHard rules:\n- MAXIMUM 280 characters. This is critical and non-negotiable.\n- Output ONLY the note text. No quotes, no preamble, no sign-off, no emojis.\n- Sound warm, human and peer-to-peer. Never salesy. Avoid buzzwords like synergy, game-changer, revolutionary.\n- Reference something specific from their headline, role or about section so it feels personal.\n- Add one light line hinting you help teams automate their outreach and lead-gen. No hard pitch, no links, no book-a-call ask.\n- If profile info is thin, stay genuine and brief. Never invent facts about them."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.9
},
{
"id": "979191bd-8d8e-441f-ab9d-abde15e828d7",
"name": "Note Writer Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1392,
384
],
"parameters": {
"model": "anthropic/claude-sonnet-4.6",
"options": {
"maxTokens": 400,
"temperature": 0.6
}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "a84a9b1e-3965-4a06-a421-9e03d4818360",
"name": "Note Schema (max 300)",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1520,
352
],
"parameters": {
"autoFix": true,
"schemaType": "manual",
"inputSchema": "{\"type\":\"object\",\"properties\":{\"note\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":300}},\"required\":[\"note\"],\"additionalProperties\":false}"
},
"typeVersion": 1.3
},
{
"id": "42e886ce-63a4-4dbb-a75e-baba617732a8",
"name": "Note Fixer Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1552,
544
],
"parameters": {
"model": "anthropic/claude-sonnet-4.6",
"options": {
"maxTokens": 400,
"temperature": 0.2
}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "96cd11b3-fd5a-423e-b68e-45863eaa11c2",
"name": "Enforce Char Limit",
"type": "n8n-nodes-base.set",
"position": [
1904,
288
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "g1",
"name": "note",
"type": "string",
"value": "={{ (() => { const n = ($json.output && $json.output.note) || $json.note || $json.text || ''; return n.length <= 300 ? n.trim() : n.slice(0, 300).replace(/\\s+\\S*$/, '').trim(); })() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "9369ae44-e001-47e2-9e79-77ece51badec",
"name": "Send Connection Request",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"maxTries": 3,
"position": [
2160,
288
],
"parameters": {
"url": "=https://{{ $('Set Config').first().json.dsn }}/api/v1/users/invite",
"method": "POST",
"options": {},
"jsonBody": "={{ { \"account_id\": $('Set Config').first().json.accountId, \"provider_id\": $('Get LinkedIn Profile').item.json.provider_id, \"message\": $json.note } }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
},
"nodeCredentialType": "unipileApi"
},
"credentials": {
"unipileApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 4.4,
"waitBetweenTries": 5000
},
{
"id": "d61684b6-5b98-453f-af17-cd742ca2c832",
"name": "Log Request Sent",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
2480,
176
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"columns": {
"value": {
"id": "={{ $('Prepare Identifier').item.json.id }}",
"Headline": "={{ $('Get LinkedIn Profile').item.json.headline || '' }}",
"Provider ID": "={{ $('Get LinkedIn Profile').item.json.provider_id || '' }}",
"About Summary": "={{ $('Get LinkedIn Profile').item.json.summary || '' }}",
"Invitation ID": "={{ $json.invitation_id || $json.id || '' }}",
"Campaign Status": "Active",
"Connection Note": "={{ $('Enforce Char Limit').item.json.note }}",
"Request Sent At": "={{ $now.toISO() }}",
"Connection Status": "Request Sent",
"Public Identifier": "={{ $('Prepare Identifier').item.json.handle }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn URL",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "LinkedIn URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Public Identifier",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Public Identifier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Provider ID",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Provider ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Headline",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Headline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "About Summary",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "About Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Note",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Connection Note",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Status",
"type": "options",
"display": true,
"options": [
{
"name": "New",
"value": "New"
},
{
"name": "Request Sent",
"value": "Request Sent"
},
{
"name": "Accepted",
"value": "Accepted"
},
{
"name": "Declined/Expired",
"value": "Declined/Expired"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Connection Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reply Status",
"type": "options",
"display": true,
"options": [
{
"name": "No Reply",
"value": "No Reply"
},
{
"name": "Replied",
"value": "Replied"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Reply Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Campaign Status",
"type": "options",
"display": true,
"options": [
{
"name": "Active",
"value": "Active"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Stopped (Replied)",
"value": "Stopped (Replied)"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Campaign Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invitation ID",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Invitation ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Chat ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Chat ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Request Sent At",
"type": "dateTime",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Request Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepted At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Accepted At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Replied At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Replied At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 1 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 1 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 2 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 2 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Count",
"type": "number",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Message Received",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Last Message Received",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Error",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Last Error",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "bd615ee7-7dc6-4dd8-8ce6-f1e8412f0a54",
"name": "Human-like Delay",
"type": "n8n-nodes-base.wait",
"position": [
2912,
464
],
"parameters": {
"amount": "={{ Math.floor(Math.random() * 61) + 30 }}"
},
"typeVersion": 1.1
},
{
"id": "30e439e7-73a8-4b3c-a2a5-a193722529e8",
"name": "Log Profile Error",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
2688,
528
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"columns": {
"value": {
"id": "={{ $('Prepare Identifier').item.json.id }}",
"Last Error": "={{ $json.error && $json.error.message ? $json.error.message : 'Profile fetch failed' }}",
"Campaign Status": "Error",
"Connection Status": "Error"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn URL",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "LinkedIn URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Public Identifier",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Public Identifier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Provider ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Provider ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Headline",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Headline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "About Summary",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "About Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Note",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Connection Note",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Status",
"type": "options",
"display": true,
"options": [
{
"name": "New",
"value": "New"
},
{
"name": "Request Sent",
"value": "Request Sent"
},
{
"name": "Accepted",
"value": "Accepted"
},
{
"name": "Declined/Expired",
"value": "Declined/Expired"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Connection Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reply Status",
"type": "options",
"display": true,
"options": [
{
"name": "No Reply",
"value": "No Reply"
},
{
"name": "Replied",
"value": "Replied"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Reply Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Campaign Status",
"type": "options",
"display": true,
"options": [
{
"name": "Active",
"value": "Active"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Stopped (Replied)",
"value": "Stopped (Replied)"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Campaign Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invitation ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Invitation ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Chat ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Chat ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Request Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Request Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepted At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Accepted At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Replied At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Replied At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 1 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 1 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 2 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 2 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Count",
"type": "number",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Message Received",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Last Message Received",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Error",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Last Error",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "62a83c82-9911-43db-9cd9-6c665b2be839",
"name": "Log Send Error",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
2512,
368
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"columns": {
"value": {
"id": "={{ $('Prepare Identifier').item.json.id }}",
"Last Error": "={{ $json.error && $json.error.message ? $json.error.message : 'Connection request failed' }}",
"Campaign Status": "Error",
"Connection Status": "Error"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn URL",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "LinkedIn URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Public Identifier",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Public Identifier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Provider ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Provider ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Headline",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Headline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "About Summary",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "About Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Note",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Connection Note",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Status",
"type": "options",
"display": true,
"options": [
{
"name": "New",
"value": "New"
},
{
"name": "Request Sent",
"value": "Request Sent"
},
{
"name": "Accepted",
"value": "Accepted"
},
{
"name": "Declined/Expired",
"value": "Declined/Expired"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Connection Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reply Status",
"type": "options",
"display": true,
"options": [
{
"name": "No Reply",
"value": "No Reply"
},
{
"name": "Replied",
"value": "Replied"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Reply Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Campaign Status",
"type": "options",
"display": true,
"options": [
{
"name": "Active",
"value": "Active"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Stopped (Replied)",
"value": "Stopped (Replied)"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Campaign Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invitation ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Invitation ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Chat ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Chat ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Request Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Request Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepted At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Accepted At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Replied At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Replied At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 1 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 1 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 2 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 2 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Count",
"type": "number",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Message Received",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Last Message Received",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Error",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Last Error",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "f7429bda-f1e2-42d9-b12c-ee4df6ce0f7e",
"name": "Loop Over Leads",
"type": "n8n-nodes-base.splitInBatches",
"position": [
592,
400
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "e515b2de-4665-4d24-ae4f-1d7a95a24cd9",
"name": "New Relation Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-48,
1216
],
"parameters": {
"path": "unipile-new-relation",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "39652197-fa63-4574-879e-cec0283ddfef",
"name": "Extract Relation",
"type": "n8n-nodes-base.set",
"position": [
176,
1216
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "r1",
"name": "providerId",
"type": "string",
"value": "={{ $json.body?.user_provider_id ?? $json.body?.provider_id ?? $json.body?.data?.user_provider_id ?? $json.body?.data?.provider_id ?? $json.body?.relation?.provider_id ?? $json.user_provider_id ?? $json.provider_id ?? '' }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "4ce57f59-8a6e-4290-936f-88064a6c1100",
"name": "Find Pending Lead",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
400,
1216
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"limit": 1,
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"options": {},
"operation": "search",
"returnAll": false,
"filterByFormula": "={{ \"AND({Provider ID}='\" + $json.providerId + \"', {Connection Status}='Request Sent')\" }}"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "dc23ac70-3f7a-452e-936c-ecc0fc3e4889",
"name": "Mark Accepted",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
624,
1216
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"columns": {
"value": {
"id": "={{ $json.id }}",
"Accepted At": "={{ $now.toISO() }}",
"Connection Status": "Accepted"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn URL",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "LinkedIn URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Public Identifier",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Public Identifier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Provider ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Provider ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Headline",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Headline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "About Summary",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "About Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Note",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Connection Note",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Connection Status",
"type": "options",
"display": true,
"options": [
{
"name": "New",
"value": "New"
},
{
"name": "Request Sent",
"value": "Request Sent"
},
{
"name": "Accepted",
"value": "Accepted"
},
{
"name": "Declined/Expired",
"value": "Declined/Expired"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Connection Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reply Status",
"type": "options",
"display": true,
"options": [
{
"name": "No Reply",
"value": "No Reply"
},
{
"name": "Replied",
"value": "Replied"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Reply Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Campaign Status",
"type": "options",
"display": true,
"options": [
{
"name": "Active",
"value": "Active"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Stopped (Replied)",
"value": "Stopped (Replied)"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Campaign Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invitation ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Invitation ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Chat ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Chat ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Request Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Request Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepted At",
"type": "dateTime",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Accepted At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Replied At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Replied At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 1 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 1 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up 2 Sent At",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up 2 Sent At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Count",
"type": "number",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Follow-up Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Message Received",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Last Message Received",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Error",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Last Error",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "04ac6a22-1dc8-4ec3-a705-caa85d38322f",
"name": "Message Received Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-80,
1664
],
"parameters": {
"path": "unipile-message-received",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "81c79017-bd5c-41c9-8d0b-bf69ff8faaa0",
"name": "Extract Message",
"type": "n8n-nodes-base.set",
"position": [
144,
1664
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "m1",
"name": "senderProviderId",
"type": "string",
"value": "={{ $json.body?.sender?.attendee_provider_id ?? $json.body?.sender?.provider_id ?? $json.sender?.attendee_provider_id ?? '' }}"
},
{
"id": "m2",
"name": "myUserId",
"type": "string",
"value": "={{ $json.body?.account_info?.user_id ?? $json.account_info?.user_id ?? '' }}"
},
{
"id": "m3",
"name": "messageText",
"type": "string",
"value": "={{ $json.body?.message ?? $json.message ?? '' }}"
},
{
"id": "m4",
"name": "chatId",
"type": "string",
"value": "={{ $json.body?.chat_id ?? $json.chat_id ?? '' }}"
},
{
"id": "m5",
"name": "eventType",
"type": "string",
"value": "={{ $json.body?.event ?? $json.event ?? '' }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "4b314955-778d-4cbd-931c-becc2ce0a69e",
"name": "Keep Inbound Replies Only",
"type": "n8n-nodes-base.filter",
"position": [
368,
1664
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "f1",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.senderProviderId }}",
"rightValue": "={{ $json.myUserId }}"
},
{
"id": "f2",
"operator": {
"type": "string",
"operation": "notEmpty"
},
"leftValue": "={{ $json.senderProviderId }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "7285caa8-b1f0-47f9-943a-2d911f7f69c7",
"name": "Find Lead By Sender",
"type": "n8n-nodes-base.airtable",
"maxTries": 3,
"position": [
624,
1664
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "appN6QjcbVPERZgtx"
},
"limit": 1,
"table": {
"__rl": true,
"mode": "id",
"value": "tblFuMN1Kx40tKIkY"
},
"options": {},
"operation": "search",
"returnAll": false,
"filterByFormula": "={{ \"{Provider ID}='\" + $json.senderProviderId + \"'\" }}"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 2.
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.
airtableTokenApiopenRouterApiunipileApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates LinkedIn outreach by using Airtable as a CRM, Unipile to fetch profiles and send connection requests/messages, and OpenRouter to generate personalized connection notes and follow-ups, while tracking accepts and replies via Unipile webhooks. Runs every…
Source: https://n8n.io/workflows/17178/ — 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 LinkedIn posts with Apify, transform them into optimized tweets and threads using Claude AI, store them in Airtable for approval, and publish to X on a daily schedule.
What It Does
This workflow transforms scattered Reddit discussions into a systematic lead generation machine by discovering actual marketing problems businesses face and automatically converting them into authorit
How it works Automates daily LinkedIn post creation from trending AI tweets. Fetches latest tweets, processes content, checks for duplicates, converts to LinkedIn-ready format, schedules, and posts au
Linkedin Automation. Uses toolHttpRequest, lmChatOpenRouter, agent, httpRequest. Scheduled trigger; 30 nodes.