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