Slack + Instagram drafts, approved AI visuals ready
You already have content ideas. What breaks is everything after that: turning one concept into on-brand visuals, chasing approvals, then rebuilding the same post three times because “the vibe is off.”
Marketing managers feel it during campaign weeks. Solo founders feel it at 11pm. And if you run a small agency, you feel it every time a client asks for “one more version.” This Slack Instagram drafts automation keeps quality control in Slack while still getting drafts published consistently.
This workflow turns a simple narrative brief into images and videos, routes them for human approval, then publishes approved drafts to Instagram (plus other channels if you want). You’ll see what it replaces, what it delivers, and what you need to run it.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Slack + Instagram drafts, approved AI visuals ready
flowchart LR
subgraph sg0["Manual Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Start Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Start Trigger", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Story Director Brief", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "Primary Chat Model", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Secondary Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Prompt Engineer Brief", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Collection", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Item Cap", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch Through Scenes", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Image Render Request"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack Image Approval"]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Approval Gate Image", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Upload Image Media", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Scene Image", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Restore Image Prompt", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch Through Images", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Video Render Request"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack Video Approval"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Approval Gate Video", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Upload Video Media", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Scene Video", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Restore Video Prompt", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Order by Scene", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Compile Media Lists", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "Publish Instagram Draft", pos: "b", h: 48 }
n25@{ icon: "mdi:cog", form: "rounded", label: "Publish Facebook Draft", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Compile Slide URLs", pos: "b", h: 48 }
n27@{ icon: "mdi:cog", form: "rounded", label: "Publish TikTok Draft", pos: "b", h: 48 }
n28@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch For Slideshow", pos: "b", h: 48 }
n29["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Image File"]
n30@{ icon: "mdi:cog", form: "rounded", label: "Add Image Borders", pos: "b", h: 48 }
n31@{ icon: "mdi:cog", form: "rounded", label: "Crop Image Fit", pos: "b", h: 48 }
n32@{ icon: "mdi:cog", form: "rounded", label: "Upload Slide Images", pos: "b", h: 48 }
n22 --> n23
n22 --> n28
n7 --> n8
n29 --> n30
n6 --> n7
n23 --> n24
n23 --> n25
n26 --> n27
n11 --> n12
n11 --> n14
n14 --> n9
n18 --> n19
n18 --> n21
n31 --> n32
n12 --> n13
n19 --> n20
n32 --> n28
n8 --> n15
n8 --> n9
n13 --> n8
n20 --> n15
n16 --> n17
n15 --> n22
n15 --> n16
n28 --> n26
n28 --> n29
n10 --> n11
n1 --> n2
n2 --> n5
n9 --> n10
n21 --> n16
n3 -.-> n2
n4 -.-> n5
n5 --> n6
n30 --> n31
n17 --> n18
n0 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n1 trigger
class n2,n5 ai
class n3,n4 aiModel
class n11,n18 decision
class n9,n16,n29 api
class n1 disabled
class n7 disabled
classDef customIcon fill:none,stroke:none
class n9,n10,n16,n17,n29 customIcon
The Challenge: Scaling visuals without losing control
Posting consistently is hard enough. Doing it with fresh visuals, coherent style, and real approvals is where teams get stuck. One person writes a concept, another person tries to translate it into prompts, someone else generates images that don’t match the brand, then you’re back in Slack asking for revisions that come in as vague feedback. It’s not just time. It’s context switching, missed deadlines, and that subtle fear that you’ll publish something “almost right” because you’re tired of reworking it.
It adds up fast. Here’s where the process usually cracks.
- You lose hours each week rewriting prompts because the original brief wasn’t specific enough to keep characters and lighting consistent.
- Approvals drift across threads, DMs, and screenshots, so nobody knows which version is actually approved.
- Manual uploading to Instagram drafts (and then to other channels) becomes a repetitive checklist that steals time from creative decisions.
- When visuals are off, you regenerate assets one-by-one, which is slow and frankly demoralizing.
The Fix: AI-generated stories with Slack approvals and Instagram drafts
This n8n workflow builds a full visual content pipeline around one simple idea: AI can generate, but humans should approve. It starts with a narrative concept (a story, a product angle, a campaign theme) and runs it through two AI “roles.” First, a creative director model expands the idea into scenes, moods, and consistent character details. Then a prompt engineer model converts that narrative into reliable text-to-image and text-to-video prompts, so your style stays coherent across the whole set. Next, Replicate generates the actual assets (images and short videos). Every image and video lands in Slack for review, where you can approve or request regeneration. Once approved, the workflow uploads media and publishes drafts through Blotato to Instagram, Facebook, and TikTok formats.
The workflow kicks off on a schedule or manually. It loops through the scenes in batches, generates images first, then generates videos, and sorts everything by scene so the final post stays in order. Finally, it compiles media lists and pushes drafts to your publishing destinations, ready for a final caption tweak or scheduling.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you publish 3 visual posts a week and each one needs 6 scenes (images plus a few short videos). Manually, you might spend about 10 minutes per scene rewriting prompts and generating variations (roughly 1 hour), another 30 minutes herding approvals in Slack, and about 30 minutes uploading and setting up drafts. That’s about 2 hours per post. With this workflow, your “hands-on” work is closer to 10 minutes to submit or adjust the brief, then approvals happen inside Slack while n8n handles the generation and draft publishing in the background.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Slack for approvals and regeneration requests.
- Replicate to generate images and videos.
- OpenRouter API key (get it from your OpenRouter dashboard).
- Blotato to publish drafts to Instagram and more.
- Google Sheets to store briefs, scenes, or outputs.
Skill level: Intermediate. You’ll connect accounts, paste API keys, and adjust a few prompts and channel settings.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A manual or scheduled start fires the run. You can trigger it on demand (for a campaign push) or run it on a schedule so content keeps shipping even during busy weeks.
The idea becomes a real narrative. OpenRouter-backed chat models generate a “director” brief with scenes and consistent details, then a second pass turns those scenes into tight prompts that are easier to reproduce.
Assets are generated and reviewed in Slack. Replicate produces images first, then videos. Each one is sent to Slack for approval. If it’s rejected, the workflow restores the prompt and regenerates until you approve.
Approved media is uploaded and turned into drafts. Blotato receives the final files and creates Instagram and Facebook drafts for videos, plus TikTok-ready slideshow drafts for image sequences (including a simple border/crop pass for consistency).
You can easily modify the scene count and the publishing destinations based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow can be started manually or on a schedule; begin by configuring the triggers that kick off the story generation.
- Add the Manual Start Trigger node as your primary trigger.
- Optionally enable the Scheduled Start Trigger node (it is disabled in the workflow). Set the Trigger at Hour to
10if you want the schedule shown in the workflow. - Connect both Manual Start Trigger and Scheduled Start Trigger to Story Director Brief.
Step 2: Set Up the AI Story Generation Chain
These nodes build the narrative scenes and convert them into structured AI prompts.
- Configure Story Director Brief with the full JSON prompt in Text (already defined in the workflow). Keep the date expression
{{$now.format('dd LLLL')}}intact. - Attach Primary Chat Model as the language model for Story Director Brief. Credential Required: Connect your openRouterApi credentials in Primary Chat Model.
- Configure Prompt Engineer Brief with the full JSON prompt in Text and keep the input expression
{{ $json.data.toJsonString() }}intact. - Attach Secondary Chat Model as the language model for Prompt Engineer Brief. Credential Required: Connect your openRouterApi credentials in Secondary Chat Model.
Step 3: Split and Batch Scene Items
This section breaks the AI output into individual scenes and controls batch processing for images and videos.
- In Split Collection, set Field to Split Out to
dataso each scene becomes an item. - In Item Cap, set Max Items to
3if you want to limit output during testing (this node is disabled by default). - Use Batch Through Scenes and Batch Through Images with default settings to handle batching for image and video loops.
Step 4: Configure Image Rendering and Approval
These nodes render images via Replicate, require Slack approval, and upload approved media.
- In Image Render Request, set URL to
https://api.replicate.com/v1/models/qwen/qwen-image/predictionsand keep the JSON body with the prompt expression{{ JSON.stringify($json.text_to_image_prompt) }}. Credential Required: Connect your httpHeaderAuth credentials. - Configure Slack Image Approval with Operation set to
sendAndWaitand Message set to=Approval required for an image: {{ $json.output[0] }}. Credential Required: Connect your slackApi credentials. - In Approval Gate Image, keep the boolean check on
{{ $json.data.approved }}to route approvals. - In Upload Image Media, set Media URL to
{{ $('Image Render Request').item.json.output.first() }}. Credential Required: Connect your blotatoApi credentials. - In Assign Scene Image, keep the assignments: scene_number =
{{ $('Batch Through Scenes').item.json.scene_number }}, image ={{ $json.url }}, text_to_video_prompt ={{ $('Batch Through Scenes').item.json.text_to_video_prompt }}. - Keep Restore Image Prompt connected to Image Render Request for regenerate loops with
{{ $('Image Render Request').item.json.input.prompt}}.
Step 5: Configure Video Rendering and Approval
This section renders the approved image into short videos and repeats the approval loop.
- In Video Render Request, set URL to
https://api.replicate.com/v1/models/bytedance/seedance-1-lite/predictionsand keep the JSON body with{{ JSON.stringify($json.text_to_video_prompt) }}and{{ $json.image }}. Credential Required: Connect your httpHeaderAuth credentials. - Configure Slack Video Approval with Operation set to
sendAndWaitand Message set to=Approval required for a video: {{ $json.output }}. Credential Required: Connect your slackApi credentials. - In Approval Gate Video, keep the boolean check on
{{ $json.data.approved }}to route approvals. - In Upload Video Media, set Media URL to
{{ $('Video Render Request').item.json.output }}. Credential Required: Connect your blotatoApi credentials. - In Assign Scene Video, keep the assignments: scene_number =
{{ $('Batch Through Images').item.json.scene_number }}, video ={{ $json.url }}, image ={{ $('Batch Through Images').item.json.image }}. - Keep Restore Video Prompt connected to Video Render Request for regenerate loops with
{{ $('Video Render Request').item.json.input.prompt}}and{{ $('Video Render Request').item.json.input.image }}.
Step 6: Sort Scenes and Publish Drafts
After batching completes, the workflow sorts media, compiles URLs, and publishes drafts to social platforms.
- In Order by Scene, ensure the sort field is
scene_number. - In Compile Media Lists, keep the summaries for video and image with aggregation
concatenateand separator,. - Order by Scene outputs to both Compile Media Lists and Batch For Slideshow in parallel.
- Compile Media Lists outputs to both Publish Instagram Draft and Publish Facebook Draft in parallel. Credential Required: Connect your blotatoApi credentials for both nodes.
- In Publish Instagram Draft and Publish Facebook Draft, keep Post Content Text set to
{{ $('Story Director Brief').item.json.data[0].life_reassuring_quote }}and Post Content Media URLs set to{{ $json.concatenated_video }}. - In Compile Slide URLs, keep the url aggregation set to
concatenatewith separator,, then connect to Publish TikTok Draft. Credential Required: Connect your blotatoApi credentials for Publish TikTok Draft. - In Publish TikTok Draft, set Post Content Text to
skeletal lifeand Post Content Media URLs to{{ $json.concatenated_url }}.
Step 7: Generate Slideshow Images
This path fetches images, edits them for slides, and uploads them for TikTok slideshow drafting.
- In Batch For Slideshow, keep default batch settings to iterate through images.
- In Fetch Image File, set URL to
{{ $json.image }}to download the image for editing. - In Add Image Borders, set Border Width to
0and Border Height to230. - In Crop Image Fit, set Width to
1080, Height to1920, and Operation tocrop. - In Upload Slide Images, set Resource to
mediaand enable Use Binary Data. Credential Required: Connect your blotatoApi credentials.
Step 8: Test and Activate Your Workflow
Run an end-to-end test to verify the approvals, uploads, and draft publishing.
- Click Execute Workflow from Manual Start Trigger to test the full pipeline.
- Approve the image in Slack Image Approval and confirm that Upload Image Media returns a media URL.
- Approve the video in Slack Video Approval and confirm that Upload Video Media returns a media URL.
- Verify that drafts are created in Publish Instagram Draft, Publish Facebook Draft, and Publish TikTok Draft.
- When satisfied, enable Scheduled Start Trigger to run daily and toggle the workflow to Active.
Watch Out For
- OpenRouter credentials can expire or your model access may change. If things break, check your OpenRouter key and model availability in the OpenRouter dashboard first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Blotato publishing can fail if the connected Instagram account permissions change. When drafts stop appearing, re-check the social account connection inside Blotato before you touch anything in n8n.
Common Questions
About an hour if your accounts and API keys are ready.
Yes. No coding required, but someone should be comfortable pasting API keys and testing a few runs in n8n.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenRouter and Replicate usage, which can be a few dollars per week depending on how many assets you generate.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can swap the “director” and “prompt engineer” models in the OpenRouter chat model nodes without changing the rest of the flow. Common tweaks include adjusting the scene count in the split/limit nodes, changing the Slack approval channel, and publishing only to Instagram by disabling the Facebook or TikTok draft nodes in Blotato.
Usually it’s a revoked Slack token or missing channel permissions. Reconnect Slack in n8n, then confirm the bot is invited to the approval channel you selected. If approvals post but buttons or actions don’t work, double-check that interactive message permissions are still enabled for your Slack app.
On a small cloud plan, most teams comfortably run dozens of posts a month, because the heavy lift is waiting on AI generation and human approvals. If you self-host, you’re mainly limited by your server and the rate limits of OpenRouter, Replicate, and Slack. Practically, the workflow is happiest when you batch scenes (it already does) and keep a reasonable cap so you don’t flood your approval channel.
Often, yes. This workflow uses loops, branching approvals, and “regenerate until approved” logic, and those are awkward (or expensive) in many no-code tools. n8n also gives you a self-hosting path, which is a big deal when you scale executions. Zapier or Make can still be fine for simple “send to Slack, then post” drafts. But if you want consistent prompts, batching, and a real approval gate, n8n fits the job better. Talk to an automation expert if you want help choosing.
This is what content scale looks like when you keep the human “taste” part, and automate the rest. Set it up once, then let Slack approvals drive clean Instagram drafts week after week.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.