AutomationFlowsSocial Media › Auto-post Medium.com Articles to Linkedin with Telegram Alerts

Auto-post Medium.com Articles to Linkedin with Telegram Alerts

ByKrishna Kumar Eswaran @mrprogrammer on n8n.io

🧠 Problem This Solves Manually sharing Medium articles to LinkedIn daily can be repetitive and time-consuming. This automation:

Cron / scheduled trigger★★★★☆ complexity15 nodesAirtableTelegramHTTP RequestLinkedIn
Social Media Trigger: Cron / scheduled Nodes: 15 Complexity: ★★★★☆ Added:
Auto-post Medium.com Articles to Linkedin with Telegram Alerts — n8n workflow card showing Airtable, Telegram, HTTP Request integration

This workflow corresponds to n8n.io template #3931 — 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 →

Download .json
{
  "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,
        600
      ],
      "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": "c49d5db2-d1c9-4444-8fa8-f39197e2a472",
      "name": "filter only unused Ids",
      "type": "n8n-nodes-base.filter",
      "position": [
        640,
        -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.articles }}"
            }
          ]
        }
      },
      "typeVersion": 2.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        \"jetpack-compose\",\n        \"android-appdevelopment\",\n        \"app-development\"\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,
        600
      ],
      "parameters": {
        "text": "=Linkdin Post Sent Successfully  \n\n{{ $('If').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": "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 Medium Articles to LinkedIn with Telegram Alerts\n\nThis n8n workflow automates your LinkedIn posting by fetching articles from [medium.com](medium.com) 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 medium.com 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
    },
    {
      "id": "c6712f11-2852-49af-8fb9-235da0e4685c",
      "name": "fetch article ids from tag",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        420,
        -80
      ],
      "parameters": {
        "url": "=https://medium2.p.rapidapi.com/search/articles?query={{ $('get random tags').first().json.value }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "medium2.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": ""
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "6382e23e-e214-48b4-8d93-06fc2c74e7cc",
      "name": "Fetch Medium post using Article Id",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        880,
        -80
      ],
      "parameters": {
        "url": "=https://medium2.p.rapidapi.com/article/{{ $json.articles.randomItem() }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "medium2.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": ""
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "eb92a4b3-d468-4d0f-8488-e6edb122b1db",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -200,
        260
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "69a60b53-f719-44e8-9ca4-97b99205a253",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.image_url }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "792507fc-f956-4bc7-9c56-80f1078643a1",
      "name": "make Linkedin post",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        740,
        240
      ],
      "parameters": {
        "text": "={{ $('Fetch Medium post content').item.json.content.substring(0, 600) }} ...\n\nArticle link : https://freedium.cfd/{{ $('If').item.json.url }}\n\n#AndroidDevelopment #MobileAppDevelopment #AppDevelopment #Programming #SoftwareEngineering #TechCommunity #DeveloperLife #Kotlin #LinkedInDevelopers \n#Mr4rogrammer #isharewhatilearn",
        "person": "BQYGc4bH9N",
        "additionalFields": {
          "title": "=\ud83d\udcab {{ $('If').item.json.title }} \u2b50",
          "visibility": "PUBLIC"
        },
        "shareMediaCategory": "IMAGE"
      },
      "credentials": {
        "linkedInOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b5026d10-0bcf-4ef4-a42e-0d8162a7eccc",
      "name": "Fetch Medium post content",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        100,
        240
      ],
      "parameters": {
        "url": "=https://medium2.p.rapidapi.com/article/{{$json.id}}/content",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "medium2.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": ""
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d25bf5d7-0258-4f07-b0b7-54ace75ef697",
      "name": "download image for post",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        420,
        240
      ],
      "parameters": {
        "url": "={{ $('If').item.json.image_url }}",
        "options": {
          "allowUnauthorizedCerts": false
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0"
            }
          ]
        }
      },
      "typeVersion": 4.2,
      "alwaysOutputData": false
    }
  ],
  "active": false,
  "settings": {
    "timezone": "Asia/Kolkata",
    "callerPolicy": "workflowsFromSameOwner",
    "executionOrder": "v1"
  },
  "versionId": "cc2275e5-a8d2-468c-be91-5e14ad568e3a",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Fetch Medium post content",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "get random tags",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "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
          }
        ]
      ]
    },
    "Update the used node": {
      "main": [
        [
          {
            "node": "sent the status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "map used articls ids": {
      "main": [
        [
          {
            "node": "fetch article ids from tag",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter only unused Ids": {
      "main": [
        [
          {
            "node": "Fetch Medium post using Article Id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "download image for post": {
      "main": [
        [
          {
            "node": "make Linkedin post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get List of records used": {
      "main": [
        [
          {
            "node": "map used articls ids",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Medium post content": {
      "main": [
        [
          {
            "node": "download image for post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fetch article ids from tag": {
      "main": [
        [
          {
            "node": "filter only unused Ids",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Medium post using Article Id": {
      "main": [
        [
          {
            "node": "If",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

🧠 Problem This Solves Manually sharing Medium articles to LinkedIn daily can be repetitive and time-consuming. This automation:

Source: https://n8n.io/workflows/3931/ — original creator credit. Request a take-down →

More Social Media workflows → · Browse all categories →

Related workflows

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

Social Media

Linkedin Automation. Uses airtable, telegram, scheduleTrigger, stickyNote. Scheduled trigger; 15 nodes.

Airtable, Telegram, HTTP Request +1
Social Media

🧠 Problem This Solves: For developers and creators, consistently posting quality content on LinkedIn can be time-consuming. This workflow automates the process by:

Airtable, HTTP Request, Telegram +1
Social Media

Social Media AI Agent - Telegram. Uses httpRequest, markdown, noOp, airtable. Scheduled trigger; 26 nodes.

HTTP Request, Airtable, LinkedIn +3
Social Media

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

Edit Image, Facebook Graph Api, WordPress +9
Social Media

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

HTTP Request, Telegram, Google Sheets +2