Génération et publication de contenu LinkedIn via des agents IA et l'API Chat Gemini
Ceci est unMultimodal AIworkflow d'automatisation du domainecontenant 43 nœuds.Utilise principalement des nœuds comme Set, Code, Gmail, Switch, LinkedIn. Machine à contenu LinkedIn : génération de publications approuvées par e-mail via Gemini AI
- •Compte Google et informations d'identification Gmail API
- •Informations d'identification LinkedIn API
- •Informations d'identification Google Sheets API
- •Clé API Google Gemini
Nœuds utilisés (43)
Catégorie
{
"id": "fDLwldlY6FV3fqJ2",
"meta": {
"instanceId": "cc015731fc495809b886aea182b15bbd667eb8429470d9c57541b0221b87b7e0",
"templateCredsSetupCompleted": true
},
"name": "Generate and post Content on Linkedin using AI Agent with Gemini Chat API",
"tags": [],
"nodes": [
{
"id": "d24cd7a9-52b3-4cde-8323-748f4a474e9f",
"name": "Lors du clic sur 'Exécuter le workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-528,
-64
],
"parameters": {},
"typeVersion": 1
},
{
"id": "9d8dc5b0-603a-484a-b710-0484141017ec",
"name": "Modifier les champs",
"type": "n8n-nodes-base.set",
"position": [
-304,
-64
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "baaa3fc3-f510-4af1-80ac-7b46619de020",
"name": "niche",
"type": "string",
"value": "startup founders in SaaS"
},
{
"id": "287ddc20-8032-4fc4-8913-ca52fbb58d29",
"name": "audience",
"type": "string",
"value": "growth-focused professionals"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "d7740a8c-0cf3-4bdc-84c9-4e5261ace324",
"name": "Agent IA",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-80,
-64
],
"parameters": {
"text": "=You are a content strategist for LinkedIn.\nGiven a niche and audience, return 10 scroll-stopping post ideas as compact titles.\nOutput STRICT JSON:\n{\n \"ideas\": [\n {\"id\": 1, \"title\": \"...\"},\n ...\n {\"id\": 10, \"title\": \"...\"}\n ]\n}\nNiche: {{$json.niche}}\nAudience: {{$json.audience}}\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "80d63523-f0e3-4253-8d66-1de45233dfbe",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-8,
160
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"id": "FfoNPWQzVaqAowCG",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "be593fa2-f68c-461d-994a-d5b7274c3a6a",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
272,
-64
],
"parameters": {
"jsCode": "// 1) Get raw AI output from the previous node\nlet raw = $input.first().json.output || $json.data || \"\";\n\n// 2) Remove ```json fences if present\nraw = raw.replace(/```json/i, \"\").replace(/```/g, \"\").trim();\n\n// 3) Parse\nlet data;\ntry { data = JSON.parse(raw); }\ncatch (e) { throw new Error(\"Gemini did not return valid JSON:\\n\" + raw); }\n\nconst ideas = data.ideas || [];\n\n// 4) Create correlationId for this email thread/session\nconst correlationId = Date.now().toString() + '-' + Math.random().toString(36).slice(2,8);\n\n// 5) Build a nice email body\nlet body = `Here are 10 LinkedIn post ideas for “$('Edit Fields').first().json.audience” in “$('Edit Fields').first().json.niche”:\\n\\n`;\nideas.forEach(i => { body += `${i.id}. ${i.title}\\n`; });\nbody += `\\nReply with the number (1–10) to draft posts.\\n`;\n\n// 6) Return\nreturn [{\n correlationId,\n niche: $('Edit Fields').first().json.niche,\n audience: $('Edit Fields').first().json.audience,\n ideas,\n emailBody: body\n}];\n"
},
"typeVersion": 2
},
{
"id": "db32c86a-f3d3-4257-80cc-1d9c45f2d9df",
"name": "Envoyer un message",
"type": "n8n-nodes-base.gmail",
"position": [
720,
-64
],
"webhookId": "b2d6878b-8142-4621-bc13-36dc9ab30273",
"parameters": {
"sendTo": "yourmail@gmail.com ",
"message": "={{ $('Code').item.json.emailBody }}",
"options": {},
"subject": "=Your 10 LinkedIn Ideas [CID: {{ $json['correlationId '] }}]"
},
"credentials": {
"gmailOAuth2": {
"id": "UGcoN71TRNANpnvK",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "eeafee6c-8258-48d7-99f6-7cd80b1c95bf",
"name": "Gmail Trigger",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-528,
516
],
"parameters": {
"filters": {
"q": "to:me subject:\"[CID:\" is:inbox -category:promotions",
"sender": "yourmail@gmail.com ",
"includeSpamTrash": false
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"id": "UGcoN71TRNANpnvK",
"name": "Gmail account"
}
},
"executeOnce": true,
"typeVersion": 1.3
},
{
"id": "812e4f0c-4d66-4fba-a7dc-882504ac3cd5",
"name": "Code1",
"type": "n8n-nodes-base.code",
"position": [
-304,
516
],
"parameters": {
"jsCode": "// Pull a plain text we can regex against (snippet is usually fine)\nconst text = ($input.first().json.snippet || '').trim();\n\n// First number in the reply\nconst numMatch = text.match(/\\d+/);\nconst selectedNumber = numMatch ? Number(numMatch[0]) : null;\n\n// Extract correlationId from Subject header\nlet subject = $input.first().json.Subject\nconst cidMatch = subject.match(/\\[CID:\\s*([^\\]]+)\\]/i);\nconst correlationId = cidMatch ? cidMatch[1] : null;\n\n// Who replied (optional, can be useful)\nlet from = '';\nif ($json.payload && $json.payload.headers) {\n const f = $json.payload.headers.find(h => h.name === 'From');\n from = f ? f.value : '';\n}\n\nif (!correlationId || !selectedNumber) {\n return [{ kind: 'unknown', reason: 'Missing CID or number', subject, text }];\n}\n\nreturn [{\n kind: 'numberReply',\n selectedNumber,\n correlationId,\n from\n}];\n"
},
"typeVersion": 2
},
{
"id": "fdcd4332-9481-48c9-98a0-00b9aa2f6d85",
"name": "Code2",
"type": "n8n-nodes-base.code",
"position": [
464,
384
],
"parameters": {
"jsCode": "// Parse ideas into array\nconst ideas = JSON.parse($input.first().json.ideas || \"[]\");\n\n// Convert selected number to string because ids are strings in your JSON\nconst selectedNumber = $('Code1').first().json.selectedNumber;\n\n// Find chosen idea\nconst chosen = ideas.find(i => i.id === selectedNumber);\n\nif (!chosen) {\n return [{\n error: true,\n msg: 'Idea not found',\n selectedNumber\n }];\n}\n\nreturn [{\n correlationId: $input.first().json['correlationId '],\n selectedTopic: chosen.title,\n niche: $input.first().json.niche,\n audience: $input.first().json.audience\n}];\n"
},
"typeVersion": 2
},
{
"id": "d809b62b-d5d9-4d87-8961-6be7ee9b2ae8",
"name": "AI Agent1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
704,
272
],
"parameters": {
"text": "=Create 3 LinkedIn post drafts about the topic below, tailored to the audience.\nLength: 120–200 words each, plain text. Avoid emojis unless natural.\nOutput strict JSON:\n{\n \"drafts\": [\n {\"id\": 1, \"text\": \"...\"},\n {\"id\": 2, \"text\": \"...\"},\n {\"id\": 3, \"text\": \"...\"}\n ]\n}\nTopic: {{$json.selectedTopic}}\nAudience: {{$json.audience}}\nNiche: {{$json.niche}}\nTone: insightful, practical, founder-friendly\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "2594ad03-fcb3-4ac8-b707-663cac6fb1b9",
"name": "Google Gemini Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
768,
480
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"id": "FfoNPWQzVaqAowCG",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "aee41c79-9bce-4756-8603-15406165f11b",
"name": "Ajouter une ligne dans la feuille",
"type": "n8n-nodes-base.googleSheets",
"position": [
496,
-64
],
"parameters": {
"columns": {
"value": {
"ideas": "={{ $json.ideas }}",
"niche": "={{ $json.niche }}",
"stage": "=\"ideas\"",
"audience": "={{ $json.audience }}",
"correlationId ": "={{ $json.correlationId }}"
},
"schema": [
{
"id": "correlationId ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "correlationId ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "stage",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "stage",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "niche",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "niche",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "audience",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "audience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ideas",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ideas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "selectedTopic",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "selectedTopic",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "drafts",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "drafts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "linkedinUrn",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "linkedinUrn",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"correlationId"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1O0ewqwJerpjv6h8Zq5jrA4NC-crh4CVcH1uT2PHuUQg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/",
"cachedResultName": "Linkedin Post Idea"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "pToMN52MhgPTizJB",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "4a3db0b9-20c7-423e-b0e3-90d9249b63c9",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
144,
500
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Drafts Path",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a7824eea-4a1c-4e56-abfb-7b01f2195d76",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.stage }}",
"rightValue": "\"ideas\""
}
]
},
"renameOutput": true
},
{
"outputKey": "Publish Path",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9fcf7470-47bb-4ec6-bf94-dd154f4c5220",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.stage }}",
"rightValue": "\"drafts\""
}
]
},
"renameOutput": true
},
{
"outputKey": "END",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c92dcf46-6b16-49d2-b4a8-9612c8615a42",
"operator": {
"type": "string",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json.stage }}",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "6f8f75a6-2226-412f-9f2b-694f7cde6e10",
"name": "Code3",
"type": "n8n-nodes-base.code",
"position": [
1056,
272
],
"parameters": {
"jsCode": "let raw = $input.first().json.output || $json.data || \"\";\nraw = raw.replace(/```json/i, \"\").replace(/```/g, \"\").trim();\n\nlet data;\ntry { data = JSON.parse(raw); }\ncatch(e) { throw new Error(\"Gemini drafts JSON parse error:\\n\" + raw); }\n\nconst drafts = data.drafts || [];\nlet body = `Here are 3 drafts for:\\n“$('Code2').first().json.selectedTopic”\\n\\n`;\ndrafts.forEach(d => { body += `${d.id}. ${d.text}\\n\\n`; });\nbody += `Reply with 1, 2, or 3 to publish on LinkedIn.\\n`;\n\nreturn [{\n correlationId: $('Code2').first().json.correlationId,\n selectedTopic: $('Code2').first().json.selectedTopic,\n drafts,\n emailBody: body\n}];\n"
},
"typeVersion": 2
},
{
"id": "6570f3c1-e3a8-4a27-a600-e0d101bb0f03",
"name": "Mettre à jour une ligne dans la feuille",
"type": "n8n-nodes-base.googleSheets",
"position": [
1296,
272
],
"parameters": {
"columns": {
"value": {
"stage": "\"drafts\"",
"drafts": "={{ $json.drafts }}",
"selectedTopic": "={{ $json.selectedTopic }}",
"correlationId ": "={{ $json.correlationId }}"
},
"schema": [
{
"id": "correlationId ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "correlationId ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "stage",
"type": "string",
"display": true,
"required": false,
"displayName": "stage",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "niche",
"type": "string",
"display": true,
"required": false,
"displayName": "niche",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "audience",
"type": "string",
"display": true,
"required": false,
"displayName": "audience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ideas",
"type": "string",
"display": true,
"required": false,
"displayName": "ideas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "selectedTopic",
"type": "string",
"display": true,
"required": false,
"displayName": "selectedTopic",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "drafts",
"type": "string",
"display": true,
"required": false,
"displayName": "drafts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "linkedinUrn",
"type": "string",
"display": true,
"required": false,
"displayName": "linkedinUrn",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"correlationId "
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1O0ewqwJerpjv6h8Zq5jrA4NC-crh4CVcH1uT2PHuUQg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/k",
"cachedResultName": "Linkedin Post Idea"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "pToMN52MhgPTizJB",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "eea1b34d-eb46-4ea6-b592-1143d11f7065",
"name": "Envoyer un message1",
"type": "n8n-nodes-base.gmail",
"position": [
1536,
272
],
"webhookId": "52a5c9a2-50c0-4bae-ae92-f779f993bf06",
"parameters": {
"sendTo": "yourmail@gmail.com",
"message": "={{ $('Code3').item.json.emailBody }}",
"options": {},
"subject": "=Drafts for \"{{$json.selectedTopic}}\" [CID: {{ $json['correlationId '] }}]"
},
"credentials": {
"gmailOAuth2": {
"id": "UGcoN71TRNANpnvK",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "af15a85f-d54b-49d1-9225-c1a6bc34a30c",
"name": "Code4",
"type": "n8n-nodes-base.code",
"position": [
464,
688
],
"parameters": {
"jsCode": "// Extract drafts from sheet row\nlet drafts = $input.first().json.drafts || [];\nif (typeof drafts === 'string') {\n try {\n drafts = JSON.parse(drafts);\n } catch (e) {\n return [{ error: true, msg: 'Failed to parse drafts JSON', raw: drafts }];\n }\n}\n\n// Get selected number from earlier node\nconst idx = $item(0).$node[\"Code1\"].json.selectedNumber;\nconst selected = drafts.find(d => Number(d.id) === Number(idx));\n\nif (!selected) {\n return [{\n error: true,\n msg: `Draft #${idx} not found`,\n availableDrafts: drafts.map(d => d.id)\n }];\n}\n\nreturn [{\n correlationId: $json.correlationId,\n selectedTopic: $json.selectedTopic,\n finalPost: selected.text\n}];\n"
},
"typeVersion": 2
},
{
"id": "d4da723f-bf55-4718-9e69-d928d1d871eb",
"name": "Créer un post",
"type": "n8n-nodes-base.linkedIn",
"position": [
752,
688
],
"parameters": {
"text": "={{ $json.finalPost }}",
"postAs": "organization",
"organization": "79935287",
"authentication": "communityManagement",
"additionalFields": {}
},
"credentials": {
"linkedInCommunityManagementOAuth2Api": {
"id": "TXRpzuZrkSg5k9FL",
"name": "LinkedIn Community Management account"
}
},
"typeVersion": 1
},
{
"id": "9f09d25f-4e52-4a32-b819-3801cd48b46a",
"name": "Mettre à jour une ligne dans la feuille1",
"type": "n8n-nodes-base.googleSheets",
"position": [
992,
688
],
"parameters": {
"columns": {
"value": {
"stage": "Posted",
"linkedinUrn": "={{ $json.urn }}",
"correlationId ": "={{ $('Get row(s) in sheet').item.json['correlationId '] }}"
},
"schema": [
{
"id": "correlationId ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "correlationId ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "stage",
"type": "string",
"display": true,
"required": false,
"displayName": "stage",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "niche",
"type": "string",
"display": true,
"required": false,
"displayName": "niche",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "audience",
"type": "string",
"display": true,
"required": false,
"displayName": "audience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ideas",
"type": "string",
"display": true,
"required": false,
"displayName": "ideas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "selectedTopic",
"type": "string",
"display": true,
"required": false,
"displayName": "selectedTopic",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "drafts",
"type": "string",
"display": true,
"required": false,
"displayName": "drafts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "linkedinUrn",
"type": "string",
"display": true,
"required": false,
"displayName": "linkedinUrn",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"correlationId "
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1O0ewqwJerpjv6h8Zq5jrA4NC-crh4CVcH1uT2PHuUQg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/",
"cachedResultName": "Linkedin Post Idea"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "pToMN52MhgPTizJB",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "b7d82533-a238-4bb3-8ee5-a024344031dc",
"name": "Envoyer un message2",
"type": "n8n-nodes-base.gmail",
"position": [
1216,
688
],
"webhookId": "c4837158-b2b7-4230-be5a-6acc21cd8836",
"parameters": {
"sendTo": "yourmailcurrent@gmail.com",
"message": "=Published to LinkedIn ✅\n\nTopic:\n{{ $('Code4').item.json.selectedTopic }}\n\nPreview:\n{{($('Code4').item.json.finalPost).slice(0, 200) }}…\n",
"options": {},
"subject": "=Posted ✅ “{{ $('Code4').item.json.selectedTopic }}” [CID: {{ $json['correlationId '] }}]"
},
"credentials": {
"gmailOAuth2": {
"id": "UGcoN71TRNANpnvK",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "27456f83-4fab-47f3-b0da-967e0ceb578c",
"name": "Note adhésive",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1440,
-288
],
"parameters": {
"width": 704,
"height": 1360,
"content": "Turn a simple email workflow into a **LinkedIn content machine**. Generate post ideas, draft full posts, and auto-publish to LinkedIn — all controlled by replying to emails. \n\n---\n\n## 📌 Purpose \nAutomate your LinkedIn posting pipeline using **AI + Email approvals**. \n- Generate **10 scroll-stopping post ideas** tailored to your niche & audience. \n- Approve your favorite by replying to the email with a number. \n- Receive **3 AI-written drafts** for the chosen idea. \n- Pick your favorite draft via email reply. \n- The selected post gets **auto-published to LinkedIn** ✅. \n- All steps are logged in **Google Sheets**. \n\n---\n\n## 🔗 Apps Used \n- **Google Gemini** → generates ideas & drafts \n- **Gmail** → email-based approval workflow \n- **Google Sheets** → tracks ideas, drafts, and published posts \n- **LinkedIn API** → posts directly to your company or personal account \n\n---\n\n## ✨ Highlights \n- 📬 Email-based approval → no dashboards, just reply with a number \n- 📝 10 AI-generated content ideas + 3 full drafts per topic \n- 🔄 End-to-end tracking in Google Sheets (`ideas → drafts → published`) \n- ⚡ Auto-posting directly to LinkedIn \n- ✅ Final confirmation email with preview \n\n---\n\n## 👤 Best For \n- Startup founders \n- Agencies managing multiple clients’ LinkedIn \n- Solopreneurs & creators who want consistent posting \n\n---\n\n## 🛠️ Workflow Overview \n\n```mermaid\nflowchart TD\n A[Manual Trigger] --> B[AI Agent - Generate 10 Ideas]\n B --> C[Code - Parse JSON + Correlation ID]\n C --> D[Google Sheets - Append Ideas]\n D --> E[Gmail - Send Ideas Email]\n E --> F[Gmail Trigger - Await Reply]\n F --> G[Code1 - Extract Reply Number]\n G --> H[Google Sheets - Fetch Row]\n H --> I{Switch Stage}\n I -->|Ideas| J[AI Agent - Generate 3 Drafts]\n J --> K[Code3 - Parse Drafts]\n K --> L[Google Sheets - Update Drafts]\n L --> M[Gmail - Send Drafts Email]\n I -->|Drafts| N[Code4 - Select Final Draft]\n N --> O[LinkedIn - Publish Post]\n O --> P[Google Sheets - Update Posted]\n P --> Q[Gmail - Send Confirmation]\n"
},
"typeVersion": 1
},
{
"id": "fd24d63f-ff08-4bbb-ad21-ef373f050b00",
"name": "Note adhésive1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-616,
-160
],
"parameters": {
"color": 4,
"width": 272,
"height": 256,
"content": "### 1. Manual Trigger \nRuns workflow manually for testing or ad-hoc posting."
},
"typeVersion": 1
},
{
"id": "bf456d49-6752-4a42-a0e0-728b42c091fe",
"name": "Note adhésive2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
-160
],
"parameters": {
"content": "### 2. Edit Fields (Set Node) \nDefines **niche** & **audience** for content generation."
},
"typeVersion": 1
},
{
"id": "5fdf070e-5045-4178-ae6e-e97b5514711f",
"name": "Note adhésive3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-112,
-256
],
"parameters": {
"color": 3,
"width": 288,
"height": 352,
"content": "### 3. AI Agent (LangChain Agent) \nGenerates **10 post ideas** in strict JSON format."
},
"typeVersion": 1
},
{
"id": "a99ee1f8-19df-4f85-8f5e-7029b76b893d",
"name": "Note adhésive4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
128
],
"parameters": {
"color": 3,
"width": 352,
"content": "### 4. Google Gemini Chat Model \nLLM backend for AI Agent. Requires Gemini API credentials."
},
"typeVersion": 1
},
{
"id": "f0dde27d-4d91-4ecb-808f-974cc27b93b5",
"name": "Note adhésive5",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
-128
],
"parameters": {
"width": 224,
"height": 224,
"content": "### 5. Code (Parse AI Output) \nCleans JSON, generates correlationId, builds email body."
},
"typeVersion": 1
},
{
"id": "6e382e0e-864c-4804-8e52-fe61ee75b813",
"name": "Note adhésive6",
"type": "n8n-nodes-base.stickyNote",
"position": [
424,
-192
],
"parameters": {
"color": 5,
"height": 288,
"content": "### 6. Append Row in Sheet (Google Sheets) \nLogs generated ideas, stage set to *ideas*."
},
"typeVersion": 1
},
{
"id": "f8163c49-3c9c-4587-8666-ec93ada62ce1",
"name": "Note adhésive7",
"type": "n8n-nodes-base.stickyNote",
"position": [
672,
-240
],
"parameters": {
"color": 7,
"height": 336,
"content": "### 7. Send a Message (Gmail) \nEmails you the ideas. You reply with a number."
},
"typeVersion": 1
},
{
"id": "391c04c2-7832-4cd1-be7f-57b8d2783231",
"name": "Note adhésive8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-600,
324
],
"parameters": {
"color": 4,
"height": 352,
"content": "### 8. Gmail Trigger \nListens for replies with `[CID: ...]`."
},
"typeVersion": 1
},
{
"id": "ba7c562d-6bc2-47c9-a4d1-0e26d2f0c04b",
"name": "Note adhésive9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-376,
356
],
"parameters": {
"height": 320,
"content": "### 9. Code1 (Extract Reply) \nParses reply to extract chosen number & correlationId."
},
"typeVersion": 1
},
{
"id": "a86524e5-e4da-47ad-b2be-8f309d2860f3",
"name": "Obtenir une/des ligne(s) dans la feuille",
"type": "n8n-nodes-base.googleSheets",
"position": [
-80,
516
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $json.correlationId }}",
"lookupColumn": "correlationId "
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1O0ewqwJerpjv6h8Zq5jrA4NC-crh4CVcH1uT2PHuUQg/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1O0ewqwJerpjv6h8Zq5jrA4NC-crh4CVcH1uT2PHuUQg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1O0ewqwJerpjv6h8Zq5jrA4NC-crh4CVcH1uT2PHuUQg/edit?usp=drivesdk",
"cachedResultName": "Linkedin Post Idea"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "pToMN52MhgPTizJB",
"name": "Google Sheets account"
}
},
"executeOnce": true,
"typeVersion": 4.7,
"alwaysOutputData": true
},
{
"id": "e22c031e-2559-4c29-af11-67fe606a259c",
"name": "Note adhésive10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
356
],
"parameters": {
"color": 5,
"width": 192,
"height": 320,
"content": "### 10. Get Row(s) in Sheet \nFetches stored row by correlationId."
},
"typeVersion": 1
},
{
"id": "686e770c-ea46-4b41-aca6-a705fa093dbf",
"name": "Note adhésive11",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
336
],
"parameters": {
"color": 6,
"height": 464,
"content": "### 11. Switch \nRoutes flow: **ideas → drafts → publish**."
},
"typeVersion": 1
},
{
"id": "62331774-9639-4eb2-a8bf-1fcf50971901",
"name": "Note adhésive12",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
256
],
"parameters": {
"content": "### 12. Code2 (Match Selected Idea) \nFinds the chosen idea & extracts topic."
},
"typeVersion": 1
},
{
"id": "576bbe0f-f7fe-4de3-9fd7-fe19f7844e38",
"name": "Note adhésive13",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
128
],
"parameters": {
"color": 3,
"width": 288,
"height": 320,
"content": "### 13. AI Agent1 (Draft Generator) \nGenerates **3 drafts** (120–200 words each)."
},
"typeVersion": 1
},
{
"id": "9d83589b-207f-40ec-b74a-16506a070b98",
"name": "Note adhésive14",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
464
],
"parameters": {
"color": 3,
"width": 304,
"height": 112,
"content": "### 14. Google Gemini Chat Model1 \nBackend for AI Agent1."
},
"typeVersion": 1
},
{
"id": "39933d7c-28dc-4d6e-88a4-7142174ba3fe",
"name": "Note adhésive15",
"type": "n8n-nodes-base.stickyNote",
"position": [
976,
144
],
"parameters": {
"height": 256,
"content": "### 15. Code3 (Parse Drafts) \nParses drafts JSON, builds email body."
},
"typeVersion": 1
},
{
"id": "796a69f9-2900-4f83-8d48-c254eeede8c3",
"name": "Note adhésive16",
"type": "n8n-nodes-base.stickyNote",
"position": [
1232,
128
],
"parameters": {
"color": 5,
"height": 288,
"content": "### 16. Update Row in Sheet \nUpdates stage to *drafts*, logs drafts JSON."
},
"typeVersion": 1
},
{
"id": "6d2bb7da-ea48-46f7-a684-29fb4da0bad4",
"name": "Note adhésive17",
"type": "n8n-nodes-base.stickyNote",
"position": [
1504,
96
],
"parameters": {
"color": 7,
"height": 320,
"content": "### 17. Send a Message1 (Gmail) \nEmails you the 3 drafts for approval."
},
"typeVersion": 1
},
{
"id": "72eb365d-0a75-4568-bcc9-5c9e837a150c",
"name": "Note adhésive18",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
560
],
"parameters": {
"content": "### 18. Code4 (Match Selected Draft) \nExtracts final draft based on reply number."
},
"typeVersion": 1
},
{
"id": "2441751d-9a55-426d-995b-0c63313a41bc",
"name": "Note adhésive19",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
624
],
"parameters": {
"color": 6,
"content": "### 19. Create a Post (LinkedIn) \nPublishes final post to LinkedIn."
},
"typeVersion": 1
},
{
"id": "13eedb37-8e92-4fad-994a-40948c2bccb5",
"name": "Note adhésive20",
"type": "n8n-nodes-base.stickyNote",
"position": [
912,
608
],
"parameters": {
"color": 5,
"height": 256,
"content": "### 20. Update Row in Sheet1 \nUpdates sheet stage to *Posted* with LinkedIn URN."
},
"typeVersion": 1
},
{
"id": "fd76390c-8832-4ba6-a8c2-44e8d7913dd4",
"name": "Note adhésive21",
"type": "n8n-nodes-base.stickyNote",
"position": [
1168,
592
],
"parameters": {
"color": 7,
"height": 256,
"content": "### 21. Send a Message2 (Gmail) \nSends final confirmation email with preview."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"timezone": "Asia/Kolkata",
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "fDLwldlY6FV3fqJ2",
"executionOrder": "v1"
},
"versionId": "b50605e2-db09-447a-b131-1d982ed9c3ff",
"connections": {
"be593fa2-f68c-461d-994a-d5b7274c3a6a": {
"main": [
[
{
"node": "aee41c79-9bce-4756-8603-15406165f11b",
"type": "main",
"index": 0
}
]
]
},
"812e4f0c-4d66-4fba-a7dc-882504ac3cd5": {
"main": [
[
{
"node": "a86524e5-e4da-47ad-b2be-8f309d2860f3",
"type": "main",
"index": 0
}
]
]
},
"fdcd4332-9481-48c9-98a0-00b9aa2f6d85": {
"main": [
[
{
"node": "d809b62b-d5d9-4d87-8961-6be7ee9b2ae8",
"type": "main",
"index": 0
}
]
]
},
"6f8f75a6-2226-412f-9f2b-694f7cde6e10": {
"main": [
[
{
"node": "6570f3c1-e3a8-4a27-a600-e0d101bb0f03",
"type": "main",
"index": 0
}
]
]
},
"af15a85f-d54b-49d1-9225-c1a6bc34a30c": {
"main": [
[
{
"node": "d4da723f-bf55-4718-9e69-d928d1d871eb",
"type": "main",
"index": 0
}
]
]
},
"4a3db0b9-20c7-423e-b0e3-90d9249b63c9": {
"main": [
[
{
"node": "fdcd4332-9481-48c9-98a0-00b9aa2f6d85",
"type": "main",
"index": 0
}
],
[
{
"node": "af15a85f-d54b-49d1-9225-c1a6bc34a30c",
"type": "main",
"index": 0
}
],
[]
]
},
"d7740a8c-0cf3-4bdc-84c9-4e5261ace324": {
"main": [
[
{
"node": "be593fa2-f68c-461d-994a-d5b7274c3a6a",
"type": "main",
"index": 0
}
]
]
},
"d809b62b-d5d9-4d87-8961-6be7ee9b2ae8": {
"main": [
[
{
"node": "6f8f75a6-2226-412f-9f2b-694f7cde6e10",
"type": "main",
"index": 0
}
]
]
},
"9d8dc5b0-603a-484a-b710-0484141017ec": {
"main": [
[
{
"node": "d7740a8c-0cf3-4bdc-84c9-4e5261ace324",
"type": "main",
"index": 0
}
]
]
},
"d4da723f-bf55-4718-9e69-d928d1d871eb": {
"main": [
[
{
"node": "9f09d25f-4e52-4a32-b819-3801cd48b46a",
"type": "main",
"index": 0
}
]
]
},
"eeafee6c-8258-48d7-99f6-7cd80b1c95bf": {
"main": [
[
{
"node": "812e4f0c-4d66-4fba-a7dc-882504ac3cd5",
"type": "main",
"index": 0
}
]
]
},
"eea1b34d-eb46-4ea6-b592-1143d11f7065": {
"main": [
[]
]
},
"aee41c79-9bce-4756-8603-15406165f11b": {
"main": [
[
{
"node": "db32c86a-f3d3-4257-80cc-1d9c45f2d9df",
"type": "main",
"index": 0
}
]
]
},
"a86524e5-e4da-47ad-b2be-8f309d2860f3": {
"main": [
[
{
"node": "4a3db0b9-20c7-423e-b0e3-90d9249b63c9",
"type": "main",
"index": 0
}
]
]
},
"6570f3c1-e3a8-4a27-a600-e0d101bb0f03": {
"main": [
[
{
"node": "eea1b34d-eb46-4ea6-b592-1143d11f7065",
"type": "main",
"index": 0
}
]
]
},
"9f09d25f-4e52-4a32-b819-3801cd48b46a": {
"main": [
[
{
"node": "b7d82533-a238-4bb3-8ee5-a024344031dc",
"type": "main",
"index": 0
}
]
]
},
"80d63523-f0e3-4253-8d66-1de45233dfbe": {
"ai_languageModel": [
[
{
"node": "d7740a8c-0cf3-4bdc-84c9-4e5261ace324",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"2594ad03-fcb3-4ac8-b707-663cac6fb1b9": {
"ai_languageModel": [
[
{
"node": "d809b62b-d5d9-4d87-8961-6be7ee9b2ae8",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"d24cd7a9-52b3-4cde-8323-748f4a474e9f": {
"main": [
[
{
"node": "9d8dc5b0-603a-484a-b710-0484141017ec",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - IA Multimodale
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Parag Javale
@pollar-beerTech driven creative who turns ideas into impact. I blend storytelling, product strategy, and automation whether it’s hooky audio promos, smart LMS platforms, or AI driven workflows. I help businesses grab attention, streamline ops, and scale fast. Big on data, experiments, and building digital solutions that actually work.
Partager ce workflow