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 →
{
"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
}
]
]
}
}
}
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🧾 Short Description
This workflow automates legislative compliance analysis by coordinating multiple specialized OpenAI agents to interpret regulatory documents, evaluate organizational impact, and manage stakeholder com
[](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
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
Law firms in corporate, litigation, or family law needing streamlined case and contract management.