AutomationFlowsAI & RAG › The Blog Agent

The Blog Agent

ByMax Mitcham @maxmitcham on n8n.io

An intelligent content automation system that manages the complete blog content lifecycle, from strategic planning to publish-ready articles. It combines AI-powered research, SEO-optimized writing, and strategic content management to execute a pillar/cluster content strategy…

Cron / scheduled trigger★★★★☆ complexityAI-powered21 nodesMcp Client ToolLinear ToolOpenAI ChatAnthropic ChatAgentGoogle Sheets ToolHTTP Request ToolTool Think
AI & RAG Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11536 — we link there as the canonical source.

This workflow follows the Agent → Chat Trigger 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 →

Download .json
{
  "id": "Replace123",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "The Blog Jedi",
  "tags": [
    {
      "id": "Replace123",
      "name": "AI Content",
      "createdAt": "2025-11-12T16:51:05.174Z",
      "updatedAt": "2025-11-12T16:51:05.174Z"
    }
  ],
  "nodes": [
    {
      "id": "d6a300e1-54f3-4f58-b5fa-4472a771742e",
      "name": "MCP FireCrawl",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        1344,
        0
      ],
      "parameters": {
        "options": {},
        "endpointUrl": "https://mcp.firecrawl.dev/Replace123/v2/mcp"
      },
      "typeVersion": 1.2
    },
    {
      "id": "071e4296-6da0-4e1a-9d9a-c35aec76418d",
      "name": "Create an issue in Linear",
      "type": "n8n-nodes-base.linearTool",
      "position": [
        1488,
        -80
      ],
      "parameters": {
        "title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}",
        "teamId": "Replace123",
        "additionalFields": {
          "description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Description', ``, 'string') }}"
        }
      },
      "credentials": {
        "linearApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "74edd6b3-f702-4185-aae2-e6af1e55b9b0",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1216,
        64
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-2025-08-07",
          "cachedResultName": "gpt-5-2025-08-07"
        },
        "options": {
          "timeout": 90000,
          "maxTokens": 20000,
          "reasoningEffort": "medium"
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3daddfc8-a004-4d41-a294-bf8a98dec6b0",
      "name": "Anthropic Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        1008,
        -16
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-5-20250929",
          "cachedResultName": "Claude Sonnet 4.5"
        },
        "options": {
          "thinking": true,
          "thinkingBudget": 3000,
          "maxTokensToSample": 20000
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "04b38c3b-acdb-4e9b-ba00-74f63e641fde",
      "name": "Anthropic Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        -480,
        0
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-5-20250929",
          "cachedResultName": "Claude Sonnet 4.5"
        },
        "options": {
          "thinking": false,
          "maxTokensToSample": 20000
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "661d4d0b-c7f7-4dd1-bc21-cb99bd78a716",
      "name": "MCP FireCrawl1",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        640,
        -80
      ],
      "parameters": {
        "options": {},
        "endpointUrl": "https://mcp.firecrawl.dev/Replace123/v2/mcp"
      },
      "typeVersion": 1.2
    },
    {
      "id": "633c6a54-0f1a-419e-ba13-1988cd44877c",
      "name": "Blog Writer Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1152,
        -384
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "options": {
          "maxIterations": 100,
          "systemMessage": "=SEO & AI-Optimized Blog Writer Agent (v2.2)\nYou are an expert SEO and AI-optimized content writer, specialized in creating high-quality blog posts that rank well in both traditional search engines and AI-powered search platforms. You execute the Pillar/Cluster content strategy for Trigify.io.\n\n\u26a0\ufe0f CRITICAL INSTRUCTION: OUTPUT THE FULL BLOG POST \u26a0\ufe0f\nYOUR #1 RULE: You must write and output the COMPLETE, PUBLISHABLE BLOG POST.\n\n\u274c DO NOT output summaries or reports. \u2705 DO write every single word of the blog post. \u2705 DO output the full article that can be copied and published.\n\nThe Linear issue must contain the ENTIRE ARTICLE, not a summary about the article.\n\nCore Identity\nYou are a strategic content creator and Brand Advocate for Trigify who:\n\nPRIORITIZES TRIGIFY SEO: Every post is written to rank Trigify first.\n\nReceives comprehensive blog briefs from the Blog Checker Agent.\n\nExecutes Pillar or Cluster posts based on the brief type.\n\nConducts thorough research using web scraping tools.\n\nPROVIDES REAL SOURCE URLs: Never use generated/temporary screenshot links.\n\nImplements strategic internal linking following pillar/cluster architecture.\n\nCreates strict metadata within character limits.\n\nEnsures factual accuracy and proper attribution.\n\n\ud83d\udcf8 IMAGE REQUIREMENTS (FIXED)\nYour Goal: Provide visuals that verify the content. The Problem: Automated scraper screenshots (like storage.googleapis...) are often broken or private. The Fix: You must provide the Public Source URL (The website where the image exists).\n\n\u26d4 BANNED IMAGE LINKS \u26d4\n\u274c NEVER use Firecrawl/Scraper generated links (e.g., https://storage.googleapis.com/firecrawl...) \u274c NEVER use Base64 strings or local paths.\n\n\u2705 ACCEPTABLE IMAGE FORMATS (In Order of Preference)\nOption 1: Direct Public Image URL If you find a permanent, public image on a website (e.g., a CDN link ending in .png, .jpg, .webp), use that.\n\nExample: https://images.g2crowd.com/uploads/product/image/123.png\n\nOption 2: The Website Source URL (Fallback) If you cannot find a direct image link, provide the Page URL where the visual can be found, so the editor can take the screenshot.\n\nExample: https://hootsuite.com/pricing\n\n\ud83d\udcdd IMAGE DELIVERY FORMAT\nIn your blog post, format images like this:\n\nMarkdown\n\n![Alt text description](Placeholder_Image)\n*Caption: Description of visual | Source Page: [Source Name](ACTUAL_WEBSITE_URL)*\n\n> **\ud83d\udcf7 IMAGE INSTRUCTION:**\n> **Visual needed:** [Describe what to show, e.g., \"Hootsuite Pricing Table\"]\n> **Go to URL:** [https://hootsuite.com/pricing] (Use the real website link)\n> **Alt Text:** [SEO Alt Text]\n\ud83c\udfdb\ufe0f PILLAR/CLUSTER CONTENT EXECUTION\nUnderstanding Content Types\nPILLAR POSTS (Hub/Resource Center):\n\nLength: 2,000-3,000+ words\n\nStyle: High-level overview, resource hub.\n\nLinking: Links OUT to all related cluster posts.\n\nImages: 5-8 visuals needed.\n\nCLUSTER POSTS (Deep Dive):\n\nLength: 800-1,500 words.\n\nStyle: Solve ONE core problem fully.\n\nLinking: MUST link back to parent pillar.\n\nImages: 3-5 visuals needed.\n\nPRIMARY WRITING RULES (CRITICAL)\n\u26d4 EM DASH PROHIBITION \u26d4\nNEVER use em dashes (\u2014). Use parentheses, commas, or colons instead.\n\n\ud83d\udcdd METADATA REQUIREMENTS (STRICT)\nMeta Title:\n\nHARD CAP: 60 characters.\n\nFormat: META TITLE: [Title] (XX/60)\n\nMeta Description:\n\nHARD CAP: 160 characters.\n\nFormat: META DESCRIPTION: [Desc] (XXX/160)\n\nOperational Framework\nPhase 1: Research (Real URLs Only)\nResearch Checklist:\n\n[ ] Competitor content (Find the page URL)\n\n[ ] Authority sources (Find the report URL)\n\n[ ] Product interfaces (Find the help doc/product page URL)\n\n[ ] Pricing pages (Find the pricing URL)\n\nDo NOT try to \"capture\" the screenshot yourself if it creates a temporary link. Just grab the Website URL so the human can see it.\n\nPhase 2: Content Creation (Trigify First)\nPILLAR Post Structure:\n\nMarkdown\n\n# [H1 Title]\n\n[Intro - Hook. Mention Trigify.]\n\n## [Competitor] Overview\n[Details]\n> **\ud83d\udcf7 IMAGE INSTRUCTION:**\n> **Visual:** [Competitor Dashboard]\n> **Source:** [https://competitor.com/features]\n\n## Trigify Overview (THE HERO)\n[Details - Position as superior]\n> **\ud83d\udcf7 IMAGE INSTRUCTION:**\n> **Visual:** [Trigify Interface]\n> **Source:** [https://trigify.io]\n\n[...Continue with Feature/Pricing Comparisons...]\nOutput Format\n\u26a0\ufe0f CRITICAL: YOU MUST OUTPUT THE ACTUAL BLOG POST \u26a0\ufe0f\nThe Linear issue must contain the FULL ARTICLE.\n\nFinal Deliverable Structure:\nMarkdown\n\n# BLOG POST: [Title]\n\n---\n## \ud83d\udccd METADATA BLOCK\n---\n**Content Type**: PILLAR / CLUSTER\n**Target Keyword**: [keyword]\n\n### Meta Title\n[Your title]\n**Character Count**: XX/60 \u2705\n\n### Meta Description\n[Your description]\n**Character Count**: XXX/160 \u2705\n\n---\n## \ud83d\udcf8 IMAGE SOURCE LIST\n---\n1. **Section:** Intro | **Source:** [https://website.com]\n2. **Section:** Pricing | **Source:** [https://competitor.com/pricing]\n\n---\n## \ud83d\udcdd FULL BLOG POST CONTENT (PUBLISH-READY)\n---\n\n# [H1 Title]\n\n[Full content paragraphs...]\n\n> **\ud83d\udcf7 IMAGE INSTRUCTION:**\n> **Visual:** [Description]\n> **Source:** [https://actual-website-url.com]\n\n## [H2 Section]\n\n[Full content paragraphs...]\n\n> **\ud83d\udcf7 IMAGE INSTRUCTION:**\n> **Visual:** [Description]\n> **Source:** [https://actual-website-url.com]\n\n[...Continue writing every word of the article...]\n\n---\n## \u2705 VERIFICATION CHECKLIST\n---\n- [ ] FULL BLOG POST WRITTEN\n- [ ] Image Sources are REAL WEBSITES (No firecrawl links)\n- [ ] Trigify Positioned as #1\n- [ ] No em dashes\n\ud83d\udea8 FINAL REMINDER\nNO BROKEN LINKS: Do not use storage.googleapis links. Give me the Website URL (e.g., https://sproutsocial.com/pricing).\n\nFULL CONTENT: Write every word.\n\nTRIGIFY FIRST: Sell the product in the content.",
          "enableStreaming": true,
          "returnIntermediateSteps": true
        },
        "promptType": "define",
        "needsFallback": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "03a9fe43-3947-4bce-8275-50904a87c8f8",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -416,
        -368
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1,
                2,
                3
              ]
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b1b489f0-30a0-43e0-8b03-02d6a332824c",
      "name": "Append or update row in sheet in Google Sheets",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        -64,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "notes": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('notes', ``, 'string') }}",
            "next_action": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('next_action', ``, 'string') }}",
            "last_run_date": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('last_run_date', ``, 'string') }}",
            "pillar_status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('pillar_status', ``, 'string') }}",
            "current_pillar": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('current_pillar', ``, 'string') }}",
            "cluster_1_title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_1_title', ``, 'string') }}",
            "cluster_2_title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_2_title', ``, 'string') }}",
            "cluster_3_title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_3_title', ``, 'string') }}",
            "cluster_4_title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_4_title', ``, 'string') }}",
            "cluster_5_title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_5_title', ``, 'string') }}",
            "cluster_1_status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_1_status', ``, 'string') }}",
            "cluster_2_status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_2_status', ``, 'string') }}",
            "cluster_3_status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_3_status', ``, 'string') }}",
            "cluster_4_status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_4_status', ``, 'string') }}",
            "cluster_5_status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('cluster_5_status', ``, 'string') }}",
            "clusters_completed": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('clusters_completed', ``, 'string') }}",
            "keywords_processed": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('keywords_processed', ``, 'string') }}"
          },
          "schema": [
            {
              "id": "current_pillar",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "current_pillar",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "pillar_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "pillar_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "clusters_completed",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "clusters_completed",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_1_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_1_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_1_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_1_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_2_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_2_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_2_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_2_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_3_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_3_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_3_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_3_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_4_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_4_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_4_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_4_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_5_title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_5_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster_5_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "cluster_5_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "keywords_processed",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "keywords_processed",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "last_run_date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "last_run_date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "next_action",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "next_action",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "notes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "current_pillar"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1838921587,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/Replace123/edit#gid=1838921587",
          "cachedResultName": "Strategy_State"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "Replace123",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/Replace123/edit?usp=drivesdk",
          "cachedResultName": "Trigify SEO Report"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5b7678e1-b693-4e7b-b311-cb237b2ddd3b",
      "name": "Get row(s) in sheet in Google Sheets- Strategy_State",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        -304,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1838921587,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/Replace123/edit#gid=1838921587",
          "cachedResultName": "Strategy_State"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "Replace123",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/Replace123/edit?usp=drivesdk",
          "cachedResultName": "Trigify SEO Report"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b3adc68c-af2a-4320-950c-48eb3f3feef0",
      "name": "Get row(s) in sheet in Google Sheets- SEO Report",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        -160,
        144
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/Replace123/edit#gid=0",
          "cachedResultName": "SEO Report"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "Replace123",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/Replace123/edit?usp=drivesdk",
          "cachedResultName": "Trigify SEO Report"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "f299afdf-d0f4-4179-ab7c-d743bf7704d9",
      "name": "Anthropic Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        352,
        -64
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-opus-4-5-20251101",
          "cachedResultName": "Claude Opus 4.5"
        },
        "options": {
          "thinking": false,
          "maxTokensToSample": 20000
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "fe6a2e0b-c542-40fb-ae44-69cab8504fa9",
      "name": "Researcher",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        400,
        -336
      ],
      "parameters": {
        "text": "={{ $json.output }}{{ $json.chatInput }}",
        "options": {
          "maxIterations": 25,
          "systemMessage": "=# Blog Research Agent (v3.0)\n\n## \ud83c\udfaf PURPOSE\nResearch the topic and create a comprehensive blog brief. Output the brief so it can be passed to the Blog Writer Agent. That's it.\n\nAll research you will be doing is for Trigify.io where you are researching blogs for them.\n\nThe topic you need the follow is -> {{ $json.output }}\n\nThe context is trigify is a agentic social listening tool.\n---\n\n## \u26a1 EXECUTION MODE: FAST\n\nYou have **3 steps**. Do them in order. Do not deviate.\n\n### STEP 1: Research (2 Firecrawl calls MAX)\n\n**Call 1:** Search for \"[main keyword]\" - scrape the top result\n**Call 2:** Search for \"[competitor] pricing\" OR \"[topic] statistics\" - get data\n\nThat's it. Two calls. Move on.\n\n### STEP 2: Build Brief\n\nUsing ONLY what you found, fill this template:\n\n```\n# BRIEF: [Topic Title]\n\n**Type:** PILLAR / CLUSTER\n**Word Count:** [2,500-3,500 pillar / 1,200-1,800 cluster]\n**Keyword:** [primary keyword]\n\n## Meta\n- **Title (60 char max):** [title here]\n- **Description (160 char max):** [description here]\n\n## Outline\n- H2: [Section 1 title] - cover [topic]\n- H2: [Section 2 title] - cover [topic]\n- H2: [Section 3 title] - cover [topic]\n- H2: [Section 4 title] - cover [topic]\n- H2: Conclusion - CTA for Trigify\n\n## Images Needed\n1. [Description] - Source: [URL or \"create\"]\n2. [Description] - Source: [URL or \"create\"]\n3. [Description] - Source: [URL or \"create\"]\n\n## Key Data Found\n- [Stat/fact 1] - Source: [URL]\n- [Stat/fact 2] - Source: [URL]\n\n## Internal Links\n- Link to: /pricing\n- Link to: /features\n- Link to: [related pillar/cluster if applicable]\n\n## Trigify Angle\n- Position Trigify as: [key advantage]\n- CTA: [specific action]\n```\n\n### STEP 3: Output Brief\n\nOutput the complete brief clearly. The Blog Writer Agent will receive this brief and write the article. Done.\n\n---\n\n## \ud83d\udeab DO NOT\n\n- Do NOT make more than 2 Firecrawl calls\n- Do NOT research multiple competitors\n- Do NOT search for images separately\n- Do NOT iterate looking for \"better\" data\n- Do NOT write the actual article\n- Do NOT save to Linear (that's the Blog Writer Agent's job)\n\n---\n\n## \u2705 SUCCESS = \n\n1. Made \u22642 research calls\n2. Created brief with all sections filled\n3. Output brief clearly for Blog Writer Agent\n\nThat's the entire job. Be fast."
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "92057bcf-e301-49ca-97d8-4707d03a1b68",
      "name": "Get many issues in Linear1",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        208,
        128
      ],
      "parameters": {
        "url": "https://api.linear.app/graphql",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "query { issues(first: 50) { nodes { id identifier title } } }"
            }
          ]
        },
        "toolDescription": "Gets all Issues from Linear to check current written blogs.",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Replace123"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "e83e02ab-f054-4456-a359-369a6457e504",
      "name": "Think",
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "position": [
        528,
        32
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "2edb0469-f8f0-4a6a-acd5-c64c26a48b81",
      "name": "Think1",
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "position": [
        64,
        96
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "8775b138-ad2b-488a-8970-05bbdd9a5277",
      "name": "Blog Status Manager Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -208,
        -320
      ],
      "parameters": {
        "text": "Run task.",
        "options": {
          "systemMessage": "=Blog Status Manager Agent (v2.2)\n\ud83c\udfaf YOUR SINGLE PURPOSE\nYou manage the continuous content lifecycle. You are a Strategic Project Manager that pulls topics from the SEO Report based on ROI.\n\nYour Critical Mandate:\n\nFollow this flow exactly: \n\n1) Use the Get many issues in Linear1 tool to pull back all blogs that have been done in the past. \n\n2) Use the Get row(s) in sheet in Google Sheets- Strategy_State tool and check to cross reference what blogs have been done based on the results from the Linear tool vs what we have planned vs drafted.\n\n3) Update any rows in the Append or update row in sheet in Google Sheets tool.\n\nFor example if we have done a Blog on  Brand Tracking - The Essential Guide for B2B Brands (2025) and its status is Planned but it exists in Linear then this needs to be updated to DRAFT_CREATED.\n\n4) Any clusters or pillars that contain PLANNED we need to focus on. \n\nPick one that contains PLANNED and then send the title to the next agent so it knows what research it needs to complete when researching the required information for that blog.\n\nYour response needs to be only what the next agent should focus on i.e The next agent should now research and create content for: for: **\\CLUSTER BLOG -\"What is Brand Tracking? Definition & Best Practices for B2B\\\"**\"\n\nEnsure you include if its a Pillar blog or cluster blog.\n\n5) if all pillars and clusters contain DRAFT_CREATED then we will need to read the Get row(s) in sheet in Google Sheets- SEO Report. \n\nThis contains an in-depth SEO report on my company Trigify. \n\nYour job is to read this report and then workout what our next focus pillar should be + the clusters invloved. Focus on high prioerties to start with. \n\n6) Once you've created identfied a new pillar and clusters  Update any rows in the Append or update row in sheet in Google Sheets tool with the new information where you put all the status as PLANNED. "
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "6d6798ea-41c7-409b-87e4-67df865e4a5c",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        144,
        -480
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.4
    },
    {
      "id": "85648ccb-1e87-46da-a764-417c814ff538",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        -800
      ],
      "parameters": {
        "color": 4,
        "width": 528,
        "height": 400,
        "content": "**What this agent does:**\nThis agent manages your entire blog content lifecycle. It acts as a strategic project manager that:\n- Checks what blogs have already been written (by querying Linear)\n- Cross-references completed blogs with your Google Sheets strategy state\n- Updates blog statuses (PLANNED \u2192 DRAFT_CREATED)\n- Selects the next blog topic to work on from your SEO report\n- Creates new pillar/cluster strategies when all current ones are complete\n\n**\ud83d\udcdd WHERE TO EDIT THE PROMPT:**\nClick on this node \u2192 Go to the 'System Message' field in the 'Options' section \u2192 Edit the prompt to customize:\n- How it prioritizes blog topics\n- What statuses it uses\n- How it selects new pillars/clusters\n- Your company-specific requirements"
      },
      "typeVersion": 1
    },
    {
      "id": "a697e61d-839e-444f-8252-21bb003816b8",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        288,
        -800
      ],
      "parameters": {
        "color": 3,
        "width": 512,
        "height": 416,
        "content": "\ud83d\udd0d **RESEARCHER AGENT**\n\n**What this agent does:**\nThis agent conducts fast, focused research for blog topics. It:\n- Makes up to 2 Firecrawl calls to research the topic\n- Gathers competitor information and statistics\n- Creates comprehensive blog briefs with outlines, metadata, and image requirements\n- Outputs structured briefs that get passed to the Blog Writer Agent\n\n**\ud83d\udcdd WHERE TO EDIT THE PROMPT:**\nClick on this node \u2192 Go to the 'System Message' field in the 'Options' section \u2192 Edit the prompt to customize:\n- Research depth and number of sources\n- Brief structure and format\n- What information to prioritize\n- Your brand voice and requirements"
      },
      "typeVersion": 1
    },
    {
      "id": "37b87b5b-2e95-4ff9-9432-39d8bd0e2405",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        -880
      ],
      "parameters": {
        "color": 5,
        "width": 608,
        "height": 496,
        "content": "\u270d\ufe0f **BLOG WRITER AGENT**\n\n**What this agent does:**\nThis agent writes the complete, publish-ready blog posts. It:\n- Receives blog briefs from the Researcher Agent\n- Conducts additional research using Firecrawl tools\n- Writes full blog posts (2,000-3,000 words for pillars, 800-1,500 for clusters)\n- Creates SEO-optimized metadata (titles, descriptions)\n- Implements internal linking strategies\n- Saves completed blogs to Linear as issues\n\n**\ud83d\udcdd WHERE TO EDIT THE PROMPT:**\nClick on this node \u2192 Go to the 'System Message' field in the 'Options' section \u2192 Edit the prompt to customize:\n- Writing style and tone\n- SEO requirements\n- Brand positioning\n- Content structure\n- Image requirements\n- Your specific brand guidelines\n\n**\u26a0\ufe0f IMPORTANT:** This agent writes the FULL blog post - make sure your prompt reflects your brand voice and content standards!"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "Replace123",
  "connections": {
    "Think": {
      "ai_tool": [
        [
          {
            "node": "Researcher",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Think1": {
      "ai_tool": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Researcher": {
      "main": [
        [
          {
            "node": "Blog Writer Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MCP FireCrawl": {
      "ai_tool": [
        [
          {
            "node": "Blog Writer Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "MCP FireCrawl1": {
      "ai_tool": [
        [
          {
            "node": "Researcher",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Blog Writer Agent": {
      "main": [
        []
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Blog Writer Agent",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    },
    "Anthropic Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Blog Writer Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Anthropic Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Anthropic Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Researcher",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Blog Status Manager Agent": {
      "main": [
        [
          {
            "node": "Researcher",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create an issue in Linear": {
      "ai_tool": [
        [
          {
            "node": "Blog Writer Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get many issues in Linear1": {
      "ai_tool": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "Researcher",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet in Google Sheets": {
      "ai_tool": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet in Google Sheets- SEO Report": {
      "ai_tool": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet in Google Sheets- Strategy_State": {
      "ai_tool": [
        [
          {
            "node": "Blog Status Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

An intelligent content automation system that manages the complete blog content lifecycle, from strategic planning to publish-ready articles. It combines AI-powered research, SEO-optimized writing, and strategic content management to execute a pillar/cluster content strategy…

Source: https://n8n.io/workflows/11536/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow implements an advanced AI-powered system for generating, and executing Claude Skills stored on GitHub.

Chat Trigger, Memory Buffer Window, Mcp Client Tool +9
AI & RAG

Think Tool. Uses stickyNote, agent, googleCalendarTool, memoryBufferWindow. Chat trigger; 28 nodes.

Agent, Google Calendar Tool, Memory Buffer Window +8
AI & RAG

This assistant is designed for people who don't have time to write and send emails to suppliers. With just one request, it drafts and sends clear, professional messages automatically.

Mcp Trigger, Gmail Tool, Chat Trigger +6
AI & RAG

This workflow integrates multiple productivity tools into a single AI-powered assistant using n8n, acting as a centralized control hub to receive and execute tasks across Google Calendar, Gmail, Googl

Agent, Discord, OpenAI Chat +12
AI & RAG

This n8n workflow creates an intelligent WhatsApp customer support bot that can handle text, image, audio, and document messages. The workflow automatically processes incoming messages through differe

HTTP Request, N8N Nodes Rapiwa, Agent Tool +9