This workflow corresponds to n8n.io template #13003 — we link there as the canonical source.
This workflow follows the Emailsend → HTTP Request 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 →
{
"meta": {
"templateId": "ready-to-run-ai-workflow",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "753b0708-0a28-4031-bfb1-d9adc567a0ab",
"name": "Sticky Note - Content Generation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1504,
-1088
],
"parameters": {
"color": 7,
"width": 400,
"height": 400,
"content": "## \ud83d\udcc5 Daily Content Generation Flow\n\nTriggers **Monday-Friday at 9:00 AM JST**\n\n**This section**:\n1. Gets Japanese cultural context (seasons, holidays, business events)\n2. Analyzes your past 30 days of posts for brand voice\n3. Generates 3 Twitter post options with GPT-4\n4. Considers current events and cultural appropriateness"
},
"typeVersion": 1
},
{
"id": "caf02274-68f6-4ce7-aa56-f79af9bea8eb",
"name": "Sticky Note - Quality Scoring",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-1152
],
"parameters": {
"color": 7,
"width": 380,
"height": 484,
"content": "## \ud83c\udfaf AI Quality Scoring System\n\n**Evaluates content on 100-point scale**:\n- Engagement prediction (30 pts)\n- SEO/discoverability (20 pts)\n- Brand voice alignment (20 pts)\n- Readability (15 pts)\n- CTA clarity (15 pts)\n\nContent scoring **below 70 points** triggers auto-improvement (up to 3 attempts)"
},
"typeVersion": 1
},
{
"id": "e4561ad5-a3be-4aef-a080-6204a9b9f81e",
"name": "Sticky Note - Improvement",
"type": "n8n-nodes-base.stickyNote",
"position": [
-416,
-1152
],
"parameters": {
"color": 7,
"width": 360,
"height": 396,
"content": "## \ud83d\udd04 Self-Improvement Loop\n\nIf content scores **< 70 points** and **< 3 improvement attempts**:\n\n1. GPT-4 rewrites based on specific feedback\n2. Re-evaluates with quality scoring\n3. Repeats up to 3 times\n\nAfter 3 attempts or score \u226570, proceeds to risk analysis"
},
"typeVersion": 1
},
{
"id": "5729b69f-86d8-47b5-99fd-1c526ae9c4bb",
"name": "Sticky Note - Risk Analysis",
"type": "n8n-nodes-base.stickyNote",
"position": [
-32,
-1280
],
"parameters": {
"color": 7,
"width": 360,
"height": 552,
"content": "## \u26a0\ufe0f Risk & Sentiment Analysis\n\n**Detects**:\n- Political/religious references\n- Gender/discriminatory language\n- Inappropriate disaster/accident mentions\n- Misleading advertising\n- Competitor attacks\n- Cultural taboos\n- Timing issues (mourning periods, etc.)\n\n**Risk levels**: low / medium / high"
},
"typeVersion": 1
},
{
"id": "aabaf71e-f6eb-4058-a84e-69a970e5fe00",
"name": "Sticky Note - Routing",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
-960
],
"parameters": {
"color": 7,
"width": 340,
"height": 504,
"content": "## \ud83d\udea6 Smart Routing Decision\n\n**Auto-approve** (posts immediately):\n- Quality score \u2265 70\n- Risk level = low\n\n**Requires approval**:\n- Quality score < 70 OR\n- Risk level = medium\n\n**Auto-reject**:\n- Risk level = high\n\n(Rejected content is saved to Notion for review)"
},
"typeVersion": 1
},
{
"id": "410eb215-935f-4c82-b5f0-1bd1e8580c57",
"name": "Sticky Note - Auto Approve",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
-880
],
"parameters": {
"color": 7,
"width": 320,
"height": 244,
"content": "## \u2705 Auto-Approved Path\n\n1. Saves to Notion (status: published)\n2. Posts to Twitter automatically\n3. No human intervention needed\n\nFor **high-confidence, low-risk content**"
},
"typeVersion": 1
},
{
"id": "f93e3471-ae8d-4c2c-bd98-5014c105c57f",
"name": "Sticky Note - Approval Path",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
-288
],
"parameters": {
"color": 7,
"width": 340,
"height": 324,
"content": "## \ud83d\udc64 Human Approval Path\n\n1. Saves to Notion (status: pending)\n2. Sends email to approval team with:\n - Content preview\n - Quality scores\n - Risk assessment\n - Improvement history\n3. Awaits approval via webhook\n\n**Use the approval webhook** to approve/reject/edit"
},
"typeVersion": 1
},
{
"id": "ec996c7f-8057-496c-aef8-0e2615b096f0",
"name": "Sticky Note - Webhook",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1504,
-320
],
"parameters": {
"color": 7,
"width": 360,
"height": 636,
"content": "## \ud83d\udd17 Approval Webhook\n\n**Endpoint**: `/approval-webhook`\n\n**Query parameters**:\n- `action`: approve / reject / edit\n- `id`: content ID from Notion\n\n**Body** (for edits):\n```json\n{\n \"editedContent\": \"Modified text\",\n \"approvedBy\": \"user@email.com\"\n}\n```\n\nApproved content gets posted to Twitter"
},
"typeVersion": 1
},
{
"id": "bd65c75e-d488-4c39-8467-d21c4f3824bc",
"name": "Sticky Note - Analytics",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1504,
336
],
"parameters": {
"color": 7,
"width": 380,
"height": 512,
"content": "## \ud83d\udcca Weekly Analytics Report\n\n**Triggers**: Every Monday at 10:00 AM\n\n1. Fetches past week's posts from Notion\n2. GPT-4 analyzes performance data\n3. Generates insights report including:\n - Performance summary\n - Top 3 best posts\n - Posts needing improvement\n - Discovered trends/patterns\n - Actionable recommendations\n4. Emails report to team\n\n**Helps optimize** future content strategy"
},
"typeVersion": 1
},
{
"id": "d6008133-2353-4db5-b7c1-e31c09be68ae",
"name": "Sticky Note - Brand Voice",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1072,
-624
],
"parameters": {
"color": 7,
"width": 360,
"height": 420,
"content": "## \ud83c\udfa8 Brand Voice Learning\n\nAnalyzes your **past 30 days** of posts:\n- Average post length\n- Emoji usage patterns\n- Common hashtags\n- Question-based posts frequency\n- Tone and phrasing\n\nGPT-4 creates a **brand voice profile** to ensure new content matches your established style"
},
"typeVersion": 1
},
{
"id": "006b450d-05ee-4bad-8b93-7f712ca365f7",
"name": "Schedule Daily Content Generation",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1456,
-608
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * 1-5"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "4d9a56a3-0b26-4ea9-9967-1050459bc6c2",
"name": "Generate Content with GPT-4",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1232,
-800
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u65e5\u672c\u5e02\u5834\u306b\u7279\u5316\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u30de\u30fc\u30b1\u30c6\u30a3\u30f3\u30b0\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u65e5\u672c\u306e\u6587\u5316\u3001\u5b63\u7bc0\u3001\u30d3\u30b8\u30cd\u30b9\u7fd2\u6163\u3092\u6df1\u304f\u7406\u89e3\u3057\u3001\u9069\u5207\u306a\u656c\u8a9e\u3068\u89aa\u3057\u307f\u3084\u3059\u3044\u6587\u4f53\u3067\u30bd\u30fc\u30b7\u30e3\u30eb\u30e1\u30c7\u30a3\u30a2\u6295\u7a3f\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\"}, {\"role\": \"user\", \"content\": \"\u4eca\u65e5\u306f\" + $now.format('yyyy\u5e74MM\u6708dd\u65e5(ddd)') + \"\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u6761\u4ef6\u3067Twitter\u6295\u7a3f\u30923\u3064\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n1. \u73fe\u5728\u306e\u5b63\u7bc0\u3084\u65e5\u672c\u306e\u6587\u5316\u7684\u30a4\u30d9\u30f3\u30c8\u3092\u8003\u616e\\n2. \u30d3\u30b8\u30cd\u30b9\u30d1\u30fc\u30bd\u30f3\u5411\u3051\u306e\u6709\u76ca\u306a\u5185\u5bb9\\n3. \u7d75\u6587\u5b57\u30922-3\u500b\u4f7f\u7528\\n4. 200\u6587\u5b57\u4ee5\u5185\\n5. \u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u3092\u4fc3\u3059CTA\u3092\u542b\u3080\\n\\n\u5404\u6295\u7a3f\u3092JSON\u914d\u5217\u3067\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044: [{\\\"content\\\": \\\"\u6295\u7a3f\u6587\\\", \\\"hashtags\\\": [\\\"\u30bf\u30b01\\\", \\\"\u30bf\u30b02\\\"]}]\"}] }}"
},
{
"name": "temperature",
"value": "0.7"
},
{
"name": "max_tokens",
"value": "1000"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "bb8094a2-98eb-4e12-aa2c-a3f01a04fec8",
"name": "Parse Generated Content",
"type": "n8n-nodes-base.code",
"position": [
-1008,
-800
],
"parameters": {
"jsCode": "// Parse GPT-4 response and extract generated content\nconst response = $input.item.json;\nconst content = JSON.parse(response.choices[0].message.content);\n\nconst results = [];\n\nfor (let i = 0; i < content.length; i++) {\n const post = content[i];\n results.push({\n json: {\n content: post.content,\n hashtags: post.hashtags,\n generatedAt: new Date().toISOString(),\n platform: 'twitter',\n status: 'pending_quality_check',\n version: i + 1\n }\n });\n}\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "47c6f1df-ceab-4b18-b22f-4959d4be5760",
"name": "AI Quality Scoring",
"type": "n8n-nodes-base.httpRequest",
"position": [
-784,
-800
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u30b3\u30f3\u30c6\u30f3\u30c4\u54c1\u8cea\u8a55\u4fa1\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u57fa\u6e96\u3067\u6295\u7a3f\u3092100\u70b9\u6e80\u70b9\u3067\u63a1\u70b9\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n1. \u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u4e88\u6e2c (30\u70b9): \u3044\u3044\u306d\u30fb\u30ea\u30c4\u30a4\u30fc\u30c8\u30fb\u30b3\u30e1\u30f3\u30c8\u3092\u7372\u5f97\u3057\u3084\u3059\u3044\u304b\\n2. SEO/\u767a\u898b\u6027 (20\u70b9): \u30cf\u30c3\u30b7\u30e5\u30bf\u30b0\u3068\u691c\u7d22\u3055\u308c\u3084\u3059\u3044\u30ad\u30fc\u30ef\u30fc\u30c9\\n3. \u30d6\u30e9\u30f3\u30c9\u30dc\u30a4\u30b9\u9069\u5408 (20\u70b9): \u30d7\u30ed\u30d5\u30a7\u30c3\u30b7\u30e7\u30ca\u30eb\u3067\u89aa\u3057\u307f\u3084\u3059\u3044\u30c8\u30fc\u30f3\\n4. \u8aad\u307f\u3084\u3059\u3055 (15\u70b9): \u6587\u6cd5\u3001\u53e5\u8aad\u70b9\u3001\u6539\u884c\u306e\u9069\u5207\u3055\\n5. CTA\u660e\u78ba\u3055 (15\u70b9): \u884c\u52d5\u559a\u8d77\u304c\u660e\u78ba\u304b\\n\\nJSON\u5f62\u5f0f\u3067\u8fd4\u7b54: {\\\"total_score\\\": 85, \\\"engagement_score\\\": 25, \\\"seo_score\\\": 18, \\\"brand_voice_score\\\": 18, \\\"readability_score\\\": 13, \\\"cta_score\\\": 11, \\\"feedback\\\": \\\"\u6539\u5584\u70b9\u306e\u8aac\u660e\\\", \\\"risk_level\\\": \\\"low/medium/high\\\", \\\"risk_reason\\\": \\\"\u30ea\u30b9\u30af\u304c\u3042\u308b\u5834\u5408\u306e\u7406\u7531\\\"}\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u6295\u7a3f\u3092\u8a55\u4fa1\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n\" + $json.content + \"\\n\\n\u30cf\u30c3\u30b7\u30e5\u30bf\u30b0: \" + $json.hashtags.join(', ')}] }}"
},
{
"name": "temperature",
"value": "0.3"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "a65792c4-475e-41db-a1bd-9e83a621a983",
"name": "Parse Quality Scores",
"type": "n8n-nodes-base.code",
"position": [
-560,
-864
],
"parameters": {
"jsCode": "// Parse quality scoring results\nconst scoringResponse = $input.item.json;\nconst scores = JSON.parse(scoringResponse.choices[0].message.content);\n\n// Merge with original content\nconst originalData = $('Parse Generated Content').item.json;\n\nreturn {\n json: {\n ...originalData,\n qualityScore: scores.total_score,\n engagementScore: scores.engagement_score,\n seoScore: scores.seo_score,\n brandVoiceScore: scores.brand_voice_score,\n readabilityScore: scores.readability_score,\n ctaScore: scores.cta_score,\n feedback: scores.feedback,\n riskLevel: scores.risk_level,\n riskReason: scores.risk_reason || 'None',\n needsImprovement: scores.total_score < 70,\n improvementAttempts: 0\n }\n};"
},
"typeVersion": 2
},
{
"id": "ea9f9825-4276-4f12-a417-f06f757360ed",
"name": "Check if Improvement Needed",
"type": "n8n-nodes-base.if",
"position": [
-336,
-864
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "needs-improvement",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.needsImprovement }}",
"rightValue": true
},
{
"id": "improvement-attempts",
"operator": {
"type": "number",
"operation": "lt"
},
"leftValue": "={{ $json.improvementAttempts }}",
"rightValue": "3"
}
]
}
},
"typeVersion": 2
},
{
"id": "74c37691-36e4-4222-b281-f2ea2dd613a1",
"name": "Auto-Improve Content",
"type": "n8n-nodes-base.httpRequest",
"position": [
64,
-960
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u30b3\u30f3\u30c6\u30f3\u30c4\u6539\u5584\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u306b\u57fa\u3065\u3044\u3066\u6295\u7a3f\u3092\u6539\u5584\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u6295\u7a3f\u3092\u6539\u5584\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n\u5143\u306e\u6295\u7a3f:\\n\" + $json.content + \"\\n\\n\u54c1\u8cea\u30b9\u30b3\u30a2: \" + $json.qualityScore + \"/100\\n\\n\u6539\u5584\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af:\\n\" + $json.feedback + \"\\n\\n\u30ea\u30b9\u30af\u30ec\u30d9\u30eb: \" + $json.riskLevel + \"\\n\" + ($json.riskReason !== 'None' ? \"\u30ea\u30b9\u30af\u7406\u7531: \" + $json.riskReason : '') + \"\\n\\n\u6539\u5584\u7248\u3092JSON\u5f62\u5f0f\u3067\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044: {\\\"content\\\": \\\"\u6539\u5584\u3055\u308c\u305f\u6295\u7a3f\u6587\\\", \\\"hashtags\\\": [\\\"\u30bf\u30b01\\\", \\\"\u30bf\u30b02\\\"]}\"}] }}"
},
{
"name": "temperature",
"value": "0.7"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "833cc233-23d4-4d79-bc30-4e8f62d4f38c",
"name": "Parse Improved Content",
"type": "n8n-nodes-base.code",
"position": [
288,
-864
],
"parameters": {
"jsCode": "// Parse improved content\nconst improveResponse = $input.item.json;\nconst improved = JSON.parse(improveResponse.choices[0].message.content);\n\n// Get original data\nconst originalData = $('Parse Quality Scores').item.json;\n\nreturn {\n json: {\n content: improved.content,\n hashtags: improved.hashtags,\n generatedAt: new Date().toISOString(),\n platform: originalData.platform,\n status: 'pending_quality_check',\n version: originalData.version,\n improvementAttempts: originalData.improvementAttempts + 1,\n previousScore: originalData.qualityScore,\n previousFeedback: originalData.feedback\n }\n};"
},
"typeVersion": 2
},
{
"id": "07ea81b3-eea8-40b5-93bf-a102bbc9d6b2",
"name": "Sentiment & Risk Analysis",
"type": "n8n-nodes-base.httpRequest",
"position": [
64,
-784
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u65e5\u672c\u5e02\u5834\u306b\u7279\u5316\u3057\u305f\u611f\u60c5\u5206\u6790\u3068\u30ea\u30b9\u30af\u691c\u51fa\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u89b3\u70b9\u3067\u5206\u6790\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n\u3010\u708e\u4e0a\u30ea\u30b9\u30af\u8981\u56e0\u3011\\n1. \u653f\u6cbb\u30fb\u5b97\u6559\u3078\u306e\u8a00\u53ca\\n2. \u30b8\u30a7\u30f3\u30c0\u30fc\u30fb\u5dee\u5225\u7684\u8868\u73fe\\n3. \u707d\u5bb3\u30fb\u4e8b\u6545\u3078\u306e\u4e0d\u9069\u5207\u306a\u8a00\u53ca\\n4. \u8a87\u5927\u5e83\u544a\u30fb\u8aa4\u89e3\u3092\u62db\u304f\u8868\u73fe\\n5. \u7af6\u5408\u3078\u306e\u653b\u6483\u7684\u8a00\u53ca\\n\\n\u3010\u65e5\u672c\u6587\u5316\u7684\u914d\u616e\u3011\\n1. \u4e0d\u9069\u5207\u306a\u6642\u671f\u306e\u6295\u7a3f\uff08\u55aa\u4e2d\u3001\u707d\u5bb3\u76f4\u5f8c\u7b49\uff09\\n2. \u656c\u8a9e\u306e\u8aa4\u7528\\n3. \u6587\u5316\u7684\u30bf\u30d6\u30fc\\n\\nJSON\u5f62\u5f0f\u3067\u8fd4\u7b54: {\\\"sentiment\\\": \\\"positive/neutral/negative\\\", \\\"risk_level\\\": \\\"low/medium/high\\\", \\\"risk_factors\\\": [\\\"\u8981\u56e01\\\", \\\"\u8981\u56e02\\\"], \\\"recommendations\\\": \\\"\u63a8\u5968\u4e8b\u9805\\\", \\\"cultural_appropriateness\\\": \\\"appropriate/needs_review/inappropriate\\\"}\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u6295\u7a3f\u3092\u5206\u6790\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n\" + $json.content}] }}"
},
{
"name": "temperature",
"value": "0.2"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "e31fb9b0-6bf9-4e05-91c3-ffbef666d5e6",
"name": "Merge Risk Analysis",
"type": "n8n-nodes-base.code",
"position": [
464,
-448
],
"parameters": {
"jsCode": "// Parse sentiment and risk analysis\nconst analysisResponse = $input.item.json;\nconst analysis = JSON.parse(analysisResponse.choices[0].message.content);\n\n// Get content data\nconst contentData = $('Parse Quality Scores').item.json;\n\nreturn {\n json: {\n ...contentData,\n sentiment: analysis.sentiment,\n riskLevel: analysis.risk_level,\n riskFactors: analysis.risk_factors,\n recommendations: analysis.recommendations,\n culturalAppropriateness: analysis.cultural_appropriateness,\n finalRiskAssessment: analysis.risk_level === 'high' ? 'auto_reject' : (analysis.risk_level === 'medium' || contentData.qualityScore < 70) ? 'requires_approval' : 'auto_approve'\n }\n};"
},
"typeVersion": 2
},
{
"id": "451a01cd-63ee-4f36-9363-083d0ee3e6f6",
"name": "Decision Routing",
"type": "n8n-nodes-base.if",
"position": [
672,
-608
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "auto-approve",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.finalRiskAssessment }}",
"rightValue": "auto_approve"
}
]
}
},
"typeVersion": 2
},
{
"id": "ebb2b91a-1574-408a-ab8c-5148c985b575",
"name": "Save to Notion (Auto-Approved)",
"type": "n8n-nodes-base.notion",
"position": [
912,
-608
],
"parameters": {
"pageId": {
"__rl": true,
"mode": "url",
"value": ""
},
"options": {}
},
"typeVersion": 2.1
},
{
"id": "58147eae-9a9d-4a61-9153-611e3e958631",
"name": "Save to Notion (Pending Approval)",
"type": "n8n-nodes-base.notion",
"position": [
912,
-416
],
"parameters": {
"pageId": {
"__rl": true,
"mode": "url",
"value": ""
},
"options": {}
},
"typeVersion": 2.1
},
{
"id": "9013da0d-41b9-422c-91f9-926afbc6c497",
"name": "Send Approval Email",
"type": "n8n-nodes-base.emailSend",
"position": [
1232,
-416
],
"parameters": {
"options": {},
"subject": "\u3010\u8981\u627f\u8a8d\u3011AI\u30b3\u30f3\u30c6\u30f3\u30c4 - \u54c1\u8cea\u30b9\u30b3\u30a2: {{ $json.qualityScore }}\u70b9 | \u30ea\u30b9\u30af: {{ $json.riskLevel }}",
"toEmail": "user@example.com",
"fromEmail": "user@example.com"
},
"typeVersion": 2.1
},
{
"id": "4acc6a07-9613-4703-9232-bc3f3858fd8d",
"name": "Post to Twitter (Auto-Approved)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1232,
-608
],
"parameters": {
"url": "https://api.twitter.com/2/tweets",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "={{ $json.content + ' ' + $json.hashtags.map(tag => '#' + tag).join(' ') }}"
}
]
},
"genericAuthType": "oAuth2Api"
},
"typeVersion": 4.1
},
{
"id": "f599a7ef-39fb-46c7-8b1a-bcb7a589702e",
"name": "Get Japanese Cultural Context",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1232,
-608
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u65e5\u672c\u306e\u5b63\u7bc0\u30fb\u6587\u5316\u30a4\u30d9\u30f3\u30c8\u306e\u5c02\u9580\u5bb6\u3067\u3059\u3002\u73fe\u5728\u306e\u65e5\u4ed8\u306b\u57fa\u3065\u3044\u3066\u3001\u30b3\u30f3\u30c6\u30f3\u30c4\u306b\u53cd\u6620\u3059\u3079\u304d\u6587\u5316\u7684\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u63d0\u4f9b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}, {\"role\": \"user\", \"content\": \"\u4eca\u65e5\u306f\" + $now.format('yyyy\u5e74MM\u6708dd\u65e5(ddd)') + \"\u3067\u3059\u3002\u4ee5\u4e0b\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044:\\n\\n1. \u73fe\u5728\u306e\u5b63\u7bc0\u3068\u7279\u5fb4\\n2. \u8fd1\u65e5\u4e2d\u306e\u65e5\u672c\u306e\u795d\u65e5\u30fb\u8a18\u5ff5\u65e5\\n3. \u30d3\u30b8\u30cd\u30b9\u30b7\u30fc\u30f3\u3067\u610f\u8b58\u3059\u3079\u304d\u30a4\u30d9\u30f3\u30c8\uff08\u6c7a\u7b97\u671f\u3001\u30dc\u30fc\u30ca\u30b9\u6642\u671f\u7b49\uff09\\n4. SNS\u6295\u7a3f\u3067\u4f7f\u3046\u3079\u304d\u5b63\u7bc0\u306e\u8868\u73fe\u3084\u30ad\u30fc\u30ef\u30fc\u30c9\\n5. \u907f\u3051\u308b\u3079\u304d\u30c8\u30d4\u30c3\u30af\uff08\u55aa\u4e2d\u671f\u9593\u3001\u707d\u5bb3\u8a18\u5ff5\u65e5\u7b49\uff09\\n\\nJSON\u5f62\u5f0f\u3067\u8fd4\u7b54\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}] }}"
},
{
"name": "temperature",
"value": "0.5"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "5f6ec1cb-e46b-4091-9b7c-3eeaa9600128",
"name": "Get Past 30 Days Posts",
"type": "n8n-nodes-base.notion",
"position": [
-928,
-320
],
"parameters": {
"operation": "getAll"
},
"typeVersion": 2.1
},
{
"id": "7ad8ffaf-34f6-4550-a64f-327a1daa461b",
"name": "Analyze Brand Voice",
"type": "n8n-nodes-base.code",
"position": [
-640,
-320
],
"parameters": {
"jsCode": "// Analyze past posts to create brand voice profile\nconst posts = $input.all();\n\nif (posts.length === 0) {\n return {\n json: {\n brandVoiceProfile: \"\u30c7\u30d5\u30a9\u30eb\u30c8\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb: \u30ab\u30b8\u30e5\u30a2\u30eb\u3067\u89aa\u3057\u307f\u3084\u3059\u304f\u3001\u30d3\u30b8\u30cd\u30b9\u30d1\u30fc\u30bd\u30f3\u5411\u3051\u306e\u6709\u76ca\u306a\u60c5\u5831\u3092\u63d0\u4f9b\",\n analyzedPosts: 0\n }\n };\n}\n\nconst contents = posts.map(p => p.json.Content || p.json.content).filter(c => c);\n\nconst analysisData = {\n totalPosts: contents.length,\n averageLength: Math.round(contents.reduce((sum, c) => sum + c.length, 0) / contents.length),\n hashtagUsage: posts.flatMap(p => p.json.Hashtags || p.json.hashtags || []),\n emojiCount: contents.reduce((sum, c) => sum + (c.match(/[\\u{1F300}-\\u{1F9FF}]/gu) || []).length, 0),\n questionPosts: contents.filter(c => c.includes('?') || c.includes('?')).length\n};\n\nreturn {\n json: {\n brandVoiceAnalysis: analysisData,\n analyzedPosts: contents.length,\n topHashtags: [...new Set(analysisData.hashtagUsage)].slice(0, 10)\n }\n};"
},
"typeVersion": 2
},
{
"id": "d437b5ec-fb0e-46e1-badb-bf1f7a5bf22b",
"name": "Create Brand Voice Profile",
"type": "n8n-nodes-base.httpRequest",
"position": [
-368,
-320
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u904e\u53bb\u306e\u6295\u7a3f\u30c7\u30fc\u30bf\u304b\u3089\u3001\u30d6\u30e9\u30f3\u30c9\u30dc\u30a4\u30b9\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u306b\u57fa\u3065\u3044\u3066\u3001\u30d6\u30e9\u30f3\u30c9\u30dc\u30a4\u30b9\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n\u5206\u6790\u6295\u7a3f\u6570: \" + $json.analyzedPosts + \"\\n\u5e73\u5747\u6587\u5b57\u6570: \" + $json.brandVoiceAnalysis.averageLength + \"\\n\u7d75\u6587\u5b57\u4f7f\u7528\u6570: \" + $json.brandVoiceAnalysis.emojiCount + \"\\n\u8cea\u554f\u5f62\u5f0f\u6295\u7a3f: \" + $json.brandVoiceAnalysis.questionPosts + \"\\n\u3088\u304f\u4f7f\u3046\u30cf\u30c3\u30b7\u30e5\u30bf\u30b0: \" + $json.topHashtags.join(', ') + \"\\n\\nJSON\u5f62\u5f0f\u3067\u4ee5\u4e0b\u3092\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044:\\n{\\\"tone\\\": \\\"\u6587\u4f53\u306e\u7279\u5fb4\\\", \\\"emoji_usage\\\": \\\"\u7d75\u6587\u5b57\u4f7f\u7528\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3\\\", \\\"average_length\\\": \\\"\u63a8\u5968\u6587\u5b57\u6570\\\", \\\"key_phrases\\\": [\\\"\u3088\u304f\u4f7f\u3046\u30d5\u30ec\u30fc\u30ba\\\"], \\\"cta_style\\\": \\\"CTA(\u884c\u52d5\u559a\u8d77)\u306e\u30b9\u30bf\u30a4\u30eb\\\"}\"}] }}"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "8fdc27ce-4ee6-4b4e-9a06-38db4f5b6d7f",
"name": "Webhook - Approval Dashboard",
"type": "n8n-nodes-base.webhook",
"position": [
-1456,
128
],
"parameters": {
"path": "approval-webhook",
"options": {}
},
"typeVersion": 1.1
},
{
"id": "b5e26e78-ec91-4c1f-b892-fa3c15b2d4ed",
"name": "Process Approval Action",
"type": "n8n-nodes-base.code",
"position": [
-1248,
128
],
"parameters": {
"jsCode": "// Handle approval webhook\nconst action = $input.item.json.query.action; // approve, reject, edit\nconst contentId = $input.item.json.query.id;\nconst editedContent = $input.item.json.body?.editedContent;\n\nreturn {\n json: {\n action: action,\n contentId: contentId,\n editedContent: editedContent,\n approvedBy: $input.item.json.body?.approvedBy || 'Unknown',\n timestamp: new Date().toISOString()\n }\n};"
},
"typeVersion": 2
},
{
"id": "0b302fff-97a9-48ba-9123-decbb8d3b370",
"name": "Check Approval Action",
"type": "n8n-nodes-base.if",
"position": [
-1008,
128
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "is-approved",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "approve"
}
]
}
},
"typeVersion": 2
},
{
"id": "90bb9902-6237-4b2d-b132-d26515ca1921",
"name": "Update Notion - Approved",
"type": "n8n-nodes-base.notion",
"position": [
-784,
32
],
"parameters": {
"operation": "update"
},
"typeVersion": 2.1
},
{
"id": "b2c8f814-39e4-4233-b35f-b65f0dcc1429",
"name": "Update Notion - Rejected",
"type": "n8n-nodes-base.notion",
"position": [
-784,
224
],
"parameters": {
"operation": "update"
},
"typeVersion": 2.1
},
{
"id": "ba5bc1a8-dbd9-49b5-add9-a7bf257c6622",
"name": "Weekly Performance Report Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1456,
720
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 10 * * 1"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "c45a573c-7956-4c4f-8fbe-372e8d0fba17",
"name": "Get Past Week Posts",
"type": "n8n-nodes-base.notion",
"position": [
-1248,
720
],
"parameters": {
"operation": "getAll"
},
"typeVersion": 2.1
},
{
"id": "ae72df4a-5b2f-41bd-a58e-decaa7d0429c",
"name": "Generate Weekly Analytics Report",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1008,
720
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-4"
},
{
"name": "messages",
"value": "={{ [{\"role\": \"system\", \"content\": \"\u3042\u306a\u305f\u306f\u30c7\u30fc\u30bf\u30a2\u30ca\u30ea\u30b9\u30c8\u3067\u3059\u3002\u904e\u53bb1\u9031\u9593\u306e\u30bd\u30fc\u30b7\u30e3\u30eb\u30e1\u30c7\u30a3\u30a2\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5206\u6790\u3057\u3001\u6539\u5584\u63d0\u6848\u3092\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002\"}, {\"role\": \"user\", \"content\": \"\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u5206\u6790\u3057\u3066\u304f\u3060\u3055\u3044:\\n\\n\" + JSON.stringify($input.all().map(item => ({content: item.json.Content, qualityScore: item.json['Quality Score'], engagement: item.json.Engagement || 0, platform: item.json.Platform}))) + \"\\n\\n\u4ee5\u4e0b\u306e\u5f62\u5f0f\u3067\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044:\\n1. \u7dcf\u5408\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30b5\u30de\u30ea\u30fc\\n2. \u30d9\u30b9\u30c8\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6295\u7a3f\uff08TOP3\uff09\\n3. \u6539\u5584\u304c\u5fc5\u8981\u306a\u6295\u7a3f\\n4. \u767a\u898b\u3055\u308c\u305f\u30c8\u30ec\u30f3\u30c9\u30fb\u30d1\u30bf\u30fc\u30f3\\n5. \u6b21\u9031\u3078\u306e\u5177\u4f53\u7684\u306a\u6539\u5584\u63d0\u6848\\n\\nMarkdown\u5f62\u5f0f\u3067\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044\u3002\"}] }}"
},
{
"name": "temperature",
"value": "0.7"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "b8903692-a75a-40d4-8bd1-d07cacf51efc",
"name": "Send Weekly Report Email",
"type": "n8n-nodes-base.emailSend",
"position": [
-784,
720
],
"parameters": {
"options": {},
"subject": "\ud83d\udcca \u9031\u6b21\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30ec\u30dd\u30fc\u30c8 - {{ $now.format('yyyy\u5e74MM\u6708dd\u65e5') }}",
"toEmail": "user@example.com",
"fromEmail": "user@example.com"
},
"typeVersion": 2.1
},
{
"id": "e4135011-c917-41db-90c7-7904781cc800",
"name": "Sticky Note - Main Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2176,
-1136
],
"parameters": {
"width": 560,
"height": 2164,
"content": "## AI-Powered Japanese Social Media Content Generator with Quality Control\n\n### \ud83c\udfaf Who's it for\n\nMarketing teams and social media managers in Japan who want to automate content creation while maintaining high quality standards and cultural appropriateness. Perfect for businesses that need consistent Japanese-language social media presence with built-in compliance checks.\n\n### \ud83d\udcdd What it does\n\nThis workflow creates an intelligent content generation system that:\n\n- Generates culturally-aware Japanese Twitter posts using GPT-4\n- Automatically scores content quality across 5 dimensions (engagement, SEO, brand voice, readability, CTA)\n- Performs sentiment analysis and risk detection for controversial topics\n- Routes content intelligently: auto-posts high-quality/low-risk content, flags medium-risk content for approval, and rejects high-risk content\n- Includes an auto-improvement loop that refines content up to 3 times if quality scores are below 70\n- Provides weekly performance analytics and recommendations\n\n### \ud83d\udd27 How it works\n\n**Daily Content Generation Flow:**\n1. Schedule trigger runs weekday mornings at 9 AM\n2. Fetches Japanese cultural context (seasons, holidays, business events)\n3. Analyzes brand voice from past 30 days of posts\n4. Generates 3 Twitter post variations with GPT-4\n5. Each post is scored on quality metrics (100-point scale)\n6. Low-scoring content enters auto-improvement loop\n7. Risk analysis checks for controversy, cultural sensitivity, and sentiment\n8. Decision routing: auto-approve and post OR send for manual approval OR reject\n\n**Approval Workflow:**\n- Pending posts trigger approval emails\n- Webhook receives approval/rejection/edit actions\n- Approved posts are published to Twitter and archived in Notion\n\n**Weekly Analytics:**\n- Monday morning trigger analyzes past week's performance\n- GPT-4 generates insights report with best practices\n- Email sent to team with recommendations\n\n### \u2699\ufe0f Requirements\n\n**APIs & Credentials:**\n- OpenAI API (GPT-4 access)\n- Twitter API v2 with OAuth 2.0\n- Notion API (database for content storage)\n- Email sending service (SMTP or SendGrid)\n\n**Setup:**\n1. Create a Notion database with columns: Content, Hashtags, Quality Score, Risk Level, Status, Engagement\n2. Configure OpenAI API credentials with HTTP Header Auth\n3. Set up Twitter OAuth 2.0 credentials\n4. Configure email service for approval notifications\n\n### \ud83c\udfa8 How to customize\n\n**Adjust Quality Thresholds:**\n- Modify the quality scoring criteria in \"AI Quality Scoring\" node\n- Change auto-approval threshold (currently 70+ points)\n\n**Content Generation:**\n- Edit GPT-4 prompts in \"Generate Content with GPT-4\" node to match your brand tone\n- Adjust temperature settings for more/less creative content\n- Modify the number of posts generated per run\n\n**Risk Detection:**\n- Customize risk factors in \"Sentiment & Risk Analysis\" node\n- Add industry-specific compliance checks\n\n**Brand Voice Learning:**\n- Adjust the lookback period in \"Get Past 30 Days Posts\" (currently 30 days)\n- Modify brand voice analysis logic in \"Analyze Brand Voice\" node\n\n**Scheduling:**\n- Change cron expressions for daily content generation and weekly reports\n- Add additional triggers for special campaigns\n\n### \u26a0\ufe0f Important Notes\n\n- This workflow uses Japanese language prompts - modify system prompts if using for other languages\n- Ensure compliance with Twitter's API rate limits and automation policies\n- Review auto-posted content regularly to validate AI quality assessments\n- The workflow stores all generated content in Notion for audit trails"
},
"typeVersion": 1
}
],
"connections": {
"Decision Routing": {
"main": [
[
{
"node": "Save to Notion (Auto-Approved)",
"type": "main",
"index": 0
}
],
[
{
"node": "Save to Notion (Pending Approval)",
"type": "main",
"index": 0
}
]
]
},
"AI Quality Scoring": {
"main": [
[
{
"node": "Parse Quality Scores",
"type": "main",
"index": 0
}
]
]
},
"Analyze Brand Voice": {
"main": [
[
{
"node": "Create Brand Voice Profile",
"type": "main",
"index": 0
}
]
]
},
"Get Past Week Posts": {
"main": [
[
{
"node": "Generate Weekly Analytics Report",
"type": "main",
"index": 0
}
]
]
},
"Merge Risk Analysis": {
"main": [
[
{
"node": "Decision Routing",
"type": "main",
"index": 0
}
]
]
},
"Auto-Improve Content": {
"main": [
[
{
"node": "Parse Improved Content",
"type": "main",
"index": 0
}
]
]
},
"Parse Quality Scores": {
"main": [
[
{
"node": "Check if Improvement Needed",
"type": "main",
"index": 0
}
]
]
},
"Check Approval Action": {
"main": [
[
{
"node": "Update Notion - Approved",
"type": "main",
"index": 0
}
],
[
{
"node": "Update Notion - Rejected",
"type": "main",
"index": 0
}
]
]
},
"Get Past 30 Days Posts": {
"main": [
[
{
"node": "Analyze Brand Voice",
"type": "main",
"index": 0
}
]
]
},
"Parse Improved Content": {
"main": [
[
{
"node": "AI Quality Scoring",
"type": "main",
"index": 0
}
]
]
},
"Parse Generated Content": {
"main": [
[
{
"node": "AI Quality Scoring",
"type": "main",
"index": 0
}
]
]
},
"Process Approval Action": {
"main": [
[
{
"node": "Check Approval Action",
"type": "main",
"index": 0
}
]
]
},
"Sentiment & Risk Analysis": {
"main": [
[
{
"node": "Merge Risk Analysis",
"type": "main",
"index": 0
}
]
]
},
"Check if Improvement Needed": {
"main": [
[
{
"node": "Auto-Improve Content",
"type": "main",
"index": 0
}
],
[
{
"node": "Sentiment & Risk Analysis",
"type": "main",
"index": 0
}
]
]
},
"Generate Content with GPT-4": {
"main": [
[
{
"node": "Parse Generated Content",
"type": "main",
"index": 0
}
]
]
},
"Webhook - Approval Dashboard": {
"main": [
[
{
"node": "Process Approval Action",
"type": "main",
"index": 0
}
]
]
},
"Save to Notion (Auto-Approved)": {
"main": [
[
{
"node": "Post to Twitter (Auto-Approved)",
"type": "main",
"index": 0
}
]
]
},
"Generate Weekly Analytics Report": {
"main": [
[
{
"node": "Send Weekly Report Email",
"type": "main",
"index": 0
}
]
]
},
"Save to Notion (Pending Approval)": {
"main": [
[
{
"node": "Send Approval Email",
"type": "main",
"index": 0
}
]
]
},
"Schedule Daily Content Generation": {
"main": [
[
{
"node": "Generate Content with GPT-4",
"type": "main",
"index": 0
},
{
"node": "Get Japanese Cultural Context",
"type": "main",
"index": 0
},
{
"node": "Get Past 30 Days Posts",
"type": "main",
"index": 0
}
]
]
},
"Weekly Performance Report Trigger": {
"main": [
[
{
"node": "Get Past Week Posts",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Marketing teams and social media managers in Japan who want to automate content creation while maintaining high quality standards and cultural appropriateness. Perfect for businesses that need consistent Japanese-language social media presence with built-in compliance checks.
Source: https://n8n.io/workflows/13003/ — 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.
Automatically discovers trending topics in your niche and generates ready-to-use content ideas with AI. Twitter/X trending topics and hashtags Reddit hot posts from niche subreddits Google Trends dail
This workflow monitors brand mentions across multiple platforms (Twitter/X, Reddit, News) and automatically detects reputation crises based on sentiment analysis and trend detection. Multi-platform mo
Creator: Summer Chang
Notion to Linkedin. Uses stickyNote, scheduleTrigger, notion, httpRequest. Scheduled trigger; 13 nodes.
This workflow automates daily LinkedIn posts using Notion. It starts by fetching the day's post from a Notion database, processes and formats the content, including images, then publishes it on Linked