AutomationFlowsAI & RAG › Auto-post Linkedin Updates From Spreadsheet Topics Using Gpt-4o

Auto-post Linkedin Updates From Spreadsheet Topics Using Gpt-4o

ByAmit Mehta @amitswba on n8n.io

This workflow automates the entire LinkedIn content distribution process — from AI-powered post creation to auto-posting on both personal LinkedIn profiles and LinkedIn groups, using GPT-4o and Google Sheets as the content source and control panel. Auto-generates professional…

Event trigger★★★★☆ complexityAI-powered13 nodesOutput Parser StructuredOpenAI ChatGoogle Sheets TriggerAgentHTTP RequestGoogle Sheets
AI & RAG Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #4344 — we link there as the canonical source.

This workflow follows the Agent → Google Sheets 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": "MDqbZwyjpy48Ytl0",
  "name": "Linkedin Post with Group",
  "tags": [],
  "nodes": [
    {
      "id": "511707c0-2e6b-4223-b126-454cf9f4ea11",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        -1440,
        -200
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "fd6b4832-3a29-475b-8019-470ebf51c501",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -1072,
        10
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"post\": {\n\t\t\t\"type\": \"string\"\n\t\t}\t\t\n\t}\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "0c8eea04-25b4-452c-917f-d989aeaa89f7",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1192,
        10
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "gpt-4o"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1a02780a-f95e-44f3-932c-c4aa635f9861",
      "name": "Linkedin-Post-Topic",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        -1880,
        -210
      ],
      "parameters": {
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8/edit?usp=drivesdk",
          "cachedResultName": "Linkedin Post"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5a6c2f81-1375-4d45-b383-0bdeacb3f32a",
      "name": "Validate-Status",
      "type": "n8n-nodes-base.if",
      "position": [
        -1660,
        -210
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ddab9b1e-0de2-4eb9-8d7b-b9f0846eb496",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.Status }}",
              "rightValue": "Pending"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1c0a2c6d-c2e7-474b-88e0-8b15edb290e4",
      "name": "Linedin-Post-Creator",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1220,
        -210
      ],
      "parameters": {
        "text": "=You are a LinkedIn post writer. You will be given a title and your task is to create an engaging LinkedIn post based on that title.\n\nYour post should:\n\nBegin with a compelling hook related to the title\n\nInclude 3-4 paragraphs of informative content\n\nEnd with a question to encourage engagement\n\nInclude 4-6 relevant hashtags\n\nUse appropriate emojis in between\n\nImportant formatting requirements:\n\nFormat all paragraphs with proper newline characters (\\n\\n) between them\n\nEnsure the text is properly escaped for JSON\n\nDo not use double quote (\") in response or any special character\n\nDo not put asterisk\n\nKeep the overall length appropriate for LinkedIn (under 3000 characters)\n\nNow, create a LinkedIn post based on the following title:\n{{ $('Linkedin-Post-Topic').item.json['Linkedin Post Title'] }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "72e79e7b-1e76-44f8-8893-bac589a46004",
      "name": "Format-Content",
      "type": "n8n-nodes-base.code",
      "position": [
        -844,
        -210
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\n\n\n\n//const postData = $('Limit').first().json.ID;\n\n// Store this value in a workflow variable that can be accessed by other nodes\n//$variables.PostId = postData;\n\n//$workflow.setContext('postContent', postData);\n\n// Also store it in a more persistent variable if needed across workflows\n//$variables.set('postData', postData);\n\n\n\n const updatedItems = items.map((item) => {\n  item.json.output.post = JSON.stringify(item.json.output.post);\n  return item;\n});\nreturn updatedItems; \n\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "50b46b9f-8250-47e4-bba5-379bfeb441ee",
      "name": "Linkedin-User-Detail",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -624,
        -210
      ],
      "parameters": {
        "url": "https://api.linkedin.com/v2/userinfo",
        "options": {
          "response": {
            "response": {}
          }
        },
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "63ea9ba8-4c38-4fee-b6eb-e382b3d90bdb",
      "name": "Linkedin-post",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -404,
        -210
      ],
      "parameters": {
        "url": "https://api.linkedin.com/v2/ugcPosts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"author\": \"urn:li:person:{{ $('Linkedin-User-Detail').item.json.sub }}\",\n  \"lifecycleState\": \"PUBLISHED\",\n  \"specificContent\": {\n    \"com.linkedin.ugc.ShareContent\": {\n      \"shareCommentary\": {\n        \"text\": {{ $('Format-Content').item.json.output.post }}\n      },\n      \"shareMediaCategory\": \"NONE\"\n      }\n  },\n  \"visibility\": {\n    \"com.linkedin.ugc.MemberNetworkVisibility\": \"PUBLIC\"\n  }\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "cf99dfae-35b1-48d1-a369-3ba9dd7ed974",
      "name": "Get-Group-id",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -184,
        -210
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1240468053,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8/edit#gid=1240468053",
          "cachedResultName": "Groups"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8/edit?usp=drivesdk",
          "cachedResultName": "Linkedin Post"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "9d23f626-39ea-47fd-ac54-90520e96700d",
      "name": "Pick 1 by 1",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        36,
        -210
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "165b45ec-f13e-45f5-b64e-0eb9b93af68f",
      "name": "Post-Linkedin-Groups",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        256,
        -160
      ],
      "parameters": {
        "url": "https://api.linkedin.com/v2/ugcPosts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"author\": \"urn:li:person:{{ $('Linkedin-User-Detail').item.json.sub }}\",\n  \"containerEntity\": \"urn:li:group:{{ $json.GroupIds }}\",\n  \"lifecycleState\": \"PUBLISHED\",\n  \"specificContent\": {\n    \"com.linkedin.ugc.ShareContent\": {\n      \"shareCommentary\": {\n        \"text\": {{ $('Format-Content').item.json.output.post }}\n      },\n      \"shareMediaCategory\": \"NONE\"\n    }\n  },\n  \"visibility\": {\n    \"com.linkedin.ugc.MemberNetworkVisibility\": \"PUBLIC\"\n  }\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ad781a4b-9905-4028-984c-8949f6f10136",
      "name": "Update-Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        256,
        -360
      ],
      "parameters": {
        "columns": {
          "value": {
            "ID": "={{ $('Limit').item.json.ID }}",
            "Status": "Posted"
          },
          "schema": [
            {
              "id": "ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Linkedin Post Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Linkedin Post Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Image Path",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Image Path",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/147NIoP4NAZtmXdjciHyKdOWqpPvJ9ifoS8P6HJxikY8/edit?usp=drivesdk",
          "cachedResultName": "Linkedin Post"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ea122424-0676-4423-985d-b72b0841837c",
  "connections": {
    "Limit": {
      "main": [
        [
          {
            "node": "Linedin-Post-Creator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pick 1 by 1": {
      "main": [
        [
          {
            "node": "Update-Status",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post-Linkedin-Groups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get-Group-id": {
      "main": [
        [
          {
            "node": "Pick 1 by 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Linkedin-post": {
      "main": [
        [
          {
            "node": "Get-Group-id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format-Content": {
      "main": [
        [
          {
            "node": "Linkedin-User-Detail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate-Status": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Linedin-Post-Creator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Linkedin-Post-Topic": {
      "main": [
        [
          {
            "node": "Validate-Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Linedin-Post-Creator": {
      "main": [
        [
          {
            "node": "Format-Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Linkedin-User-Detail": {
      "main": [
        [
          {
            "node": "Linkedin-post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post-Linkedin-Groups": {
      "main": [
        [
          {
            "node": "Pick 1 by 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Linedin-Post-Creator",
            "type": "ai_outputParser",
            "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

This workflow automates the entire LinkedIn content distribution process — from AI-powered post creation to auto-posting on both personal LinkedIn profiles and LinkedIn groups, using GPT-4o and Google Sheets as the content source and control panel. Auto-generates professional…

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.

OpenAI Chat, Memory Buffer Window, Output Parser Structured +11
AI & RAG

AI-Powered Keyword Cannibalization Detection Workflow

Agent, OpenAI Chat, Output Parser Structured +3
AI & RAG

Logistics teams spend hours manually validating shipment data, checking compliance, generating freight documents, and emailing stakeholders. Errors in HSN codes, weights, or carrier details can lead t

Google Sheets Trigger, OpenAI Chat, Output Parser Structured +6
AI & RAG

Googletranslate Noop. Uses stickyNote, googleTranslate, agent, lmChatOpenAi. Event-driven trigger; 22 nodes.

Google Translate, Agent, OpenAI Chat +5
AI & RAG

🉑 Generate Anki Flash Cards for Language Learning with Google Translate and GPT. Uses googleTranslate, agent, lmChatOpenAi, outputParserStructured. Event-driven trigger; 22 nodes.

Google Translate, Agent, OpenAI Chat +5