AutomationFlowsAI & RAG › Linkedin Post Automation with AI (gpt-4o) Generation & Slack Approval

Linkedin Post Automation with AI (gpt-4o) Generation & Slack Approval

ByAmit Mehta @amitswba on n8n.io

This workflow automates the creation and publishing of LinkedIn posts with AI-generated content and human approval via Slack, using Google Sheets, OpenAI (GPT-4), Slack Interactive Messages, and the LinkedIn API.

Webhook trigger★★★★★ complexityAI-powered32 nodesOutput Parser StructuredOpenAI ChatGoogle Sheets TriggerAgentSlackHTTP RequestGoogle Sheets
AI & RAG Trigger: Webhook Nodes: 32 Complexity: ★★★★★ AI nodes: yes Added:

This workflow corresponds to n8n.io template #4483 — 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": "YOUR_WORKFLOW_ID",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "LinkedIn Post Automation with AI & Slack Approval",
  "tags": [],
  "nodes": [
    {
      "id": "workflow-overview-linkedin",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1050,
        -450
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "sheets-trigger-note",
      "name": "Sheets Trigger Info",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -750,
        -400
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "ai-generation-note",
      "name": "AI Generation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        130,
        -400
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "slack-approval-note",
      "name": "Slack Approval",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        730,
        -380
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "webhook-handler-note",
      "name": "Webhook Handler",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -750,
        -800
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "image-upload-note",
      "name": "Image Upload Process",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        950,
        -800
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "linkedin-publish-note",
      "name": "LinkedIn Publishing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1450,
        -780
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "status-update-note",
      "name": "Status Update",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2110,
        -900
      ],
      "parameters": {
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "0cd3e628-1720-49f7-9280-a1039d2c2ca9",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "notes": "Processes one item at a time to prevent API overload",
      "position": [
        -260,
        -180
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c36d36d6-0035-49ac-a757-4598d56e574e",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        328,
        40
      ],
      "parameters": {},
      "typeVersion": 1.2
    },
    {
      "id": "9f521172-07f4-4a17-b358-bd998e9a9d02",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        208,
        40
      ],
      "parameters": {},
      "typeVersion": 1.2
    },
    {
      "id": "09b0b22f-eb64-468f-85b0-1c9a0608631e",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "notes": "Receives approval responses - ensure URL is configured in Slack app",
      "position": [
        -700,
        -590
      ],
      "parameters": {},
      "typeVersion": 2
    },
    {
      "id": "4e2954d7-e4de-48bf-a974-5ec80c7b7b0c",
      "name": "Linkedin-Post-Topic",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "notes": "Triggers every minute for new posts in your spreadsheet",
      "position": [
        -700,
        -180
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "47c4cdd0-48ef-4e41-996b-ed29811b092e",
      "name": "Validate-Status",
      "type": "n8n-nodes-base.if",
      "notes": "Filters to process only 'Pending' items - prevents duplicates",
      "position": [
        -480,
        -180
      ],
      "parameters": {},
      "typeVersion": 2.2
    },
    {
      "id": "908eee31-78eb-482c-b331-2d3467d56b0d",
      "name": "Linedin-Post-Creator",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "notes": "Uses GPT-4 to generate LinkedIn content - customize prompt for your brand voice",
      "position": [
        180,
        -180
      ],
      "parameters": {},
      "typeVersion": 1.9
    },
    {
      "id": "882d6e5c-a7f0-425f-a501-1f7179f8857b",
      "name": "Format-Content",
      "type": "n8n-nodes-base.code",
      "notes": "Formats content for Slack display - handles special characters and newlines",
      "position": [
        556,
        -180
      ],
      "parameters": {},
      "typeVersion": 2
    },
    {
      "id": "31aea874-516c-47c7-9c5f-bde873faae4d",
      "name": "Approval-on-Slack",
      "type": "n8n-nodes-base.slack",
      "notes": "Sends for human review - edit the Slack user to change approver",
      "position": [
        780,
        -180
      ],
      "parameters": {},
      "notesInFlow": true,
      "typeVersion": 2.3
    },
    {
      "id": "8592224a-0370-48c3-b803-fe3653284545",
      "name": "Format-Response",
      "type": "n8n-nodes-base.code",
      "notes": "Extracts edited content from Slack response",
      "position": [
        -260,
        -590
      ],
      "parameters": {},
      "typeVersion": 2
    },
    {
      "id": "2c503653-e3b6-4229-a733-25fa666ba85a",
      "name": "Validate-Response",
      "type": "n8n-nodes-base.if",
      "notes": "Ensures response contains content before proceeding",
      "position": [
        -40,
        -590
      ],
      "parameters": {},
      "typeVersion": 2.2
    },
    {
      "id": "be68592f-f6a8-4698-8343-58d439eed3ac",
      "name": "Set-Final-Message",
      "type": "n8n-nodes-base.set",
      "notes": "Prepares approved content for publishing",
      "position": [
        180,
        -590
      ],
      "parameters": {},
      "typeVersion": 3.4
    },
    {
      "id": "4ec34acf-1704-4fd7-b14d-680409acbeda",
      "name": "Linkedin-User-Detail",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Fetches LinkedIn user ID for post attribution",
      "position": [
        400,
        -580
      ],
      "parameters": {},
      "typeVersion": 4.2
    },
    {
      "id": "78293261-7fbd-4757-8353-c2275ba2089a",
      "name": "Linkedin-post",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Publishes to your profile - update with your LinkedIn credentials",
      "position": [
        1500,
        -590
      ],
      "parameters": {},
      "typeVersion": 4.2
    },
    {
      "id": "54ee84f1-42e2-4f25-96a4-958b27f798f4",
      "name": "Get-Group-id",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Retrieves LinkedIn group IDs from Groups sheet",
      "position": [
        1720,
        -590
      ],
      "parameters": {},
      "typeVersion": 4.5
    },
    {
      "id": "4e3e1fc5-a0ae-469f-8399-79b9bf98ff41",
      "name": "Pick 1 by 1",
      "type": "n8n-nodes-base.splitInBatches",
      "notes": "Processes groups one at a time to avoid rate limits",
      "position": [
        1940,
        -590
      ],
      "parameters": {},
      "typeVersion": 3
    },
    {
      "id": "7309d6c0-bfec-4d06-b3c3-5b05ccab6df3",
      "name": "Post-Linkedin-Groups",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Posts to multiple groups - add group IDs in Groups sheet",
      "onError": "continueRegularOutput",
      "position": [
        2160,
        -540
      ],
      "parameters": {},
      "typeVersion": 4.2
    },
    {
      "id": "63b25ac7-e5dc-4836-96cf-5767b57c7784",
      "name": "Update-Status",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Marks as 'Posted' to prevent reprocessing",
      "position": [
        2160,
        -740
      ],
      "parameters": {},
      "typeVersion": 4.5
    },
    {
      "id": "348ca4b6-fbb0-4a07-9c3d-9a581b95c7fe",
      "name": "Register Image",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Initiates LinkedIn media upload - requires valid image URL from sheet",
      "position": [
        620,
        -580
      ],
      "parameters": {},
      "typeVersion": 4.2
    },
    {
      "id": "2dfdfc17-78f7-488b-82f2-cb229488062f",
      "name": "Upload-Image-data",
      "type": "n8n-nodes-base.set",
      "notes": "Extracts upload URL and asset ID from LinkedIn response",
      "position": [
        840,
        -580
      ],
      "parameters": {},
      "typeVersion": 3.4
    },
    {
      "id": "a68a5ba8-8913-455f-9893-12013322e9c0",
      "name": "Get Image Binary",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Downloads image from URL specified in spreadsheet",
      "position": [
        1060,
        -590
      ],
      "parameters": {},
      "typeVersion": 4.2
    },
    {
      "id": "37cfc754-d66f-43f8-b881-4b5f0e927fa2",
      "name": "Upload Image",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Uploads image binary to LinkedIn servers",
      "position": [
        1280,
        -590
      ],
      "parameters": {},
      "typeVersion": 4.2
    },
    {
      "id": "c67c5ae9-c0c0-4400-a5ed-c2f96842e24d",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "notes": "Extracts post ID for tracking through workflow",
      "position": [
        -40,
        -180
      ],
      "parameters": {},
      "typeVersion": 3.4
    },
    {
      "id": "8202c5f6-aa24-44d9-989e-b67d0c481e17",
      "name": "Set Topics and Images for Processing",
      "type": "n8n-nodes-base.code",
      "notes": "Extracts post ID and image URL from Slack approval response",
      "position": [
        -480,
        -600
      ],
      "parameters": {},
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "YOUR_VERSION_ID",
  "connections": {
    "Limit": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Set Topics and Images for Processing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "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
          }
        ]
      ]
    },
    "Upload Image": {
      "main": [
        [
          {
            "node": "Linkedin-post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Linkedin-post": {
      "main": [
        [
          {
            "node": "Get-Group-id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update-Status": {
      "main": [
        []
      ]
    },
    "Format-Content": {
      "main": [
        [
          {
            "node": "Approval-on-Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Register Image": {
      "main": [
        [
          {
            "node": "Upload-Image-data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format-Response": {
      "main": [
        [
          {
            "node": "Validate-Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate-Status": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Image Binary": {
      "main": [
        [
          {
            "node": "Upload Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Approval-on-Slack": {
      "main": [
        []
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Linedin-Post-Creator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Set-Final-Message": {
      "main": [
        [
          {
            "node": "Linkedin-User-Detail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload-Image-data": {
      "main": [
        [
          {
            "node": "Get Image Binary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate-Response": {
      "main": [
        [
          {
            "node": "Set-Final-Message",
            "type": "main",
            "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": "Register Image",
            "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
          }
        ]
      ]
    },
    "Set Topics and Images for Processing": {
      "main": [
        [
          {
            "node": "Format-Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
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 creation and publishing of LinkedIn posts with AI-generated content and human approval via Slack, using Google Sheets, OpenAI (GPT-4), Slack Interactive Messages, and the LinkedIn API.

Source: https://n8n.io/workflows/4483/ — 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

🧾 Short Description

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

This workflow automates legislative compliance analysis by coordinating multiple specialized OpenAI agents to interpret regulatory documents, evaluate organizational impact, and manage stakeholder com

HTTP Request, OpenAI Chat, Output Parser Structured +4
AI & RAG

[](https://www.youtube.com/watch?v=NAn5BSr15Ks) > This workflow connects a Slack chatbot with AI agents and Google Sheets to automate candidate resume evaluation. It extracts resume details, identi

HTTP Request, Output Parser Structured, OpenAI Chat +6
AI & RAG

This workflow automates end-to-end concert ticket booking validation and fan experience management using two coordinated AI agents. It is designed for ticketing platforms, event operators, and venue o

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

Law firms in corporate, litigation, or family law needing streamlined case and contract management.

Agent, OpenAI Chat, Output Parser Structured +5