DEV Community

Building a Semi-Automated Content Repurposing Pipeline with n8n

Publishing the same core content across multiple platforms (blog, newsletter, social) manually is repetitive enough that it's a reasonable automation target. Fully automating the posting itself — especially to third-party platforms — is a different story, and one worth being honest about upfront: most platforms actively detect and penalize bulk-automated posting, and it can get accounts flagged or banned. This workflow automates the repetitive preparation work and leaves publishing as a deliberate, human-reviewed final step.

The workflow shape

[Trigger: New article published]
        ↓
[HTTP Request: Fetch article content]
        ↓
[Function Node: Extract title, summary, key points]
        ↓
[HTTP Request: Claude/GPT API — generate platform-specific variants]
        ↓
[Split into branches per platform]
        ↓
[Format for LinkedIn] [Format for Twitter/X] [Format for Newsletter]
        ↓
[Google Sheets / Notion: Write drafts to review queue]
        ↓
(Human reviews and manually publishes each)
Enter fullscreen mode Exit fullscreen mode

The key design decision: the last automated step writes to a review queue, not to a publish endpoint. That single change is what keeps this a genuine productivity tool instead of a spam-generation pipeline.

Trigger node

If your blog is a static site rebuilt on push (GitHub Actions, Netlify, etc.), a simple Webhook trigger fired from your deploy pipeline works cleanly:

{
  "path": "new-article-published",
  "httpMethod": "POST",
  "responseMode": "onReceived"
}
Enter fullscreen mode Exit fullscreen mode

Your deploy script POSTs the new article's URL and slug to this webhook once the build succeeds.

Fetching and extracting content

// Function node — strip HTML, extract key fields
const html = $input.item.json.html;
const title = html.match(/<h1>(.*?)<\/h1>/)?.[1] || '';
const firstParagraph = html.match(/<p>(.*?)<\/p>/)?.[1] || '';

return {
  json: {
    title: title,
    summary: firstParagraph,
    url: $input.item.json.url
  }
};
Enter fullscreen mode Exit fullscreen mode

For anything beyond trivial HTML structures, swap this for a proper HTML parser node rather than regex — regex against arbitrary HTML breaks the moment your template changes, and n8n has community nodes for this specifically.

Generating platform variants

This is where an LLM API call earns its place — condensing an 800-word article into a LinkedIn post, a shorter Twitter/X thread opener, and a newsletter blurb are three genuinely different rewriting tasks, not just truncation:

// HTTP Request node body, calling an LLM API
{
  "model": "claude-sonnet-4-6",
  "max_tokens": 500,
  "messages": [{
    "role": "user",
    "content": `Rewrite this article summary as a LinkedIn post (150-200 words, professional tone, ending with a question): ${summary}`
  }]
}
Enter fullscreen mode Exit fullscreen mode

Run this three times with different prompts for the three target formats, or use a single call asking for all three in structured JSON output.

Writing to a review queue instead of publishing

// Google Sheets node — append row
{
  "sheet": "Content Queue",
  "values": {
    "date": "{{$now}}",
    "article_url": "{{$json.url}}",
    "linkedin_draft": "{{$json.linkedin_variant}}",
    "twitter_draft": "{{$json.twitter_variant}}",
    "status": "pending_review"
  }
}
Enter fullscreen mode Exit fullscreen mode

This is the actual output of the automation — a spreadsheet or Notion database with drafts ready for a two-minute human review and manual publish, rather than a bot posting unsupervised.

Why the human step stays manual on purpose

Beyond the platform-detection risk, a human pass catches things automation reliably misses: a rewritten summary that's subtly inaccurate, a tone mismatch for a specific platform's culture, or a link that should point somewhere slightly different for that specific audience. The time saved by this pipeline isn't "zero human involvement" — it's "no longer manually re-reading and re-writing the same content five different ways," which is most of the actual repetitive labor anyway.


I use variations of this pipeline for client content workflows — more at capareach.com.

Top comments (0)