This workflow follows the Google Sheets → OpenAI recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "FlowScribe Lite \u2014 Quick 4-Platform Repurpose",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "flowscribe-lite",
"responseMode": "responseNode",
"options": {}
},
"id": "trigger-webhook",
"name": "Receive Content",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
200,
400
]
},
{
"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
]
},
{
"parameters": {
"model": "gpt-4o-mini",
"messages": {
"values": [
{
"role": "system",
"content": "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.content}}"
}
]
},
"options": {
"temperature": 0.3,
"maxTokens": 1000,
"responseFormat": "json_object"
}
},
"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
]
},
{
"parameters": {
"model": "gpt-4o-mini",
"messages": {
"values": [
{
"role": "system",
"content": "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,
"responseFormat": "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": {
"model": "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,
"responseFormat": "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,
"responseFormat": "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": {
"model": "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,
"responseFormat": "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": [
1520,
400
],
"retryOnFail": true,
"maxTries": 2
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ 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 \u2014 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,
"position": [
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",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true
},
"tags": [
{
"name": "FlowScribe",
"id": "flowscribe"
},
{
"name": "AutoFlow",
"id": "autoflow"
},
{
"name": "Lite",
"id": "lite"
}
]
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
FlowScribe Lite — Quick 4-Platform Repurpose. Uses openAi, googleSheets. Webhook trigger; 12 nodes.
Source: https://github.com/enzoemir1/autoflow-n8n-workflows/blob/main/workflows/flowscribe-lite.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow captures new leads via webhook, enriches and scores them with Apollo and Google Gemini, logs everything in Google Sheets, and automates outreach, reply handling, follow-ups, meeting prep
Propulsar — Content Engine v3. Uses openAi, httpRequest, googleSheets. Webhook trigger; 73 nodes.
AI SDR_for transcription. Uses openAi, googleSheets, httpRequest. Webhook trigger; 55 nodes.
Instantly map all internal URLs, perform AI-powered (ChatGPT) analysis, and deliver results in HTML via webhook, Google Sheets, or email. All from your own n8n instance!
Watch on Youtube▶️