|

n8n Content Repurposing: Automate Every Post Across Every Platform

n8n content repurposing is the fastest way to multiply your content output without multiplying your workload. This guide walks you through the exact pipeline I built for alexanderharte.com — one blog post published, and within minutes Facebook and Instagram have fresh, platform-native posts live, complete with the featured image.

Most solopreneurs publish a blog post, share it once on social media with a copy-pasted excerpt, and move on. That’s leaving 80% of the content’s value on the table. The post you spent hours writing deserves more than one tweet and a LinkedIn share you forgot to schedule.

This is System 02 from The Automation Playbook — the zero-effort content repurposing machine. Here’s what it does: the moment a new post goes live on your site, an RSS trigger fires, Claude AI rewrites the content into platform-native copy, your WordPress featured image is pulled automatically, and Make.com posts everything to Facebook and Instagram simultaneously. You don’t touch it.

Build time: 45–60 minutes. Then every post you ever publish gets automatically distributed.


What You’ll Build

A fully automated content repurposing pipeline across two platforms:

  • New blog post published → RSS trigger fires automatically
  • Post content and featured image extracted from WordPress
  • Claude AI generates a LinkedIn-style Facebook post (150–200 words) and a punchy Instagram caption (3–5 lines)
  • Featured image fetched directly from the WordPress REST API — no manual uploads
  • Make.com posts to your Facebook Page and Instagram Business account simultaneously

No manual copy-pasting. No scheduling tools. No remembering to post. It runs every time, for every post, indefinitely.


Why n8n Content Repurposing Works Better With This Stack

Each tool in this stack is doing what it’s actually good at. n8n handles the data orchestration — watching the RSS feed, extracting content, hitting the WordPress API, and routing the payload. Claude handles the writing — turning a 2,000-word blog post into platform-native copy that sounds like you, not a bot. Make.com handles the social posting — its Facebook Pages module manages both Facebook and Instagram through a single Meta connection and handles all the API complexity behind the scenes.

Trying to do this in a single tool is where most people get stuck. n8n can post to social, but its Meta integrations are clunkier than Make’s. Make can call Claude, but its data manipulation is weaker than n8n’s. Split the work across the right tools and n8n content repurposing becomes straightforward rather than a frustrating tangle of workarounds.

One important note on Instagram: the Instagram Graph API requires a publicly accessible image URL — it fetches the image server-side rather than accepting a file upload. This matters for how we wire the image step, and it’s covered in detail below.


System Overview

Here’s the complete pipeline before we build it step by step:

StepToolWhat Happens
1. Triggern8n RSS Feedn8n watches your blog’s RSS feed and fires the moment a new post is detected.
2. Extractn8n Code nodeTitle, content, link, and post slug are extracted and cleaned from the RSS item.
3. Image fetchn8n + WordPress REST APIThe post slug is used to query the WP API, which returns the featured image URL directly.
4. AI rewriteClaude API (via n8n)Claude generates a Facebook post (150–200 words) and a short Instagram caption (3–5 lines) in your voice.
5. Parse + sendn8n Code nodeClaude’s response is parsed and assembled into a clean JSON payload sent to Make.com.
6. Route + postMake.comMake routes to Facebook (photo post) and Instagram (photo post) simultaneously.

n8n content Repurposing
Full n8n workflow canvas, all 7 nodes connected The complete n8n pipeline. RSS trigger fires on every new post, content is extracted, the WordPress API fetches the featured image, Claude writes the copy, and Make.com handles posting — all seven nodes, fully automated.

Before You Start: What You Need

  • A self-hosted or cloud n8n instance with your Anthropic API credentials configured
  • A WordPress site with the REST API accessible (default on all WordPress installs)
  • A Make.com account (free plan works to start)
  • A Facebook Page connected to a Facebook Business account
  • An Instagram Business or Creator account linked to that Facebook Page
  • An Anthropic API key for Claude
  • 45–60 minutes

The Instagram requirement is the one that trips people up most often. Instagram’s API is only available to Business and Creator accounts — personal accounts cannot post programmatically. If yours is still personal, switch it in Instagram Settings → Account → Switch to Professional Account before you start.


Step-by-Step Build Guide

Step 1: Build the n8n Workflow

This is the engine of the n8n content repurposing pipeline. Create a new workflow in n8n. You’ll build seven nodes in a straight chain.

Node 1 — RSS Feed Trigger

Add an RSS Feed Read Trigger node. Set the Feed URL to your blog’s RSS feed — for WordPress this is always https://yourdomain.com/feed. Set the poll interval to every minute while testing, then change it to every 15 minutes once you go live. The trigger fires whenever n8n detects a new item in the feed that it hasn’t seen before.

Node 2 — Extract Blog Content (Code node)

Add a Code node. This strips HTML from the post content, extracts the first 4,000 characters for Claude, and pulls the slug from the post URL. The slug is what you’ll use to query the WordPress API in the next step.

Paste this code into the node:

const item = $input.first().json;

const rawContent = item.content || item['content:encoded'] || item.summary || '';
const strippedContent = rawContent.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
const intro = strippedContent.substring(0, 600);

// Extract slug from post URL
const slug = (item.link || '').replace(/\/$/, '').split('/').pop();

return [{
  json: {
    title: item.title || '',
    link: item.link || '',
    slug: slug,
    pubDate: item.pubDate || item.isoDate || '',
    fullContent: strippedContent.substring(0, 4000),
    intro: intro,
    author: item.creator || item.author || 'Alex Harte'
  }
}];

Node 3 — WP API Image Fetch (HTTP Request node)

Add an HTTP Request node. Set the method to GET and the URL to:

https://yourdomain.com/wp-json/wp/v2/posts?slug={{ $json.slug }}&_embed=wp:featuredmedia

Replace yourdomain.com with your actual domain. The _embed parameter tells WordPress to include the full featured image data in the response. n8n automatically returns the first item in the API’s array response, so the next node can access your post’s fields directly.

Why not parse the image from RSS? WordPress doesn’t include featured images in RSS feeds by default. Querying the REST API by slug is more reliable, always returns the correct image, and doesn’t require any changes to your WordPress theme or plugins.

WP API Image Fetch HTTP Request node configuration The WordPress REST API call. The post slug from the previous node is passed in dynamically — this is what pulls the featured image reliably every time, without any changes to your WordPress theme.

Node 4 — Claude AI Rewrite (HTTP Request node)

Add another HTTP Request node. Configure it to call the Anthropic API:

  • Method: POST
  • URL: https://api.anthropic.com/v1/messages
  • Authentication: Predefined credential type → Anthropic API
  • Headers: anthropic-version: 2023-06-01 and content-type: application/json
  • Body (raw JSON):
{
  "model": "claude-sonnet-4-20250514",
  "max_tokens": 1500,
  "messages": [
    {
      "role": "user",
      "content": "You are Alex Harte, a solopreneur AI automation expert. Based on this blog post, write two pieces of content in Alex's voice — direct, practical, no fluff.\n\nBlog Title: {{ $('Extract Blog Content').first().json.title }}\nBlog Content: {{ $('Extract Blog Content').first().json.fullContent }}\nPost URL: {{ $('Extract Blog Content').first().json.link }}\n\nReturn ONLY valid JSON (no markdown, no backticks) in exactly this structure:\n{\n  \"linkedin\": \"[Facebook post here, 150-200 words, insight-led, end with a CTA and the URL]\",\n  \"instagram_caption\": \"[Instagram caption here, 3-5 punchy lines max, no URL]\"\n}"
    }
  ]
}

The prompt instructs Claude to return valid JSON only — no markdown fences, no preamble. This makes the next node’s parsing reliable. Adjust the voice instructions to match your own style if needed.

Node 5 — Parse Claude Response (Code node)

Add a Code node to parse Claude’s JSON response and assemble the final payload:

const claudeBody = $input.first().json;
const textContent = claudeBody.content[0].text;

let parsed;
try {
  parsed = JSON.parse(textContent);
} catch(e) {
  const match = textContent.match(/```json?\n?([\s\S]*?)```/);
  if (match) {
    parsed = JSON.parse(match[1]);
  } else {
    throw new Error('Could not parse Claude response: ' + textContent.substring(0, 200));
  }
}

// Get image URL from WP API node
let imageUrl = '';
try {
  const wpData = $('WP API Image Fetch').first().json;
  if (wpData.jetpack_featured_media_url) {
    imageUrl = wpData.jetpack_featured_media_url;
  } else if (wpData._embedded?.['wp:featuredmedia']?.[0]) {
    imageUrl = wpData._embedded['wp:featuredmedia'][0].source_url || '';
  }
} catch(e) {
  imageUrl = '';
}

return [{
  json: {
    linkedin: parsed.linkedin,
    instagram_caption: parsed.instagram_caption,
    title: $('Extract Blog Content').first().json.title,
    link: $('Extract Blog Content').first().json.link,
    imageUrl: imageUrl,
    caption: parsed.linkedin
  }
}];

The image URL logic checks jetpack_featured_media_url first — this is the most reliable field on Jetpack-enabled WordPress installs. It falls back to the embedded media object if Jetpack isn’t active on your site.

Node 6 — Send to Make.com (HTTP Request node)

Add an HTTP Request node. Set the method to POST, URL to your Make.com webhook URL (you’ll get this in Part 2), and configure the body as raw JSON:

={{ JSON.stringify({
  facebook_post: $json.linkedin,
  instagram_caption: $json.instagram_caption,
  title: $json.title,
  link: $json.link,
  image_url: $json.imageUrl,
  caption: $json.linkedin
}) }}

Node 7 — Pipeline Complete (No Operation node)

Add a No Operation node as the final step. It does nothing — it’s just a clean termination point that makes the workflow easier to read and extend later.

Connect all seven nodes in sequence and save the workflow. Leave it inactive for now — you’ll activate it after Make.com is configured.

Parse Claude Response code node open The Parse Claude Response node assembles the final payload — Claude’s copy, the featured image URL, and post metadata combined into one clean object ready for Make.com.

Step 2: Build the Make.com Scenario

In Make.com, create a new scenario. You’ll build five modules. This is the delivery layer of the n8n content repurposing system — n8n assembles the data, Make handles the actual posting.

Module 1 — Webhooks → Custom Webhook

Add a Webhooks → Custom Webhook module as your trigger. Make will generate a unique webhook URL — copy it and paste it into the URL field of your n8n Send to Make.com node. Click Re-determine data structure inside the webhook module — this puts Make into listening mode so it can learn the incoming payload structure.

Go back to n8n and run the workflow manually once using a real blog post URL. Make will receive the payload and automatically detect all five fields: facebook_post, instagram_caption, title, link, and image_url. These will now be available as variables in all subsequent modules.

Important: Make sure you use a Custom Webhook, not a Custom Mailhook. The mailhook variant expects email-formatted input, not JSON from n8n, and will fail to parse your payload.

Module 2 — Router (first split)

Add a Router module. This splits the flow into two parallel paths: one for Facebook, one for Instagram. Set both routes to process all data — no filter conditions needed here. Every incoming webhook hit should trigger both platforms.

Module 3 — Instagram for Business → Create a Photo Post

On the Instagram route, add an Instagram for Business → Create a Photo Post module. Configure it:

  • Instagram Business Account: Select your connected account
  • Image URL: {{1.image_url}}
  • Caption: {{1.instagram_caption}}

Instagram’s API requires a publicly accessible image URL — it fetches the image server-side. Do not use a file upload here. The WordPress featured image URL from your payload is exactly what Instagram expects, and no additional HTTP fetch module is needed. This is a requirement of the Instagram Content Publishing API — container creation always uses a URL, not a binary upload.

Module 4 — Router (second split, Facebook only)

On the Facebook route from Module 2, add a second Router module. This handles two Facebook scenarios:

  • Route 1 — Facebook with photo: Filter condition: image_url is not empty. This route fires when a featured image is available.
  • Route 2 — Facebook text only: Filter condition: image_url is empty. Fallback for posts without a featured image.

Module 5a — Facebook Pages → Create a Post with Photos

On the photo route, add a Facebook Pages → Create a Post with Photos module:

  • Page: Select your Facebook Page
  • Photos → Item 1 → Image input type: Use a photo URL
  • Photos → Item 1 → URL: {{1.image_url}}
  • Post caption: {{1.caption}} followed by two line breaks and {{1.link}}

Module 5b — Facebook Pages → Create a Post (text only)

On the text-only route, add a Facebook Pages → Create a Post module:

  • Page: Select your Facebook Page
  • Message: {{1.caption}} followed by two line breaks and {{1.link}}
Full Make.com scenario canvas The Make.com scenario. One webhook receives the payload from n8n, a router splits the flow, and Facebook and Instagram are posted simultaneously — with the featured image on both.

Step 3: Connect and Test

With both sides built, here’s the exact test sequence to run before you go live:

  1. In Make.com, click Run once to put the scenario in listening mode
  2. In n8n, open the workflow and click Test workflow to trigger a manual run
  3. Watch the n8n execution panel — each node should turn green in sequence
  4. Switch back to Make — you should see the scenario execution complete with green checkmarks on all modules
  5. Check your Facebook Page and Instagram profile — both posts should be live within 30–60 seconds

If the execution succeeds in n8n but Make shows an error, check the error message in Make’s execution history. The most common issue is the image URL field not mapping correctly — open the Facebook with Photos module and verify the URL field is set via the variable picker ({{1.image_url}}), not typed manually.

n8n execution panel all nodes green, Parse Claude Response selected showing imageUrl populated A successful end-to-end test run. All nodes green, image URL populated from the WordPress API, payload confirmed sent to Make.com.

Once the test posts correctly, activate the n8n workflow using the toggle in the top right. From this point on, every new post you publish on your site will automatically trigger the full pipeline.


Troubleshooting: Common Problems and Fixes

image_url is empty in the payload

The WordPress REST API is returning the post without featured image data. Two most common causes:

  • No featured image set on the post. Check the post in WordPress admin — the Featured Image panel is in the right sidebar of the post editor. Having an image in the post content is not the same as setting a Featured Image.
  • Slug extraction failing. Open the Extract Blog Content node and check the slug field in the output. If it’s empty or wrong, the WP API call returns no results. The slug is everything after the last / in your post URL.

Make.com webhook shows BundleValidationError — Missing value of required parameter ‘url’

The image URL field in your Facebook with Photos module isn’t mapped. Open the module, expand Photos → Item 1, and use the variable picker to select image_url from the webhook bundle. Do not type the reference manually — let Make build it from the picker to ensure the bundle number is correct.

Instagram posts but Facebook doesn’t (or vice versa)

Check your Router filter conditions. The Facebook photo route requires image_url to be not empty — if it is empty, the flow falls through to the text-only route. Confirm your featured image is set on the WordPress post and the WP API is returning it correctly.

Claude returns an error or the Parse node fails

Open the Claude AI Rewrite node output in n8n and check what came back. If Claude returned markdown fences around the JSON (“`json), the fallback parser in the Code node handles this automatically. If Claude returned something that isn’t JSON at all, check your prompt — the instruction to return only valid JSON with no preamble needs to be clear and prominent in the prompt body.

The RSS trigger fires on old posts after activation

This is normal on first activation. n8n’s RSS trigger marks every item it processes. Run the workflow once manually to process the current feed state, then activate — it will only fire on genuinely new posts from that point on. Alternatively, set a pubDate filter in the Extract Blog Content node to skip posts older than 24 hours.


Taking Your n8n Content Repurposing Further

Once the core pipeline is running and you’ve seen it post correctly a few times, here are the highest-value upgrades:

  • Add Twitter/X posting. Claude is already generating a Twitter thread in the background — the prompt can be extended to include a twitter_thread field, and Make can route that to a Twitter/X module in the same scenario.
  • Add LinkedIn as a separate channel. The linkedin field Claude generates is already written for LinkedIn’s format. A LinkedIn module in Make takes 5 minutes to add.
  • Add ElevenLabs for audiograms. The intro paragraph extracted in the Code node can be passed to ElevenLabs’ API to generate a voiceover clip — short-form audio content for Instagram Reels or YouTube Shorts from the same pipeline.
  • Customise the Claude prompt per platform. The current prompt generates LinkedIn-style copy for Facebook and short copy for Instagram. You can extend it to generate truly platform-native content for each channel — different hooks, different structures, different CTAs.
  • Add a Slack notification. A No Operation node at the end of the n8n chain can be replaced with a Slack node that pings you when a post goes live — useful for monitoring in the early days.

What This Actually Costs You

ToolCostNotes
n8n (self-hosted)~$5–10/month (AWS Lightsail)Cloud n8n starts at $20/month if you don’t want to self-host.
Claude API~$0.01–0.03 per postClaude Sonnet pricing. At one post per day, this is under $1/month.
Make.comFree tier (1,000 ops/month)One blog post uses approximately 5 operations. Free tier covers 200 posts/month.
Your time45–60 min setupThen it runs indefinitely.

The ongoing cost of running this system for a solopreneur publishing two to four posts per week is effectively zero beyond your existing n8n infrastructure. The Claude API cost at that volume is pennies per month. That’s the trade-off — one hour of setup in exchange for automated social distribution on every post you ever publish.


Ready to Build It?

If you haven’t built System 01 yet — the always-on lead capture and nurture system — start there first. It’s the foundation the rest of the Playbook builds on.

If you’re ready to go, open n8n and start with Node 1. The whole thing comes together faster than you’d expect once the pieces are in place.

System 03 is next: the AI-powered content pipeline that takes a topic idea in a spreadsheet and returns a fully written, SEO-optimised blog post ready to publish — with almost zero manual effort.


Affiliate disclosure: The Make.com links in this post are affiliate links. If you sign up using my link, I earn a small commission at no extra cost to you. It’s one of the tools this system is built on — I only recommend what I actually use.


Alex Harte | alexanderharte.com

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *