RSS to Instagram, branded posts via OpenAI
Your Instagram goes quiet for a week, then you scramble to post. Not because you ran out of ideas, but because turning “good links” into branded content is a grind. RSS Instagram automation fixes that gap.
This hits marketing managers first. But founders juggling sales and delivery feel it too, and so do agency owners trying to keep client feeds alive without adding headcount. The outcome is simple: consistent, on-brand posts that publish themselves.
This workflow takes new RSS items, uses OpenAI to write captions and generate image prompts, builds a branded visual, and publishes through Blotato. You’ll see how the automation works, what you need, and what to tweak so it sounds like you.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: RSS to Instagram, branded posts via OpenAI
flowchart LR
subgraph sg0["RSS Feed Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Success", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Error", pos: "b", h: 48 }
n3["<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/>Download Image"]
n4@{ icon: "mdi:location-exit", form: "rounded", label: "Error Stop", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n6["<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/>Create JsonCut Job"]
n7["<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/>Check JsonCut job Status"]
n8@{ icon: "mdi:play-circle", form: "rounded", label: "RSS Feed Trigger", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Generate content and Image P..", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Generate Background Image", pos: "b", h: 48 }
n11["<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/>Upload logo"]
n12["<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/>Download Logo"]
n13["<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/>Download Background"]
n14["<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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n15["<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/>Upload Background"]
n16@{ icon: "mdi:cog", form: "rounded", label: "Upload media", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Create Instagram Text", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Create Instagram post", pos: "b", h: 48 }
n0 --> n7
n14 --> n5
n2 --> n4
n2 --> n0
n5 --> n6
n1 --> n3
n1 --> n2
n11 --> n14
n16 --> n17
n12 --> n11
n3 --> n16
n8 --> n9
n15 --> n14
n6 --> n0
n13 --> n15
n17 --> n18
n7 --> n1
n10 --> n13
n10 --> n12
n9 --> n10
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 n8 trigger
class n9,n10,n17 ai
class n1,n2 decision
class n3,n6,n7,n11,n12,n13,n15 api
classDef customIcon fill:none,stroke:none
class n3,n6,n7,n11,n12,n13,n14,n15 customIcon
The Problem: RSS Content Dies in Drafts
Most teams already have a steady stream of content. Blog posts. Press mentions. Industry news. It’s sitting right there in RSS, but it never becomes an Instagram post because the last mile is annoying. You have to skim the article, rewrite the headline so it doesn’t sound like a robot, create a visual that matches your brand, then upload everything and write a caption. Do that a few times and it starts slipping. Then the feed looks inconsistent, which is a trust problem, not just a content problem.
It adds up fast. Here’s where it breaks down in real life.
- Each post takes long enough that “I’ll do it later” becomes “we didn’t post this week.”
- Branded visuals get skipped, so the feed turns into mismatched screenshots and rushed templates.
- Captions end up inconsistent because every person writes in a different voice.
- Manual posting means manual mistakes, like the wrong link, the wrong crop, or posting at the worst time.
The Solution: RSS-to-Instagram Branded Publishing
This n8n workflow turns an RSS feed into finished Instagram posts without you babysitting it. When a new item appears in your feed, OpenAI rewrites the headline and creates a social-friendly angle so it reads like a post, not a copied title. It also generates an image prompt that matches the topic and mood, which is then used to create a backdrop image. Next, the workflow pulls in your brand icon/logo, uploads the assets, and asks JsonCut to render a clean branded layout (background, headline text overlay, logo). Once the render job finishes, Blotato uploads the media asset and publishes the Instagram post with a caption generated by OpenAI.
The workflow starts with an RSS trigger watching your chosen source. In the middle, it generates text and imagery, then renders a branded graphic with JsonCut. Finally, Blotato publishes to Instagram (and can be extended to other channels) so your feed stays active without manual uploads.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your RSS feed produces 5 share-worthy items a week. Manually, a typical post might take about 20 minutes to rewrite the text, another 20 to build a branded image, plus 10 minutes to upload, caption, and double-check. That’s roughly 4 hours a week. With this workflow, setup is under 10 minutes once credentials are in place, then each new item triggers automatically while the system polls the render job every 3 seconds until the image is ready. You get the posts out without blocking someone’s afternoon.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- OpenAI for captions and image prompt generation
- JsonCut to render branded images automatically
- Blotato API Key (get it from www.blotato.com)
Skill level: Beginner. You’ll paste API keys, choose an RSS URL, and adjust a couple of text fields.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new RSS item appears. The RSS Intake Trigger monitors your feed and passes the headline and link into the workflow as soon as something new is detected.
Text and visual direction are generated. OpenAI drafts a rewritten headline and an image prompt that matches the topic, so you get something “Instagram-native” instead of a pasted article title.
Your branded image gets produced and rendered. The workflow creates a backdrop image, fetches your logo, uploads both, then sends the storage links into JsonCut to render the final design. It waits and checks status repeatedly, because rendering isn’t instant.
The post is published. Once the final image is retrieved, Blotato uploads the media asset, OpenAI composes the IG caption, and Blotato publishes the Instagram post.
You can easily modify the caption tone to match your brand voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the RSS Feed Trigger
Start the workflow by defining the RSS source that will drive every new image post.
- Add the RSS Intake Trigger node and set Feed URL to
https://feeds.bbci.co.uk/news/world/rss.xml. - In Poll Times, keep Mode set to
everyMinuteto check for updates frequently.
Step 2: Connect OpenAI for Headline, Prompt, and Caption Generation
These nodes generate the Instagram headline, image prompt, and caption text from RSS content.
- Open Draft Headline & Prompt and set Model to
gpt-5-miniwith JSON Output enabled. - Credential Required: Connect your
openAiApicredentials in Draft Headline & Prompt. - Open Create Backdrop Image and set Prompt to
{{ $json.message.content.image_prompt }}, with Resource set toimageand Size1024x1024. - Credential Required: Connect your
openAiApicredentials in Create Backdrop Image. - Open Compose IG Caption and keep the message template that references
{{ $('RSS Intake Trigger').item.json.title }}and{{ $('RSS Intake Trigger').item.json.content }}. - Credential Required: Connect your
openAiApicredentials in Compose IG Caption.
Create Backdrop Image outputs to both Fetch Backdrop File and Fetch Brand Icon in parallel.
Step 3: Upload Assets and Build the Render Job
These nodes upload the generated backdrop and brand icon, then submit a render request to the image compositor API.
- Open Fetch Backdrop File and keep URL set to
{{ $json.url }}to download the AI image output. - Open Fetch Brand Icon and keep URL set to
https://img.icons8.com/?size=100&id=tn7B1mGNMgGC&format=png&color=000000. - For Send Backdrop File, Send Logo File, Initiate Render Job, Verify Job Status, and Retrieve Rendered Image, ensure Authentication is
genericCredentialTypewith Generic Auth TypehttpHeaderAuth. - Credential Required: Connect your
httpHeaderAuthcredentials in Send Backdrop File, Send Logo File, Initiate Render Job, Verify Job Status, and Retrieve Rendered Image. - In Initiate Render Job, keep URL set to
https://api.jsoncut.com/api/v1/jobsand JSON Body set to the provided template that references{{ $json.storageUrl[0] }},{{ $json.storageUrl[1] }}, and{{ $('Draft Headline & Prompt').item.json.message.content.headline }}. - In Collect Storage Links, keep Fields to Aggregate set to aggregate
data.storageUrlso the render job has both file URLs.
Send Backdrop File and Send Logo File converge in Combine Uploads, then flow into Collect Storage Links.
Step 4: Configure Rendering Polling and Media Publishing
This sequence waits for the render job to complete, retrieves the image, then uploads it for posting.
- In Delay Interval, set Unit to
secondsand Amount to3for polling cadence. - Open Verify Job Status and set URL to
https://api.jsoncut.com/api/v1/jobs/{{ $json.data.jobId }}. - In Completion Check, set the string condition to compare
{{ $json.data.status }}equalsCOMPLETED. - In Retrieve Rendered Image, set URL to
https://api.jsoncut.com/api/v1/files/{{ $json.data.outputFileId }}/downloadand keep response format asfile. - Open Publish Media Asset and keep Resource set to
mediawith Use Binary Data enabled. - Credential Required: Connect your
blotatoApicredentials in Publish Media Asset.
Step 5: Configure Instagram Posting
Use the generated caption and uploaded media URL to publish the Instagram post.
- Open Publish IG Post and set Post Content Text to
{{ $json.message.content }}. - Set Post Content Media URLs to
{{ $('Publish Media Asset').item.json.data[0].url }}. - Set Account ID to your Instagram account reference (replace
[YOUR_ID]). - Credential Required: Connect your
blotatoApicredentials in Publish IG Post.
⚠️ Common Pitfall: If Account ID remains [YOUR_ID], the post will fail. Replace it with a valid account reference from Blotato.
Step 6: Add Error Handling
Handle failed or cancelled render jobs to prevent silent errors.
- In Failure Check, keep the string conditions comparing
{{ $json.data.status }}toFAILEDandCANCELLED. - Ensure the Failure Check failure path routes to Abort With Error.
- In Abort With Error, keep Error Message set to
Failed to generate image.
Keep Delay Interval connected from the success path of Failure Check so the job continues polling until completion.
Step 7: Test and Activate Your Workflow
Validate the end-to-end flow before turning it on in production.
- Click Execute Workflow and wait for a new item from RSS Intake Trigger.
- Confirm the AI output in Draft Headline & Prompt contains a valid JSON with
headlineandimage_prompt. - Verify that Retrieve Rendered Image outputs binary data and that Publish Media Asset returns a media URL.
- Confirm Publish IG Post returns a successful post response with the new caption and media.
- When testing is successful, toggle the workflow to Active for continuous execution.
Common Gotchas
- Blotato credentials can expire or need specific permissions. If things break, check your Blotato API key and connected channel permissions in your Blotato account 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.
- OpenAI prompts start generic unless you personalize them. Add your brand voice and “do/don’t” rules in the Compose IG Caption prompt or you’ll be editing outputs forever.
Frequently Asked Questions
Under 10 minutes once your credentials are ready.
No. You will connect accounts, paste API keys, and edit a couple of prompts.
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 OpenAI API usage plus any Blotato plan costs.
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.
Yes, and it’s one of the best reasons to use this workflow. You’ll adjust the layout rules in the “Initiate Render Job” step that sends the composition to JsonCut, plus the logo/backdrop inputs that get uploaded earlier. Common tweaks include moving the logo, changing font sizes for long headlines, adding a color overlay for readability, and switching from square to portrait formats. If you want a different publishing tool, you can also replace the Blotato publish steps with another integration.
Usually it’s an expired or incorrect API key in your Blotato credential. Update the key in n8n, then confirm your Instagram channel is still connected inside Blotato. If it fails only on busy days, you may be hitting rate limits or attempting to publish before the media asset upload finished. In that case, extend the wait or double-check that the “Publish Media Asset” step returns a valid asset ID before posting.
A lot. On n8n Cloud, your limit depends on your monthly executions, and self-hosting has no fixed execution cap (it’s mostly your server and API quotas). In practice, the main bottleneck is rendering and posting throughput, since the workflow waits on JsonCut job completion before publishing.
Often, yes, because this workflow has branching, polling/wait logic, and multi-step media handling that gets awkward (and pricey) in simpler automation tools. n8n is also easier to self-host, which matters when you’re processing lots of RSS items. Zapier or Make can still be fine for lightweight drafts or “send me a notification” type flows. For direct publishing plus branded image rendering, n8n tends to feel less constrained. If you want a second opinion for your exact setup, Talk to an automation expert.
Once this is running, your RSS feed stops being “nice to have” and starts powering a consistent Instagram presence. Honestly, it’s a relief to stop pushing posts over the finish line by hand.
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.