This workflow corresponds to n8n.io template #11694 — we link there as the canonical source.
This workflow follows the Chainllm → 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 →
{
"id": "sO0ITg9dDFuBgpqw",
"name": "Complete Instagram Carousel Creation within Slack using Nano Banana Pro",
"tags": [],
"nodes": [
{
"id": "98c9d264-1d91-4cf9-9669-0ca5f39d614d",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1824,
160
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "12a62ee0-8b96-4c77-96be-72e360af3ffa",
"name": "Research Agent",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"notes": "Gather info via Web Search",
"position": [
-1344,
160
],
"parameters": {
"text": "=You are an excellent Instagram Researcher. Please conduct web searches on the following theme to find 'valuable and deep information' or 'latest trends' that can be used for feed posts, and summarize them comprehensively in detail.\n\nTheme: {{ $json.thema }}\n\nOutput format: Markdown",
"promptType": "define"
},
"typeVersion": 1.4
},
{
"id": "fe5a74f9-da3e-4108-a09a-c4d686826371",
"name": "Drafting Agent",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-1056,
160
],
"parameters": {
"text": "=You are a professional editor. Based on the research results, create a 'Plot (Draft)' for an Instagram Carousel post.\n\n## Research Content\n{{ $('Research Agent').first().json.text }}\n\n## Requirements\n- Target: High information sensitivity business audience\n- Goal: Overwhelming amount of information and usefulness that makes people want to 'Save'.\n- Structure: Carousel slides.\n- Style: [Consulting Slide Style] Compress information and keep density high. Do not omit necessary info, write in detail.\n- Caption Tone: Reliable, calm, professional.\n - NG: Overly hyped tones like 'Let's do it!' 'Wow!'\n - Emoji: Minimal. Professional use only.\n\n[IMPORTANT] Output structured JSON for image generation.\nOutput Format (JSON Only):\n{\n \"title\": \"Title\",\n \"caption\": \"Caption\",\n \"slides\": [\n { \n \"slide_num\": 1, \n \"content\": {\n \"headline\": \"Slide Title (Impact)\",\n \"points\": [\"Detail 1\", \"Detail 2\", \"Detail 3\"],\n \"visual_concept\": \"Visual concept instruction (e.g., Flowchart, Data correlation, Grid layout)\"\n }\n }\n ]\n}",
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.4
},
{
"id": "1cb15b83-4a09-441c-8e0b-0eedff220c6b",
"name": "Slack Approval (Draft)",
"type": "n8n-nodes-base.slack",
"position": [
-528,
160
],
"parameters": {
"select": "channel",
"message": "=\u3010Request for Review\u3011Draft for Feed Post is ready.\n\nTitle: {{ $json.title }}\n\nDraft:\n{{ $json.slides.map(s => `[${s.slide_num}] ${s.content.headline}\\n - ${s.content.points.join('\\n - ')}`).join('\\n') }}\n\nApprove?",
"options": {},
"channelId": {
"__rl": true,
"mode": "name",
"value": "#example"
},
"operation": "sendAndWait",
"approvalOptions": {
"values": {
"approvalType": "double"
}
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "5b5c1d3f-b92c-4c92-8910-56b6f802d9aa",
"name": "Approval Loop",
"type": "n8n-nodes-base.if",
"position": [
-368,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-approve",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.data.approved }}",
"rightValue": "approve"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e6efbe9e-b2c3-4bec-96de-176b9547e421",
"name": "Image Prompt Gen",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"notes": "Convert to Img Prompts",
"position": [
-176,
160
],
"parameters": {
"text": "=You are an expert in 'Visual Prompting'. Based on the confirmed draft, create detailed 'Image Generation Prompts' for Google Nano Banana Pro.\n\n## Draft\n{{ JSON.stringify($('JSON Parse (Content)').item.json.slides[0].content) }}\n\n## Constraints\n- One image per slide.\n- **Density:** High density information like consulting slides.\n- **Layout:** 1:1 Square. Grid system. Professional Infographic style.\n- **Text:** Instruct to include ALL text from `headline` and `points` verbatim. Legibility is key.\n- Style: Minimalist, Tech, Dark Mode, n8n style, Detailed Data Visualization\n\nOutput JSON:\n{\n \"visual_prompts\": [\n { \"slide_num\": 1, \"prompt\": \"...\" }\n ]\n}",
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.4
},
{
"id": "a1673778-fc06-4876-9136-5fd021a9477e",
"name": "Split Slides",
"type": "n8n-nodes-base.itemLists",
"position": [
272,
48
],
"parameters": {
"options": {},
"fieldToSplitOut": "visual_prompts"
},
"typeVersion": 3
},
{
"id": "3ffc4ec5-71db-4fc2-95cb-9bf7ef51a997",
"name": "IG Create Container",
"type": "n8n-nodes-base.facebookGraphApi",
"position": [
896,
288
],
"parameters": {
"edge": "media",
"node": "example",
"options": {
"queryParameters": {
"parameter": [
{
"name": "caption",
"value": "={{ String.fromCharCode(10) + String.fromCharCode(10) + $json.data.text }}"
},
{
"name": "image_url",
"value": "={{ JSON.parse($('Get Image (Kie.ai)').item.json.data.resultJson).resultUrls[0] }}"
}
]
}
},
"graphApiVersion": "v18.0",
"httpRequestMethod": "POST"
},
"credentials": {
"facebookGraphApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "20403d4c-8092-41cf-8074-c109847729f6",
"name": "Wait (Upload)",
"type": "n8n-nodes-base.wait",
"position": [
1120,
288
],
"parameters": {
"unit": "seconds",
"amount": 30
},
"typeVersion": 1
},
{
"id": "8fd39a2c-f3ef-4b21-8739-c7355a67c14e",
"name": "IG Publish",
"type": "n8n-nodes-base.facebookGraphApi",
"position": [
1360,
288
],
"parameters": {
"edge": "media_publish",
"node": "example",
"options": {
"queryParameters": {
"parameter": [
{
"name": "creation_id",
"value": "={{ $json.id }}"
}
]
}
},
"graphApiVersion": "v18.0",
"httpRequestMethod": "POST"
},
"credentials": {
"facebookGraphApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "88ec380e-ed11-4afc-a065-554fa2113abe",
"name": "Wait (Generation)",
"type": "n8n-nodes-base.wait",
"position": [
704,
48
],
"parameters": {
"amount": 100
},
"typeVersion": 1.1
},
{
"id": "b734cca6-d187-4a78-86f0-ed18b54655a4",
"name": "Image Generation (Kie.ai)",
"type": "n8n-nodes-base.httpRequest",
"position": [
480,
48
],
"parameters": {
"url": "https://api.kie.ai/api/v1/jobs/createTask",
"method": "POST",
"options": {},
"jsonBody": "={\n \"model\": \"nano-banana-pro\",\n \"input\": {\n \"prompt\": \"{{ $json.prompt }}\",\n \"aspect_ratio\": \"1:1\",\n \"resolution\": \"1K\",\n \"output_format\": \"png\"\n }\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "cd9533fd-250a-4a87-b9d8-8001f7c360d8",
"name": "Get Image (Kie.ai)",
"type": "n8n-nodes-base.httpRequest",
"position": [
976,
48
],
"parameters": {
"url": "https://api.kie.ai/api/v1/jobs/recordInfo",
"options": {},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $('Image Generation (Kie.ai)').item.json.data.taskId }}"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "40e5b5ed-9111-42eb-90d3-a018ed3dca71",
"name": "JSON Parse (Content)",
"type": "n8n-nodes-base.code",
"position": [
-768,
160
],
"parameters": {
"jsCode": "// Receive input from previous node\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n let content = item.json.text;\n \n // Handle case where output is already an object or missing\n if (!content) {\n if (item.json.response) content = item.json.response; // Fallback\n else if (typeof item.json === 'object' && item.json.title) {\n results.push(item.json);\n continue;\n }\n }\n\n if (typeof content === 'object') {\n results.push(content);\n continue;\n }\n\n // Remove markdown formatting\n const cleanJson = content.toString().replace(/```json/g, '').replace(/```/g, '').trim();\n \n // extract JSON object\n const match = cleanJson.match(/\\{.*\\}/s);\n const jsonStr = match ? match[0] : cleanJson;\n\n try {\n results.push(JSON.parse(jsonStr));\n } catch (error) {\n // Return raw if parsing fails\n results.push({ \n raw: content,\n error: error.message \n });\n }\n}\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "0a18796c-02df-4e77-8da0-aea56e07a48e",
"name": "JSON Parse (Prompts)",
"type": "n8n-nodes-base.code",
"position": [
96,
48
],
"parameters": {
"jsCode": "// Receive input from previous node\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n let content = item.json.text;\n \n // Handle case where output is already an object or missing\n if (!content) {\n if (item.json.response) content = item.json.response; // Fallback\n else if (typeof item.json === 'object' && item.json.visual_prompts) {\n results.push(item.json);\n continue;\n }\n }\n\n if (typeof content === 'object') {\n results.push(content);\n continue;\n }\n\n // Remove markdown formatting\n const cleanJson = content.toString().replace(/```json/g, '').replace(/```/g, '').trim();\n \n // extract JSON object\n const match = cleanJson.match(/\\{.*\\}/s);\n const jsonStr = match ? match[0] : cleanJson;\n\n try {\n results.push(JSON.parse(jsonStr));\n } catch (error) {\n // Return raw if parsing fails\n results.push({ \n raw: content,\n error: error.message \n });\n }\n}\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "a4e3adb6-f8b6-4143-a469-93a797f5078c",
"name": "Set Theme",
"type": "n8n-nodes-base.set",
"position": [
-1504,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "7d729fe6-59a8-4791-83c6-fbf395f76fd1",
"name": "thema",
"type": "string",
"value": "={{ $json.data.theme }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "6d54c992-26ba-4e11-a278-26e5acd63452",
"name": "Slack Approval (Final)",
"type": "n8n-nodes-base.slack",
"position": [
704,
288
],
"parameters": {
"select": "channel",
"message": "=\u3010Request for Review\u3011Caption and Images created.\n\nCaption:\n{{ $('JSON Parse (Content)').item.json.caption }}\n\nImage URL:\n{{ JSON.parse($json.data.resultJson).resultUrls[0] }}\n\nPlease check and submit final post text.",
"options": {},
"channelId": {
"__rl": true,
"mode": "name",
"value": "#example"
},
"operation": "sendAndWait",
"responseType": "freeText"
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "ea93ed29-30ea-4392-b310-5af8c401d73d",
"name": "Theme Input (Slack)",
"type": "n8n-nodes-base.slack",
"position": [
-1664,
160
],
"parameters": {
"select": "channel",
"message": "\u3010Request\u3011Input the theme for the post.",
"options": {},
"channelId": {
"__rl": true,
"mode": "name",
"value": "#example"
},
"operation": "sendAndWait",
"formFields": {
"values": [
{
"fieldLabel": "theme",
"placeholder": "e.g. Latest AI Trends",
"requiredField": true
}
]
},
"responseType": "customForm"
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "dfef50a4-4ab8-43c5-afe9-e42950126955",
"name": "OpenAI Model A",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-1344,
400
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5-mini",
"cachedResultName": "gpt-5-mini"
},
"options": {},
"builtInTools": {
"webSearch": {
"searchContextSize": "medium"
}
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "e65975dd-6c84-4265-99d9-24f270b826d7",
"name": "OpenAI Model B",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-752,
400
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {},
"builtInTools": {
"webSearch": {
"searchContextSize": "medium"
}
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "4525dbb3-4034-467b-8198-add97ec745f1",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2288,
-80
],
"parameters": {
"width": 398,
"height": 610,
"content": "## \ud83d\ude80 Automate Instagram Carousel Creation\nThis workflow turns a simple topic into a full Instagram Carousel post using AI agents.\n\n### How it works\n1. **Research**: Gathers deep insights from the web.\n2. **Drafting**: Structures content into high-value slides.\n3. **Visuals**: Generates professional infographics using Nano Banana Pro.\n4. **Publish**: Posts directly to Instagram after your approval.\n\n### Setup\n- Connect OpenAI, Slack, Facebook, and Kie.ai.\n- Set your Slack Channel and Instagram ID in the respective nodes."
},
"typeVersion": 1
},
{
"id": "4f70630b-9005-435a-a316-65c061031703",
"name": "Sticky Note Research",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1824,
-80
],
"parameters": {
"color": 7,
"width": 1224,
"height": 608,
"content": "## 1. Research & Draft\nAI Agents research the topic and create a structured draft."
},
"typeVersion": 1
},
{
"id": "9baf2d87-5c43-4e8d-90f5-831ee13d22b0",
"name": "Sticky Note Approval",
"type": "n8n-nodes-base.stickyNote",
"position": [
-576,
-80
],
"parameters": {
"color": 7,
"width": 972,
"height": 612,
"content": "## 2. Human Approval\nReview the draft before generating images to save credits."
},
"typeVersion": 1
},
{
"id": "4948aa84-fa07-4e56-973e-d8aa54c8467c",
"name": "Sticky Note Image",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-80
],
"parameters": {
"color": 7,
"width": 1158,
"height": 616,
"content": "## 3. Image Generation\nConverts the draft into visual prompts and generates images using Kie.ai."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "9b70293b-458f-444d-9c9b-d7992fc66ad9",
"connections": {
"Set Theme": {
"main": [
[
{
"node": "Research Agent",
"type": "main",
"index": 0
}
]
]
},
"Split Slides": {
"main": [
[
{
"node": "Image Generation (Kie.ai)",
"type": "main",
"index": 0
}
]
]
},
"Approval Loop": {
"main": [
[
{
"node": "Image Prompt Gen",
"type": "main",
"index": 0
}
],
[
{
"node": "Drafting Agent",
"type": "main",
"index": 0
}
]
]
},
"Wait (Upload)": {
"main": [
[
{
"node": "IG Publish",
"type": "main",
"index": 0
}
]
]
},
"Drafting Agent": {
"main": [
[
{
"node": "JSON Parse (Content)",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Model A": {
"ai_languageModel": [
[
{
"node": "Research Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Model B": {
"ai_languageModel": [
[
{
"node": "Drafting Agent",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Image Prompt Gen",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Research Agent": {
"main": [
[
{
"node": "Drafting Agent",
"type": "main",
"index": 0
}
]
]
},
"Image Prompt Gen": {
"main": [
[
{
"node": "JSON Parse (Prompts)",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Theme Input (Slack)",
"type": "main",
"index": 0
}
]
]
},
"Wait (Generation)": {
"main": [
[
{
"node": "Get Image (Kie.ai)",
"type": "main",
"index": 0
}
]
]
},
"Get Image (Kie.ai)": {
"main": [
[
{
"node": "Slack Approval (Final)",
"type": "main",
"index": 0
}
]
]
},
"IG Create Container": {
"main": [
[
{
"node": "Wait (Upload)",
"type": "main",
"index": 0
}
]
]
},
"Theme Input (Slack)": {
"main": [
[
{
"node": "Set Theme",
"type": "main",
"index": 0
}
]
]
},
"JSON Parse (Content)": {
"main": [
[
{
"node": "Slack Approval (Draft)",
"type": "main",
"index": 0
}
]
]
},
"JSON Parse (Prompts)": {
"main": [
[
{
"node": "Split Slides",
"type": "main",
"index": 0
}
]
]
},
"Slack Approval (Draft)": {
"main": [
[
{
"node": "Approval Loop",
"type": "main",
"index": 0
}
]
]
},
"Slack Approval (Final)": {
"main": [
[
{
"node": "IG Create Container",
"type": "main",
"index": 0
}
]
]
},
"Image Generation (Kie.ai)": {
"main": [
[
{
"node": "Wait (Generation)",
"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.
facebookGraphApihttpHeaderAuthopenAiApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow allows you to complete the entire process of creating and publishing detailed Instagram Carousels—from research to posting—without ever leaving Slack. It leverages Nano Banana Pro, a state-of-the-art image generation model capable of rendering perfect text, to…
Source: https://n8n.io/workflows/11694/ — 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.
Automated Instagram Reels Generator (Creatomate). Uses slack, facebookGraphApi, lmChatOpenAi, chainLlm. Scheduled trigger; 18 nodes.
Automate your Instagram growth strategy by generating and posting viral Reels using AI and Creatomate. This workflow plans content topics based on trends, generates video assets, and handles the appro
This workflow is ideal for individuals, marketers, agencies, and brands who want to effortlessly automate the entire blogging and social media process—from idea generation to promotion. Its primary go
This workflow is built for creators, solopreneurs, SaaS founders, and agencies looking to automate their social media content process from idea to publication. It combines the power of OpenAI, Google
This workflow is designed for content creators, social media managers, digital marketers, and business owners who want to automate their content creation and distribution process across multiple platf