<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paul Maxime DOSSOU</title>
    <description>The latest articles on DEV Community by Paul Maxime DOSSOU (@maxience).</description>
    <link>https://dev.to/maxience</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3994962%2Fdf50f487-7c78-49c0-80ed-8385a64f3603.jpg</url>
      <title>DEV Community: Paul Maxime DOSSOU</title>
      <link>https://dev.to/maxience</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxience"/>
    <language>en</language>
    <item>
      <title>How I Built a Programmatic SEO Pipeline with n8n + Claude API (and deployed 200+ pages in 3 days)</title>
      <dc:creator>Paul Maxime DOSSOU</dc:creator>
      <pubDate>Sun, 21 Jun 2026 06:20:55 +0000</pubDate>
      <link>https://dev.to/maxience/how-i-built-a-programmatic-seo-pipeline-with-n8n-claude-api-and-deployed-200-pages-in-3-days-2868</link>
      <guid>https://dev.to/maxience/how-i-built-a-programmatic-seo-pipeline-with-n8n-claude-api-and-deployed-200-pages-in-3-days-2868</guid>
      <description>&lt;p&gt;A few months ago, a client asked me to rank on 150+ local search queries across 5 cities — with a budget that wouldn't cover a single traditional agency retainer.&lt;/p&gt;

&lt;p&gt;Instead of writing 150 articles manually, I built a pipeline. Here's exactly how it works.&lt;/p&gt;

&lt;p&gt;The problem with traditional SEO at scale&lt;/p&gt;

&lt;p&gt;Creating geo-targeted content manually is slow, expensive, and inconsistent. You need a writer who understands SEO structure, knows the local context, and can maintain quality across hundreds of pages.&lt;/p&gt;

&lt;p&gt;I replaced that process with a system: n8n + Claude API + WordPress REST API.&lt;/p&gt;

&lt;p&gt;The architecture&lt;/p&gt;

&lt;p&gt;Google Sheets (input)&lt;br&gt;
    → n8n workflow&lt;br&gt;
        → Claude API (content generation)&lt;br&gt;
        → WordPress REST API (publish)&lt;br&gt;
            → Next.js revalidation (ISR)&lt;br&gt;
Three tools. One trigger. Zero manual publishing.&lt;/p&gt;

&lt;p&gt;Step 1 — The input sheet&lt;/p&gt;

&lt;p&gt;Each row in Google Sheets defines one page:&lt;/p&gt;

&lt;p&gt;city    service target_keyword  population  competitors&lt;br&gt;
Cotonou n8n automation  consultant n8n cotonou  800000  ...&lt;br&gt;
Abidjan automatisation  automatisation processus abidjan    4M  ...&lt;br&gt;
n8n reads this sheet on a schedule (or on-demand via webhook).&lt;/p&gt;

&lt;p&gt;Step 2 — The n8n workflow&lt;/p&gt;

&lt;p&gt;The core workflow has 6 nodes:&lt;/p&gt;

&lt;p&gt;Google Sheets trigger — reads unprocessed rows (status = "pending")&lt;br&gt;
HTTP Request — calls Claude API with a structured prompt&lt;br&gt;
JSON parser — extracts title, slug, content, excerpt, tags&lt;br&gt;
WordPress REST API — creates the post as draft&lt;br&gt;
Google Sheets update — marks row as "published" with the post URL&lt;br&gt;
Next.js revalidation — calls /api/revalidate to clear ISR cache&lt;br&gt;
The Claude prompt is the critical piece. Here's a simplified version:&lt;/p&gt;

&lt;p&gt;You are an SEO content expert. Write a complete article for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service: {{service}}&lt;/li&gt;
&lt;li&gt;City: {{city}}&lt;/li&gt;
&lt;li&gt;Target keyword: {{target_keyword}}&lt;/li&gt;
&lt;li&gt;Word count: 2000+ words&lt;/li&gt;
&lt;li&gt;Language: French&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Required structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;intro-block (50 words max, direct answer)&lt;/li&gt;
&lt;li&gt;4 stats (local market data)&lt;/li&gt;
&lt;li&gt;8+ H2 sections with rich content&lt;/li&gt;
&lt;li&gt;Comparison table&lt;/li&gt;
&lt;li&gt;FAQ (8-10 questions, accordion format)&lt;/li&gt;
&lt;li&gt;CTA block linking to /contact&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Return valid JSON: { title, slug, excerpt, content, tags[], read_time }&lt;br&gt;
Step 3 — The WordPress REST API call&lt;/p&gt;

&lt;p&gt;// n8n HTTP Request node&lt;br&gt;
POST &lt;a href="https://your-site.com/wp-json/wp/v2/posts" rel="noopener noreferrer"&gt;https://your-site.com/wp-json/wp/v2/posts&lt;/a&gt;&lt;br&gt;
Authorization: Bearer {{wp_token}}&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "title": "{{title}}",&lt;br&gt;
  "slug": "{{slug}}",&lt;br&gt;
  "content": "{{content}}",&lt;br&gt;
  "status": "publish",&lt;br&gt;
  "categories": [{{category_id}}],&lt;br&gt;
  "meta": {&lt;br&gt;
    "excerpt": "{{excerpt}}"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
Step 4 — Next.js ISR revalidation&lt;/p&gt;

&lt;p&gt;If you're running Next.js in front of WordPress (or a custom backend), you need to bust the cache after publishing:&lt;/p&gt;

&lt;p&gt;// app/api/revalidate/route.ts&lt;br&gt;
import { revalidatePath } from 'next/cache';&lt;br&gt;
import { NextRequest, NextResponse } from 'next/server';&lt;/p&gt;

&lt;p&gt;export async function POST(req: NextRequest) {&lt;br&gt;
  const { slug } = await req.json();&lt;br&gt;
  const secret = req.headers.get('x-revalidate-secret');&lt;/p&gt;

&lt;p&gt;if (secret !== process.env.REVALIDATE_SECRET) {&lt;br&gt;
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;revalidatePath(&lt;code&gt;/blog/${slug}&lt;/code&gt;);&lt;br&gt;
  return NextResponse.json({ revalidated: true });&lt;br&gt;
}&lt;br&gt;
n8n calls this endpoint after each publish. The page is live and indexed within minutes.&lt;/p&gt;

&lt;p&gt;Results&lt;/p&gt;

&lt;p&gt;200+ geo-targeted pages deployed in 3 days&lt;br&gt;
Average 2,100 words per page, consistent structure&lt;br&gt;
Zero duplicate content issues (city + service combinations are unique)&lt;br&gt;
First rankings appearing within 3 weeks on low-competition queries&lt;br&gt;
The pipeline runs unattended. I trigger it manually for client reviews, but it could run fully automated on a cron.&lt;/p&gt;

&lt;p&gt;What I learned&lt;/p&gt;

&lt;p&gt;Prompt engineering is the bottleneck. Getting Claude to output valid JSON with correct HTML structure every single time took more iteration than the n8n workflow itself. Add a validation node that checks the JSON before publishing — don't skip this.&lt;/p&gt;

&lt;p&gt;WordPress REST API rate limits exist. If you're deploying 200 pages in one run, add a Wait node between requests (2-3 seconds). Otherwise you'll hit 429s.&lt;/p&gt;

&lt;p&gt;ISR cache busting matters. Without it, your newly published pages serve stale "404 not found" content for hours. Always wire the revalidation call into the workflow.&lt;/p&gt;

&lt;p&gt;The bigger picture&lt;/p&gt;

&lt;p&gt;I build these kinds of systems for clients — SEO pipelines, automation workflows, AI integrations. If you're a dev who's curious about the business side of this, or an entrepreneur who wants to understand what's possible: this is what modern digital agencies actually do when they stop charging by the hour for manual work.&lt;/p&gt;

&lt;p&gt;I document more of this on my site: &lt;a href="https://www.paulmaximedossou.com/" rel="noopener noreferrer"&gt;paulmaximedossou.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Audits are free. DMs are open.&lt;/p&gt;

&lt;p&gt;Paul Maxime Dossou — Founder of EkoMedia. I build automation systems, SEO pipelines, and AI integrations for businesses in France and West Africa.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>automation</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
