This workflow corresponds to n8n.io template #3883 — 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 →
{
"id": "yF1HNe2ucaE81fNl",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Linkedin Automation",
"tags": [],
"nodes": [
{
"id": "fa012332-1c95-4460-b1d1-9d54441c9179",
"name": "Get List of records used",
"type": "n8n-nodes-base.airtable",
"position": [
-40,
-80
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appt6kHkRkLlUh033",
"cachedResultUrl": "https://airtable.com/appt6kHkRkLlUh033",
"cachedResultName": "Linkdin"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliloartO26TD5TG",
"cachedResultUrl": "https://airtable.com/appt6kHkRkLlUh033/tbliloartO26TD5TG",
"cachedResultName": "Used Articles"
},
"options": {},
"operation": "search"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "2d99b3b7-2fcd-46bf-8859-f41e94cb5ae1",
"name": "Update the used node",
"type": "n8n-nodes-base.airtable",
"position": [
200,
280
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appt6kHkRkLlUh033",
"cachedResultUrl": "https://airtable.com/appt6kHkRkLlUh033",
"cachedResultName": "Linkdin"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliloartO26TD5TG",
"cachedResultUrl": "https://airtable.com/appt6kHkRkLlUh033/tbliloartO26TD5TG",
"cachedResultName": "Used Articles"
},
"columns": {
"value": {
"id": "={{ $('download image for post').item.json.id }}",
"value": "={{ $('download image for post').item.json.id }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "value",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "value",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "72abb016-8f58-4c4c-b492-9ba7a576441a",
"name": "map used articls ids",
"type": "n8n-nodes-base.code",
"position": [
200,
-80
],
"parameters": {
"jsCode": "let values = $input.all().map(item => item.json.value);\n\nreturn [\n {\n json: {\n values: values\n }\n }\n ];"
},
"typeVersion": 2
},
{
"id": "c6712f11-2852-49af-8fb9-235da0e4685c",
"name": "fetch articles from Url",
"type": "n8n-nodes-base.httpRequest",
"position": [
420,
-80
],
"parameters": {
"url": "=https://dev.to/api/articles?tag={{ $json.value }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "c49d5db2-d1c9-4444-8fa8-f39197e2a472",
"name": "filter only unused Ids",
"type": "n8n-nodes-base.filter",
"position": [
660,
-80
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "934a4ab8-bc6b-4d1b-b050-c1f19a03cc9f",
"operator": {
"type": "array",
"operation": "notContains",
"rightType": "any"
},
"leftValue": "={{ $('map used articls ids').item.json.values }}",
"rightValue": "={{ $json.id }}"
},
{
"id": "916a778e-02db-442b-9c69-4c53b4f55a87",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.language }}",
"rightValue": "en"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "99ef95fb-1dab-4093-beaa-18eb341b7c18",
"name": "get random articles",
"type": "n8n-nodes-base.code",
"position": [
880,
-80
],
"parameters": {
"jsCode": "function getRandomValue(list) {\n const randomIndex = Math.floor(Math.random() * list.length);\n return list[randomIndex];\n}\nreturn getRandomValue($input.all());"
},
"typeVersion": 2
},
{
"id": "0b390b7d-8729-48e5-aadc-5aa9da8c7139",
"name": "get random tags",
"type": "n8n-nodes-base.code",
"position": [
-280,
-80
],
"parameters": {
"jsCode": "const devToTags = [\n \"android\",\n \"androiddev\",\n \"kotlin\",\n \"jetpackcompose\",\n \"mobiledev\",\n \"mobile\",\n \"java\",\n \"oops\"\n];\n\n\nfunction getRandomValuesAsObjects(list, count) {\n const randomValues = [];\n for (let i = 0; i < count; i++) {\n const randomIndex = Math.floor(Math.random() * list.length);\n randomValues.push({ json: { value: list[randomIndex] } });\n }\n return randomValues;\n}\n\nreturn getRandomValuesAsObjects(devToTags, 1);\n"
},
"typeVersion": 2
},
{
"id": "6b16bc15-8d82-4aa0-9ee2-5a10f070d106",
"name": "sent the status",
"type": "n8n-nodes-base.telegram",
"position": [
520,
280
],
"parameters": {
"text": "=Linkdin Post Sent Successfully \n\n{{ $('download image for post').item.json.title }}\n\nDb Status Id {{ $json.id }}",
"chatId": "123456789",
"replyMarkup": "inlineKeyboard",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "99c5ed96-4220-46b0-9a2a-628963393894",
"name": "Morning 9 Clock",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-560,
-80
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9,19 * * *"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "d25bf5d7-0258-4f07-b0b7-54ace75ef697",
"name": "download image for post",
"type": "n8n-nodes-base.httpRequest",
"position": [
-420,
280
],
"parameters": {
"url": "={{ $json.social_image }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "792507fc-f956-4bc7-9c56-80f1078643a1",
"name": "make Linkedin post",
"type": "n8n-nodes-base.linkedIn",
"position": [
-100,
280
],
"parameters": {
"text": "=\ud83d\udcab {{ $('get random articles').item.json.title }} \u2b50\n\n{{ $json.description }}\n\nArticle link : {{ $json.url }}\n\n#AndroidDevelopment #MobileAppDevelopment #AppDevelopment #Programming #SoftwareEngineering #TechCommunity #DeveloperLife #Kotlin #LinkedInDevelopers \n#Mr4rogrammer #isharewhatilearn",
"person": "BQYGc4bH9N",
"additionalFields": {
"title": "={{ $json.description }}",
"visibility": "PUBLIC"
},
"shareMediaCategory": "IMAGE"
},
"credentials": {
"linkedInOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c81c749a-e21b-4ba6-beae-2b8a21523c06",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-560,
-600
],
"parameters": {
"width": 920,
"height": 400,
"content": "# \ud83d\udce2 Auto-Post Dev.to Articles to LinkedIn with Telegram Alerts\n\nThis n8n workflow automates your LinkedIn posting by fetching articles from [Dev.to](https://dev.to) twice a day (9:00 AM and 7:00 PM), ensuring consistent content sharing without manual effort.\n\nTo prevent duplicates, it stores posted article IDs in Airtable. It also sends a Telegram message after every successful post, so you stay updated.\n\n---\n"
},
"typeVersion": 1
},
{
"id": "61171a34-53a3-448a-886c-b0cc83b75b33",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-520
],
"parameters": {
"width": 580,
"height": 240,
"content": "\n## \u2705 Features\n\n- \ud83d\udd52 Runs twice daily at 9:00 AM and 7:00 PM (customizable)\n- \ud83d\udcf0 Fetches latest Dev.to articles by tag\n- \ud83d\udcc2 Uses Airtable to avoid reposting the same article\n- \ud83d\udce2 Posts to your LinkedIn profile or company page\n- \ud83d\udcec Sends a Telegram notification after successful posting\n- \u2699\ufe0f Fully customizable schedule, tags, and post format"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"timezone": "Asia/Kolkata",
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1"
},
"versionId": "9ba9094c-e57a-43ac-8e51-ba97b384bb87",
"connections": {
"get random tags": {
"main": [
[
{
"node": "Get List of records used",
"type": "main",
"index": 0
}
]
]
},
"Morning 9 Clock": {
"main": [
[
{
"node": "get random tags",
"type": "main",
"index": 0
}
]
]
},
"make Linkedin post": {
"main": [
[
{
"node": "Update the used node",
"type": "main",
"index": 0
}
]
]
},
"get random articles": {
"main": [
[
{
"node": "download image for post",
"type": "main",
"index": 0
}
]
]
},
"Update the used node": {
"main": [
[
{
"node": "sent the status",
"type": "main",
"index": 0
}
]
]
},
"map used articls ids": {
"main": [
[
{
"node": "fetch articles from Url",
"type": "main",
"index": 0
}
]
]
},
"filter only unused Ids": {
"main": [
[
{
"node": "get random articles",
"type": "main",
"index": 0
}
]
]
},
"download image for post": {
"main": [
[
{
"node": "make Linkedin post",
"type": "main",
"index": 0
}
]
]
},
"fetch articles from Url": {
"main": [
[
{
"node": "filter only unused Ids",
"type": "main",
"index": 0
}
]
]
},
"Get List of records used": {
"main": [
[
{
"node": "map used articls ids",
"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.
airtableTokenApilinkedInOAuth2ApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
🧠 Problem This Solves: For developers and creators, consistently posting quality content on LinkedIn can be time-consuming. This workflow automates the process by:
Source: https://n8n.io/workflows/3883/ — 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.
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:
Social Media AI Agent - Telegram. Uses httpRequest, markdown, noOp, airtable. Scheduled trigger; 26 nodes.
This n8n workflow is designed for content curators, digital marketers, and social media managers who want to automate the process of discovering, translating, and publishing news content from multiple
Save time - Eliminate manual LinkedIn posting and content scheduling tasks Stay consistent - Automated daily posting keeps your LinkedIn profile active and engaging Keep control - Preview every post b