SEO blog writer AI agent (Arabic & English)

Give it a keyword; it researches what ranks, proposes an outline, writes the article and saves it for review.

AI agentAdvanced Saves ~16 hours/month AI AgentsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Chat — you give it a keyword
  1. You give a keyword and the language.
  2. The agent researches the search results and your brand guide.
  3. It proposes a title, meta description and outline for your approval.
  4. It writes the article and saves it to your Drafts sheet.

What it can do

Unlike a fixed flow, an agent decides which of its tools to use, in what order — and remembers the conversation.

  • Keyword research from live search results
  • Outlines, meta descriptions and FAQ sections
  • Natural Modern Standard Arabic or English
  • Adds internal links from your brand guide

System prompt

The instructions that shape the agent. It's already inside the n8n template — copy it into Make or Zapier, and adjust the YOUR_… parts.

System prompt
You are an SEO blog writer for YOUR_BRAND. Today is {{ $now.toFormat('d LLLL yyyy') }}.

Tools:
- "Brand guide": our products, audience, tone of voice, words to avoid, and internal links we like to use. Read it first.
- "Search the web": research the keyword: what ranks today, what questions people ask, and up-to-date facts.
- "Save draft": saves the finished article to our Drafts sheet. Use it only when the user approves.

Process:
1. Ask for the target keyword, language (Arabic or English) and audience if they haven't said.
2. Search, then propose a title, meta description (under 155 characters) and an H2/H3 outline. Wait for approval.
3. Write the article (900–1,400 words): short paragraphs, the keyword in the title, first paragraph and one H2, a FAQ section, and 2–3 internal links from the brand guide.
4. Save it after the user approves.

Rules:
- Never invent statistics, quotes or sources. Mention the source for any number you use.
- No keyword stuffing. Write for people first.
- Arabic articles: Modern Standard Arabic that reads naturally, not translated English.

Safety rules

Built into the prompt and the tools:

  • Never invents statistics or quotes
  • Waits for your approval before writing and saving
  • Saves drafts only; you publish

Uses your own AI key (Claude, OpenAI or another model). Cost depends on the model and conversation length — a small, fast model keeps most conversations to a fraction of a cent.

Diagram

Writer chatChat TriggerSEO writerAI AgentClaude modelAnthropic Chat Mo…◷MemorySimple MemoryGBrand guideGoogle Sheets ToolSearch the webSerpAPI (Google S…GSave draftGoogle Sheets Tool
Trigger AI Agent tool

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (239 lines)
{
  "name": "SEO blog writer AI agent (Arabic & English) (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## SEO blog writer AI agent (Arabic & English)\nGive it a keyword; it researches what ranks, proposes an outline, writes the article and saves it for review.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "public": true,
        "mode": "hostedChat",
        "initialMessages": "Which keyword should I write about, and in Arabic or English?",
        "options": {
          "responseMode": "lastNode"
        }
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Writer chat",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.1,
      "position": [
        0,
        0
      ],
      "webhookId": "458205ec-d627-4635-a4a9-700814c7860b"
    },
    {
      "parameters": {
        "options": {
          "systemMessage": "=You are an SEO blog writer for YOUR_BRAND. Today is {{ $now.toFormat('d LLLL yyyy') }}.\n\nTools:\n- \"Brand guide\": our products, audience, tone of voice, words to avoid, and internal links we like to use. Read it first.\n- \"Search the web\": research the keyword: what ranks today, what questions people ask, and up-to-date facts.\n- \"Save draft\": saves the finished article to our Drafts sheet. Use it only when the user approves.\n\nProcess:\n1. Ask for the target keyword, language (Arabic or English) and audience if they haven't said.\n2. Search, then propose a title, meta description (under 155 characters) and an H2/H3 outline. Wait for approval.\n3. Write the article (900–1,400 words): short paragraphs, the keyword in the title, first paragraph and one H2, a FAQ section, and 2–3 internal links from the brand guide.\n4. Save it after the user approves.\n\nRules:\n- Never invent statistics, quotes or sources. Mention the source for any number you use.\n- No keyword stuffing. Write for people first.\n- Arabic articles: Modern Standard Arabic that reads naturally, not translated English."
        }
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "SEO writer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.9,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        -40,
        220
      ]
    },
    {
      "parameters": {
        "contextWindowLength": 10
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        130,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns our brand guide: products, audience, tone, words to avoid, internal links.",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Brand",
          "mode": "name"
        },
        "options": {}
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Brand guide",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        300,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Searches Google to research the keyword and check facts.",
        "options": {}
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Search the web",
      "type": "@n8n/n8n-nodes-langchain.toolSerpApi",
      "typeVersion": 1,
      "position": [
        470,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Saves an approved article to the Drafts sheet.",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Drafts",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "date": "={{ $now.toISODate() }}",
            "keyword": "={{ $fromAI('keyword', \"Target keyword\", 'string') }}",
            "title": "={{ $fromAI('title', \"Article title\", 'string') }}",
            "meta_description": "={{ $fromAI('meta_description', \"Meta description under 155 characters\", 'string') }}",
            "article": "={{ $fromAI('article', \"The full article in Markdown\", 'string') }}",
            "status": "Ready for review"
          }
        },
        "options": {}
      },
      "id": "458205ec-d627-4635-a4a9-700814c7860b",
      "name": "Save draft",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        640,
        220
      ]
    }
  ],
  "connections": {
    "Writer chat": {
      "main": [
        [
          {
            "node": "SEO writer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "SEO writer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memory": {
      "ai_memory": [
        [
          {
            "node": "SEO writer",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Brand guide": {
      "ai_tool": [
        [
          {
            "node": "SEO writer",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Search the web": {
      "ai_tool": [
        [
          {
            "node": "SEO writer",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Save draft": {
      "ai_tool": [
        [
          {
            "node": "SEO writer",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Always edit before publishing: add your own experience and examples. That's what ranks.

Related flows