Free workflow: AI Content Repurposing — 1 blog post → 4 platforms (Twitter, LinkedIn, Instagram, Facebook)

Hey everyone,

Built this workflow at Automatia BCN and wanted to share a free version with

the community.

**What it does:**

You send a blog post or article via webhook, and it automatically generates

optimized content for 4 platforms:

  • **Twitter/X thread** (5-7 tweets, numbered format)

  • **LinkedIn post** (professional tone, engagement hooks, hashtags)

  • **Instagram caption** (emoji strategy, 20+ hashtags, save-worthy CTA)

  • **Facebook post** (conversational, no external links for better reach)

Each output follows that platform’s specific best practices — it’s not just

the same text reformatted.

**How it works:**

1. Webhook receives your content (POST request)

2. AI analyzes key points, tone, and audience

3. Generates 4 platform-specific outputs in parallel

4. Saves everything to Google Sheets

**Requirements:**

  • OpenAI API key (gpt-4o-mini, costs ~$0.01 per run)

  • Google Sheets (for output storage)

**How to use:**

1. Import the JSON below into n8n

2. Connect your OpenAI and Google Sheets credentials

3. Set the `FLOWSCRIBE_SHEET_ID` environment variable

4. Send a POST request with your content

Example request:

```json

{

"title": "Why Remote Work Is the Future",

"content": "Your article text here (min 50 characters)...",

"brand_voice": "professional yet approachable"

}

The workflow has Sticky Notes inside explaining each section.

This is a Lite version — we also built a full version that generates for 8

platforms (adding TikTok scripts, newsletters, Pinterest, and SEO meta) with

A/B testing and posting schedules. Available at

FlowScribe — AI Content Repurposing Engine (1 Content → 8 Platforms) if you want the complete

package, but this Lite version is fully functional on its own.

Download the workflow JSON:

Get it free (along with 2 more workflows) at:

AutoFlow Free Starter Pack — 3 AI Automation Workflows for n8n

Or import this JSON directly:

{“name”:“FlowScribe Lite — Quick 4-Platform Repurpose”,“nodes”:[{“parameters”:

{“httpMethod”:“POST”,“path”:“flowscribe-lite”,“responseMode”:“responseNode”,"o

ptions":{}},“id”:“trigger-webhook”,“name”:"Receive

Content",“type”:“n8n-nodes-base.webhook”,“typeVersion”:2,“position”:[200,400],

“webhookId”:“flowscribe-lite-input”},{“parameters”:{“jsCode”:"const body =

$input.first().json.body || $input.first().json;\nconst content = body.content

|| body.text || ‘’;\nconst title = body.title || ‘Untitled’;\nconst

brandVoice = body.brand_voice || ‘professional yet approachable’;\n\nif

(!content || content.trim().length < 50) {\n throw new Error('Content must be

at least 50 characters.');\n}\n\nreturn [{\n json: { content, title,

brandVoice, requestId: require(‘crypto’).randomUUID(), processedAt: new

Date().toISOString() }\n}];"},“id”:“validate-input”,“name”:"Validate

Input",“type”:“n8n-nodes-base.code”,“typeVersion”:2,“position”:[400,400]},{"pa

rameters":{“model”:“gpt-4o-mini”,“messages”:{“values”:[{“role”:“system”,"conte

nt":"Analyze the content and extract: 5 key points, core message in one

sentence, 10 hashtags, 5 SEO keywords. Respond in JSON: { keyPoints,

coreMessage, hashtags, seoKeywords }“},{“role”:“user”,“content”:”=Title:

{{$json.title}}\nBrand Voice: {{$json.brandVoice}}\n\nContent:\n{{$json.conten

t}}"}]},“options”:{“temperature”:0.3,“maxTokens”:1000,“responseFormat”:"json_o

bject"}},“id”:“ai-analysis”,“name”:“AI: Quick Analysis”,“type”:"n8n-nodes-base

.openAi",“typeVersion”:1.8,“position”:[600,400],“retryOnFail”:true,“maxTries”:

3,“waitBetweenTries”:2000},{“parameters”:{“jsCode”:"let analysis;\ntry {\n

analysis = JSON.parse($input.first().json.message?.content || ‘{}’);\n} catch

(e) {\n throw new Error('Failed to parse AI analysis: ’ +

e.message);\n}\nconst original = $(‘Validate Input’).first().json;\nreturn [{

json: { …original, analysis } }];"},“id”:“merge-data”,“name”:"Merge

Data",“type”:“n8n-nodes-base.code”,“typeVersion”:2,“position”:[800,400]},{"par

ameters":{“model”:“gpt-4o-mini”,“messages”:{“values”:[{“role”:“system”,"conten

t":"Create a Twitter/X thread (5-7 tweets, each under 280 chars). First tweet:

powerful hook. Last: CTA + hashtags. Use numbered format 1/, 2/. JSON: {

\“thread\”: [\“tweet1\”, …] }“},{“role”:“user”,“content”:”=Title:

{{$json.title}}\nKey Points:

{{JSON.stringify($json.analysis.keyPoints)}}\nCore Message:

{{$json.analysis.coreMessage}}\nBrand Voice:

{{$json.brandVoice}}"}]},“options”:{“temperature”:0.7,“maxTokens”:1200,"respon

seFormat":“json_object”}},“id”:“gen-twitter”,“name”:"Generate: Twitter

Thread",“type”:“n8n-nodes-base.openAi”,“typeVersion”:1.8,“position”:[1040,200]

,“retryOnFail”:true,“maxTries”:3,“waitBetweenTries”:2000},{“parameters”:{"mode

l":“gpt-4o-mini”,“messages”:{“values”:[{“role”:“system”,“content”:"Create a

LinkedIn post: bold first line, short paragraphs, personal insight, end with

question, 3-5 hashtags. 1300-1800 chars. JSON: { \“post\”: \“…\”

}“},{“role”:“user”,“content”:”=Title: {{$json.title}}\nKey Points:

{{JSON.stringify($json.analysis.keyPoints)}}\nCore Message:

{{$json.analysis.coreMessage}}\nBrand Voice:

{{$json.brandVoice}}"}]},“options”:{“temperature”:0.7,“maxTokens”:1000,"respon

seFormat":“json_object”}},“id”:“gen-linkedin”,“name”:"Generate: LinkedIn

Post",“type”:“n8n-nodes-base.openAi”,“typeVersion”:1.8,“position”:[1040,400],"

retryOnFail":true,“maxTries”:3,“waitBetweenTries”:2000},{“parameters”:{“model”

:“gpt-4o-mini”,“messages”:{“values”:[{“role”:“system”,“content”:"Create an

Instagram caption: hook line, micro-story, emojis, CTA, 20-30 hashtags in

separate block. JSON: { \“caption\”: \“…\”, \“hashtags\”: […]

}“},{“role”:“user”,“content”:”=Title: {{$json.title}}\nKey Points:

{{JSON.stringify($json.analysis.keyPoints)}}\nBrand Voice:

{{$json.brandVoice}}"}]},“options”:{“temperature”:0.75,“maxTokens”:1200,"respo

nseFormat":“json_object”}},“id”:“gen-instagram”,“name”:"Generate: Instagram

Caption",“type”:“n8n-nodes-base.openAi”,“typeVersion”:1.8,“position”:[1040,600

],“retryOnFail”:true,“maxTries”:3,“waitBetweenTries”:2000},{“parameters”:{"mod

el":“gpt-4o-mini”,“messages”:{“values”:[{“role”:“system”,“content”:"Create a

Facebook post: relatable opening, story format, 100-250 words, conversation

question at end, no external links, friendly tone. JSON: { \“post\”: \“…\”

}“},{“role”:“user”,“content”:”=Title: {{$json.title}}\nKey Points:

{{JSON.stringify($json.analysis.keyPoints)}}\nBrand Voice:

{{$json.brandVoice}}"}]},“options”:{“temperature”:0.7,“maxTokens”:800,"respons

eFormat":“json_object”}},“id”:“gen-facebook”,“name”:"Generate: Facebook

Post",“type”:“n8n-nodes-base.openAi”,“typeVersion”:1.8,“position”:[1040,800],"

retryOnFail":true,“maxTries”:3,“waitBetweenTries”:2000},{“parameters”:{"jsCode

":"const original = $(‘Merge Data’).first().json;\nconst parse = (n) => { try

{ return JSON.parse($(n).first().json.message?.content || ‘{}’); } catch(e) {

return { error: e.message }; } };\n\nconst result = {\n requestId:

original.requestId,\n title: original.title,\n completedAt: new

Date().toISOString(),\n platforms: {\n twitter: parse('Generate: Twitter

Thread’),\n linkedin: parse(‘Generate: LinkedIn Post’),\n instagram:

parse(‘Generate: Instagram Caption’),\n facebook: parse('Generate: Facebook

Post’)\n }\n};\n\nreturn [{ json: result

}];"},“id”:“collect-results”,“name”:"Collect

Results",“type”:“n8n-nodes-base.code”,“typeVersion”:2,“position”:[1300,500]},{

“parameters”:{“operation”:“append”,“documentId”:{“__rl”:true,“value”:"={{

$env.FLOWSCRIBE_SHEET_ID

}}“,“mode”:“id”},“sheetName”:{”__rl":true,“value”:"Lite

Log",“mode”:“name”},“columns”:{“mappingMode”:“defineBelow”,“value”:{"Request

ID":“={{ $json.requestId }}”,“Title”:“={{ $json.title }}”,“Completed At”:"={{

$json.completedAt }}“,“Twitter Thread”:”={{

JSON.stringify($json.platforms.twitter.thread) }}“,“LinkedIn Post”:”={{

$json.platforms.linkedin.post }}“,“Instagram Caption”:”={{

$json.platforms.instagram.caption }}“,“Facebook Post”:”={{

$json.platforms.facebook.post

}}"}},“options”:{}},“id”:“save-sheets”,“name”:"Save to Google

Sheets",“type”:“n8n-nodes-base.googleSheets”,“typeVersion”:4.5,“position”:[152

0,400],“retryOnFail”:true,“maxTries”:2},{“parameters”:{“respondWith”:“json”,"r

esponseBody":"={{ JSON.stringify({ success: true, requestId: $json.requestId,

title: $json.title, platforms: [‘twitter’, ‘linkedin’, ‘instagram’,

‘facebook’], message: ‘4 platform contents generated. Check Google Sheets.’ })

}}"},“id”:“respond-success”,“name”:"Respond:

Success",“type”:“n8n-nodes-base.respondToWebhook”,“typeVersion”:1.1,“position”

:[1520,600]},{“parameters”:{“content”:"## FlowScribe Lite — Quick 4-Platform

Repurpose\n\nSimplified version with 4 core platforms:\nTwitter/X | LinkedIn |

Instagram | Facebook\n\nFaster processing, lower API cost.\nIdeal for daily

content repurposing.",“width”:350,“height”:200,“color”:6},“id”:“note-overview”

,“name”:“Sticky Note”,“type”:“n8n-nodes-base.stickyNote”,“typeVersion”:1,"posi

tion":[120,160]}],“connections”:{“Receive Content”:{“main”:[[{“node”:"Validate

Input",“type”:“main”,“index”:0}]]},“Validate Input”:{“main”:[[{“node”:"AI:

Quick Analysis",“type”:“main”,“index”:0}]]},"AI: Quick

Analysis":{“main”:[[{“node”:“Merge Data”,“type”:“main”,“index”:0}]]},"Merge

Data":{“main”:[[{“node”:"Generate: Twitter

Thread",“type”:“main”,“index”:0},{“node”:"Generate: LinkedIn

Post",“type”:“main”,“index”:0},{“node”:"Generate: Instagram

Caption",“type”:“main”,“index”:0},{“node”:"Generate: Facebook

Post",“type”:“main”,“index”:0}]]},"Generate: Twitter

Thread":{“main”:[[{“node”:"Collect

Results",“type”:“main”,“index”:0}]]},"Generate: LinkedIn

Post":{“main”:[[{“node”:"Collect

Results",“type”:“main”,“index”:0}]]},"Generate: Instagram

Caption":{“main”:[[{“node”:"Collect

Results",“type”:“main”,“index”:0}]]},"Generate: Facebook

Post":{“main”:[[{“node”:“Collect Results”,“type”:“main”,“index”:0}]]},"Collect

Results":{“main”:[[{“node”:"Save to Google

Sheets",“type”:“main”,“index”:0},{“node”:“Respond: Success”,“type”:“main”,"ind

ex":0}]]}},“settings”:{“executionOrder”:“v1”,“saveManualExecutions”:true},"tag

s":[{“name”:“FlowScribe”,“id”:“flowscribe”},{“name”:“AutoFlow”,“id”:“autoflow”

},{“name”:“Lite”,“id”:“lite”}],“meta”:{“instanceId”:“flowscribe-lite-v1”}}

Happy automating!

— Automatia BCN, Barcelona

the useful test for this template isnt whether it creates four outputs, its whether each one feels native to the platform

id keep the exact claims and source urls attached to the input, generate separate drafts, then stop for approval before anything publishes. retries should be idempotent too so a facebook failure doesnt send linkedin twice

for the final handoff, Blotato can take the blog as context and publish the approved versions through its n8n node or API. n8n can keep the approval state and one result per destination