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
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 USDCon $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 usarthis.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.shal 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
publishedautomá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.
