Saltar al contenido principal
Logo huiro.dev
Blog
n8nclaude-apiseoautomatizaciónnext.js

Cómo armé un pipeline automático de artículos SEO con n8n y Claude

Un workflow de n8n que lee una cola de temas, genera artículos con Claude, crea un PR en GitHub y me avisa por email. Todo por ~$0.05 por artículo.

Mauricio Cifuentes

12 de abril de 20265 min
Cómo armé un pipeline automático de artículos SEO con n8n y Claude

La semana pasada automaticé la generación de artículos SEO para huiro.dev. El sistema lee una cola de temas, genera el artículo con Claude, lo sube a GitHub como PR y me manda un email para que lo revise. Todo corre en n8n sin intervención humana.

En este post explico exactamente cómo lo armé, qué decisiones tomé y cuánto cuesta.

El problema

huiro.dev necesita artículos de blog para posicionar en Google. Cada artículo apunta a una keyword específica (por ejemplo: "automatizar cobranza arriendo Chile") y sigue una estructura definida: problema real, flujo manual, flujo automatizado, tecnología, caso real, CTA.

Escribirlos a mano toma entre 2 y 4 horas por artículo. El contenido es repetitivo en estructura pero único en cada industria. Es exactamente el tipo de tarea que se puede automatizar.

La arquitectura

El pipeline tiene 6 nodos en n8n:

Flujo completo del pipeline

Cargando diagrama...

1. Config

Un nodo Code que centraliza toda la configuración:

const GITHUB_OWNER  = 'HUIRO-DEV';
const GITHUB_REPO   = 'huiro-web-t3';
const GITHUB_BRANCH = 'master';
const GITHUB_TOKEN  = 'ghp_...';

Todos los nodos downstream leen apiBase y token de aquí. Cero URLs hardcodeadas en los demás nodos.

2. Cola de temas (topics.json)

Los temas viven en un archivo JSON en el repo:

[
  {
    "slug": "automatizar-cobranza-arriendo-chile",
    "status": "published",
    "keyword": "automatizar cobranza arriendo Chile",
    "industry": "inmobiliaria",
    "angle": "Flujo completo de cobranza automática..."
  },
  {
    "slug": "ia-local-ollama-empresas",
    "status": "queued",
    "keyword": "IA local empresas confidencial Ollama",
    "industry": "legal / general",
    "angle": "Cómo instalar modelos de lenguaje..."
  }
]

El workflow lee este archivo vía la GitHub API, busca el primer tema con status: 'queued' y lo procesa.

3. Generación con Claude

El prompt incluye:

  • Contexto de marca (tono, audiencia, objetivo)
  • Tema específico (slug, keyword, industria, ángulo)
  • Estructura obligatoria (7 secciones)
  • Formato de salida (markdown con frontmatter)

Uso Claude Sonnet 4 (claude-sonnet-4-20250514) porque es más que suficiente para este tipo de contenido y cuesta ~$0.05 por artículo.

// Costo por artículo:
// Input:  ~1,500 tokens × $3/M  = $0.0045
// Output: ~3,000 tokens × $15/M = $0.045
// Total:  ~$0.05 USD

Con $10 de créditos tengo para ~200 artículos.

4. GitHub: branch + commit + PR

Todo el flujo de GitHub corre en un solo nodo Code usando this.helpers.httpRequest():

// 1. Obtener SHA de master
const shaData = await this.helpers.httpRequest({
  method: 'GET',
  url: `${apiBase}/git/ref/heads/master`,
  headers: { Authorization: `Bearer ${token}` },
  json: true
});

// 2. Crear branch
await this.helpers.httpRequest({
  method: 'POST',
  url: `${apiBase}/git/refs`,
  headers,
  body: {
    ref: `refs/heads/guide/${slug}`,
    sha: shaData.object.sha
  },
  json: true
});

// 3. Commit del archivo
await this.helpers.httpRequest({
  method: 'PUT',
  url: `${apiBase}/contents/content/guides/${slug}.md`,
  headers,
  body: {
    message: `feat(guides): add article '${slug}'`,
    content: Buffer.from(article).toString('base64'),
    branch: `guide/${slug}`
  },
  json: true
});

// 4. Crear PR
const pr = await this.helpers.httpRequest({
  method: 'POST',
  url: `${apiBase}/pulls`,
  headers,
  body: {
    title: `Nueva guía: ${slug}`,
    head: `guide/${slug}`,
    base: 'master'
  },
  json: true
});

Consolidé las 4 operaciones en un solo nodo en lugar de 4 nodos HTTP separados. Más fácil de debuggear y los errores tienen contexto.

5. Notificación

Un email con el link al PR. Hago merge manualmente después de revisar el artículo.

El sistema de contenido en Next.js

Los artículos son archivos .md con frontmatter YAML en content/guides/. Al build time, Next.js los lee y genera las páginas estáticas:

function loadGuides(): Guide[] {
  const guidesDir = path.join(process.cwd(), 'content/guides');
  const topicsPath = path.join(guidesDir, 'topics.json');
  const topics = JSON.parse(fs.readFileSync(topicsPath, 'utf-8'));

  return topics
    .filter(t => t.status === 'published')
    .map(topic => {
      const raw = fs.readFileSync(`${guidesDir}/${topic.slug}.md`, 'utf-8');
      const { meta, content } = parseFrontmatter(raw);
      return { slug: topic.slug, ...meta, content };
    });
}

No hay base de datos, no hay CMS. Solo archivos en el repo.

Lo que aprendí

  • n8n Code nodes no tienen fetch() — hay que usar this.helpers.httpRequest(). Me costó 3 intentos descubrirlo.
  • Repos privados no sirven con raw.githubusercontent.com — necesitas la GitHub API con token.
  • El plan "Evaluation" de Anthropic no permite API calls aunque tengas créditos. Necesitas el plan Build.
  • Consolidar nodos HTTP en Code nodes simplifica el workflow y mejora el debugging.

Lo que falta

  • Auto-merge + deploy: ahora hago merge manual. Podría agregar un webhook que dispare deploy.sh al hacer merge.
  • Validación del markdown: a veces Claude genera frontmatter con comillas mal escapadas.
  • Actualización automática de topics.json: el status debería pasar a published automáticamente después del merge.

Takeaways

  • Un pipeline de contenido SEO automatizado cuesta ~$0.05 por artículo con Claude Sonnet.
  • n8n es suficiente para orquestar todo sin escribir un backend dedicado.
  • La clave es tener una cola de temas bien definida — el prompt hace el resto.
  • Con 6 temas en cola y un artículo por semana, tengo 6 semanas de contenido sin tocar nada.

¿Quieres armar algo similar? El código del workflow está en docker/n8n/workflows/guide-generator-workflow.json en el repo.

huiro.dev

¿Necesitas algo así para tu empresa?

Automatización, desarrollo a medida o infraestructura. Diagnóstico gratuito de 30 minutos.