Content teams get stuck in the loop of "topic picking by gut, finishing a draft only to find no SEO structure in place, then manually copy-pasting to publish." This n8n workflow strings the whole SEO content line into an automated pipeline: scheduled RSS and trend scraping builds a topic pool, an LLM scores each topic by SEO value (search potential, timeliness, actionability) to filter out the weak ones, high-score topics get fed to an LLM for a first draft, then an SEO optimization node generates title, meta description, keywords, FAQ, and JSON-LD structured data, and finally the draft is auto-published to your CMS via API. Built for solo creators, indie sites, and content marketing teams to compress daily publishing from 4 hours to under 30 minutes; the template is a skeleton-fill in your RSS sources and LLM key and run.
Workflow Chain
Scheduled trigger (daily 9 AM) -> RSS / trend scraping (multi-source) -> topic merge + dedupe -> LLM topic scoring (search potential / timeliness / actionability) -> If branch (action=write to drafting, pool to archive) -> LLM writing (1500-2500 word draft) -> LLM SEO optimization (title / meta / keywords / FAQ / JSON-LD) -> If quality check (word count / title length / keyword in first paragraph) -> publish to CMS (draft status).
Download Template
Setup Steps
- Import: n8n -> Workflows -> Import from File, pick workflow-seo-content-production.json
- Cron trigger node: defaults to daily 9:00 AM; change the cron expression to match your cadence (Mon/Wed/Fri ->
0 9 * * 1,3,5) - RSS scrape node: fill in RSS source URLs for your industry. Tech sites use Hacker News / 36kr / TechCrunch; vertical sites use authoritative sources in that niche. Each RSS Feed Read node takes one URL; copy the node to add more sources
- Topic merge node: the Set node concatenates title + contentSnippet + link from multiple RSS feeds into a
topic_payloadfield, fed uniformly to the scoring model - LLM topic scoring node: fill in your Moonshot / DeepSeek API key; 8k context is enough. The prompt has the model output score, action (write / pool), focus_keyword, and category-only action=write proceeds to drafting
- If topic branch node: true branch goes to LLM writing, false branch archives low-score topics to Feishu / Notion for later review
- LLM writing node: produces a 1500-2500 word draft following your article template (hook opener + 3-4 H2 sections + actionable steps + summary); use 32k context for long posts (moonshot-v1-32k or deepseek-chat), and the prompt must forbid fabricating citations and links
- LLM SEO optimization node: takes the draft and outputs title (≤60 chars), meta description (≤155 chars), focus keyword, 5-8 long-tail keywords, 3-5 FAQ items, a JSON-LD string, and a quality (pass / rewrite) flag. This is the SEO-critical node-lock the JSON output format in the prompt and set temperature to 0
- If quality check node: quality=pass goes to publish, rewrite loops back to the writing node. Check dimensions are decided by the SEO optimization prompt (word count, title length, keyword in first paragraph)
- Publish to CMS node: HTTP Request calls your CMS API (WordPress REST API / Ghost Admin API / custom backend), POSTing title + content + meta + JSON-LD together; status is set to draft for human final review
- Test run: trigger manually once, check whether a topic flowed through, the writing node produced a draft, and the CMS received a draft
Companion Prompt (LLM Writing + SEO Optimization)
[Topic Scoring]
You are a senior SEO content editor. Score each topic 1-10 on:
- Search potential (1-4): clear search intent, expandable long-tail, weak competing pages
- Timeliness (1-3): tied to a trend or recent event
- Actionability (1-3): can produce how-to steps / roundup / SOP
Output JSON only: {"score": number, "action": "write or pool", "focus_keyword": "primary keyword", "reason": "one sentence", "category": "review|sop|hotspot|resource"}
Rule: action is "write" when score >= 7, otherwise "pool". Do not fabricate search volume; mark "needs data" if insufficient.
Topic content: {{$json.topic_payload}}
[SEO Optimization]
You are an SEO specialist. Generate publish metadata and a quality verdict from the draft below.
Output JSON:
{
"title": "≤60 chars, primary keyword front-loaded",
"meta_description": "≤155 chars, primary keyword + call to action",
"focus_keyword": "1 primary term",
"long_tail_keywords": ["5-8 long-tail terms"],
"slug": "kebab-case-english-slug",
"faq": [{"question": "...", "answer": "≤100 words"}],
"json_ld": "FAQPage JSON-LD string",
"quality": "pass or rewrite"
}
quality rule: pass when word count ≥1500, title ≤60 chars, and primary keyword appears in the first paragraph; otherwise rewrite.
Draft: {{$json.draft}}
Do not keyword-stuff the title; the meta should read like natural human prose.Pitfalls
- RSS source quality caps everything: garbage sources yield garbage topics. Hand-pick 5-10 high-quality sources; don't over-collect. Low-quality sources drown the scoring model in noise
- LLM writing fabricates citations and data: the prompt must demand "citations must be real, do not fabricate papers or links"; add a regex check in the quality node for
doi.org/arxiv.orglinks and flag suspicious ones as rewrite for human review - SEO node output format drifts: LLMs often slip explanatory text into JSON. Set temperature to 0 and wrap a try-catch around
JSON.parse()in the next node; on parse failure, loop back and regenerate - Keyword density isn't "the higher the better": modern SEO rewards semantic relevance, not stuffing. Write "primary keyword appears once in the first paragraph, distributed naturally, no stuffing" in the prompt to avoid over-optimization penalties
- Never auto-publish as "published": always save as draft and keep a human final-review gate. Fully automatic straight-publishing, once it errors (policy-violating title, factual mistakes), can't be pulled back and hurts SEO
- Validate JSON-LD against the schema: before publishing, validate JSON-LD locally against the Google Rich Results Test rules; invalid structured data is worse than none
After the template runs, add two enhancements: first, plug in the Google Search Console API to pull weekly impressions and clicks and feed them back to the scoring model so topics get sharper over time; second, 7 days after publishing, auto-check whether the URL is indexed (via the Indexing API) and have humans add internal links to unindexed pages. Backtest the score threshold against historical top performers once a month to catch SEO signal drift.
References
- n8n official workflow templates: https://n8n.io/workflows
- n8n official documentation (nodes / integrations): https://docs.n8n.io
- Google Search Central SEO starter guide: https://developers.google.com/search/docs/fundamentals/seo-starter-guide
- Google structured data intro (JSON-LD / FAQPage): https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
- Moonshot / Kimi API docs (context length and structured output): https://platform.moonshot.cn