This workflow corresponds to n8n.io template #15815 — we link there as the canonical source.
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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "f627cae3-7ca8-4c7c-829a-27720decafb6",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-368
],
"parameters": {
"color": 7,
"width": 1024,
"height": 208,
"content": "## Need more advanced automation solutions? Contact us for custom enterprise workflows!\n\n# Growth-AI.fr\n\n## https://www.linkedin.com/in/allanvaccarizi/\n## https://www.linkedin.com/in/hugo-marinier-%F0%9F%A7%B2-6537b633/"
},
"typeVersion": 1
},
{
"id": "2c10e25d-60f9-49e0-be6c-4de39edade48",
"name": "Sticky Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-784
],
"parameters": {
"color": 7,
"width": 1024,
"height": 400,
"content": ""
},
"typeVersion": 1
},
{
"id": "2281e3fc-8265-41ad-85f8-5a986f45f50c",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
-144
],
"parameters": {
"width": 480,
"height": 672,
"content": "## Linkedin bulk invitation\n\n### How it works\n\n1. A schedule trigger fires periodically and fetches pending contact records from Airtable, limiting the batch size.\n2. A loop node iterates over each record one at a time.\n3. For each record, a LinkedIn session is retrieved via the Unipile API, then a connection invitation is sent to the prospect.\n4. Depending on the outcome of the invitation, the corresponding Airtable record is updated (success or error path), and the loop continues with the next item.\n\n### Setup steps\n\n- - [ ] Configure the **Schedule Trigger** with the desired run frequency (e.g., daily, hourly).\n- - [ ] Add your **Airtable credentials** and set the correct base/table in **Search records**, **Update record**, and **Update record1**.\n- - [ ] Replace `YourUnipileDNS` in **Fetch LinkedIn User Session** and **Send LinkedIn Invitation** with your actual Unipile API domain.\n- - [ ] Add your **Unipile API key** to both HTTP Request nodes (Session and Invitation).\n- - [ ] Set the **Limit** node to the maximum number of invitations you want to send per run.\n- - [ ] Map the correct Airtable field names for status updates in **Update Invite Sent in Airtable** and **Update Error Status in Airtable**.\n\n### Customization\n\nYou can adjust the batch size in the Limit node to control how many LinkedIn invitations are sent per execution. The two Update record nodes can be configured to write different status values (e.g., 'Invited' vs. 'Error') depending on which branch is triggered."
},
"typeVersion": 1
},
{
"id": "7ca46d7f-39a2-4477-8c0f-22a1bfbb9705",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-32
],
"parameters": {
"color": 7,
"width": 608,
"height": 304,
"content": "## Schedule and fetch records\n\nTriggers the workflow on a schedule, queries Airtable for prospect records to process, and limits the result set to a safe batch size."
},
"typeVersion": 1
},
{
"id": "2c31efa5-6463-4cc0-867a-fe81b01cb129",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
976,
-112
],
"parameters": {
"color": 7,
"height": 368,
"content": "## Loop over prospects\n\nSplits the fetched records into individual items and iterates over them, returning here after each record is processed."
},
"typeVersion": 1
},
{
"id": "25877286-ccb6-4c7a-8cda-dd6090591e6f",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
-64
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Send LinkedIn invitation\n\nRetrieves an active LinkedIn session via the Unipile API for the current prospect, then sends a connection invitation on their behalf."
},
"typeVersion": 1
},
{
"id": "9072d80b-a61c-4f95-b8d1-56928fc8f801",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1696,
-144
],
"parameters": {
"color": 7,
"height": 560,
"content": "## Update Airtable record status\n\nUpdates the prospect's Airtable record after the invitation attempt \u2014 one node handles a successful invite, the other records errors or skipped sessions."
},
"typeVersion": 1
},
{
"id": "7efb2d86-da1c-44a5-b32c-9a50322e4e0c",
"name": "Every Monday at 10am",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
368,
96
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.3
},
{
"id": "75081e5a-4ded-4e75-88cb-5a331cb401bf",
"name": "Fetch Contacts from Airtable",
"type": "n8n-nodes-base.airtable",
"position": [
576,
96
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appnM9t2JxMCU2LQB",
"cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB",
"cachedResultName": "Test n8n"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblYMRKzkjzDoDuT3",
"cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB/tblYMRKzkjzDoDuT3",
"cachedResultName": "Table 3"
},
"options": {},
"operation": "search",
"filterByFormula": "{Invitation sent} = \"\""
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "54c2aaac-dde4-494d-a905-c8fea206a296",
"name": "Fetch LinkedIn User Session",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1296,
96
],
"parameters": {
"url": "=https://YourUnipileDNS/api/v1/users/{{ $json.fields['Linkedin'].split('/').filter(Boolean).pop() }}",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "account_id",
"value": "kOcwUe4_T-mpgGyZEIMeUA"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "8ccddbb7-fe09-4a82-ab48-0314f46e2e85",
"name": "Send LinkedIn Invitation",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1520,
96
],
"parameters": {
"url": "https://YourUnipileDNS/api/v1/users/invite",
"method": "POST",
"options": {},
"jsonBody": "={\n \"account_id\": \"kOcwUe4_T-mpgGyZEIMeUA\",\n \"provider_id\": \"{{ $json.provider_id }}\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "317005a6-491f-4ecc-a627-9c5957d9927d",
"name": "Limit to 100 Contacts",
"type": "n8n-nodes-base.limit",
"position": [
784,
96
],
"parameters": {
"maxItems": 100
},
"typeVersion": 1
},
{
"id": "5cadb30a-af8f-4533-8bde-fdd864059ff1",
"name": "Update Invite Sent in Airtable",
"type": "n8n-nodes-base.airtable",
"position": [
1744,
112
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appnM9t2JxMCU2LQB",
"cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB",
"cachedResultName": "Test n8n"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblYMRKzkjzDoDuT3",
"cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB/tblYMRKzkjzDoDuT3",
"cachedResultName": "Table 3"
},
"columns": {
"value": {
"id": "={{ $('Loop Over Contacts').item.json.id }}",
"Invitation sent": "={{ new Date().toISOString() }}",
"Linkedin available": "Available"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"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",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Linkedin",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invitation sent",
"type": "dateTime",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Invitation sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepted",
"type": "boolean",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Accepted",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Linkedin available",
"type": "options",
"display": true,
"options": [
{
"name": "Available",
"value": "Available"
},
{
"name": "Not available",
"value": "Not available"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Linkedin available",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "c1a7b460-c8f8-4a64-a07e-aa780b46da80",
"name": "Loop Over Contacts",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1024,
96
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "2e06d733-842b-41d9-ae50-6631749b351b",
"name": "Update Error Status in Airtable",
"type": "n8n-nodes-base.airtable",
"position": [
1744,
256
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appnM9t2JxMCU2LQB",
"cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB",
"cachedResultName": "Test n8n"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblYMRKzkjzDoDuT3",
"cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB/tblYMRKzkjzDoDuT3",
"cachedResultName": "Table 3"
},
"columns": {
"value": {
"id": "={{ $('Loop Over Contacts').item.json.id }}",
"Linkedin available": "Not available"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"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",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Linkedin",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Invitation sent",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Invitation sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepted",
"type": "boolean",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Accepted",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Linkedin available",
"type": "options",
"display": true,
"options": [
{
"name": "Available",
"value": "Available"
},
{
"name": "Not available",
"value": "Not available"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Linkedin available",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
}
],
"connections": {
"Loop Over Contacts": {
"main": [
[],
[
{
"node": "Fetch LinkedIn User Session",
"type": "main",
"index": 0
}
]
]
},
"Every Monday at 10am": {
"main": [
[
{
"node": "Fetch Contacts from Airtable",
"type": "main",
"index": 0
}
]
]
},
"Limit to 100 Contacts": {
"main": [
[
{
"node": "Loop Over Contacts",
"type": "main",
"index": 0
}
]
]
},
"Send LinkedIn Invitation": {
"main": [
[
{
"node": "Update Invite Sent in Airtable",
"type": "main",
"index": 0
}
],
[
{
"node": "Update Error Status in Airtable",
"type": "main",
"index": 0
}
]
]
},
"Fetch LinkedIn User Session": {
"main": [
[
{
"node": "Send LinkedIn Invitation",
"type": "main",
"index": 0
}
],
[
{
"node": "Update Error Status in Airtable",
"type": "main",
"index": 0
}
]
]
},
"Fetch Contacts from Airtable": {
"main": [
[
{
"node": "Limit to 100 Contacts",
"type": "main",
"index": 0
}
]
]
},
"Update Invite Sent in Airtable": {
"main": [
[
{
"node": "Loop Over Contacts",
"type": "main",
"index": 0
}
]
]
},
"Update Error Status in Airtable": {
"main": [
[
{
"node": "Loop Over Contacts",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
airtableTokenApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is for sales teams, growth hackers, and outreach specialists who manage prospect lists in Airtable and want to automate LinkedIn connection requests at scale without manual effort. A schedule trigger fires every Monday at 10am and fetches all Airtable contact…
Source: https://n8n.io/workflows/15815/ — 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.
Convert your customer satisfaction into high-converting social media content with this fully automated social proof pipeline. This workflow scans your database for top-tier reviews, generates a brande
Linkedin Automation. Uses airtable, telegram, scheduleTrigger, stickyNote. Scheduled trigger; 15 nodes.
🧠 Problem This Solves Manually sharing Medium articles to LinkedIn daily can be repetitive and time-consuming. This automation:
🧠 Problem This Solves: For developers and creators, consistently posting quality content on LinkedIn can be time-consuming. This workflow automates the process by:
Linkedin to Airtable. Uses httpRequest, airtable. Scheduled trigger; 10 nodes.