¿Cómo crear un informe diario de posicionamiento SEO en n8n?
El seguimiento manual de posiciones es una tarea repetitiva que consume mucho tiempo: extraer los datos, pegarlos en una hoja, compararlos con los de ayer y vuelta a empezar. Esta definición explica cómo n8n conecta SEMrush, Google Sheets y Slack en un único flujo de trabajo automatizado que se encarga de todo el proceso con una programación diaria. Si quieres dejar de hacerlo a mano, este es el punto de partida.
Colaboración de
SaaS Hackers
Respuesta rápida: Puedes crear un informe diario de posiciones SEO en n8n conectando la API de SEMrush para obtener los datos de posición de las palabras clave de forma programada, añadiendo un paso de detección de cambios que señale las variaciones de ranking y enviando un resumen con formato a Slack. Todo el flujo se ejecuta automáticamente, sin exportaciones manuales ni malabares con hojas de cálculo.
El seguimiento de posiciones es una de esas tareas que, si se hace a mano, se come entre 20 y 30 minutos cada mañana. Extraer los datos de SEMrush, pegarlos en una hoja, compararlos con los de ayer, destacar los cambios y enviar un resumen al equipo. Este tutorial te enseña a crear todo ese proceso dentro de n8n para que se ejecute solo, cada día, antes de que te hayas tomado el café.
Al terminar, tendrás un flujo de trabajo que extrae las posiciones de las palabras clave de SEMrush cada día, detecta los cambios de posición respecto a los datos del día anterior y envía un informe limpio a un canal de Slack.
Lo que necesitas antes de empezar
- Una instancia de n8n (autoalojada o n8n Cloud)
- Una clave de API de SEMrush (disponible en cualquier plan de pago de SEMrush)
- Un espacio de trabajo de Slack con un token de bot y un canal para los informes
- Una hoja de Google Sheets para almacenar el histórico de posiciones (funciona como memoria persistente entre ejecuciones)
Paso 1: configura el Schedule Trigger
Todo informe automatizado empieza con un disparador. En n8n, abre un nuevo flujo de trabajo y añade un nodo Schedule Trigger.
Configúralo para que se ejecute una vez al día. Una buena opción por defecto son las 07:00 de tu zona horaria, para que el informe llegue a Slack antes de que tu equipo empiece la reunión diaria de la mañana.
Ajustes que debes aplicar:
- Intervalo del disparador: Days
- Ejecutar cada: 1
- A la hora: 7
- En el minuto: 0
Guarda el nodo. Es el latido de todo tu flujo de trabajo.
Paso 2: extrae las posiciones de las palabras clave de SEMrush
Añade un nodo HTTP Request después del Schedule Trigger. SEMrush ofrece los datos de posiciones a través de su API, y el nodo HTTP Request de n8n gestiona la llamada sin problemas.
Configura el nodo HTTP Request:
- Método:
GET - URL:
https://api.semrush.com/ - Parámetros de consulta (añade cada uno como un campo independiente):
type=domain_ranks(ophrase_organicpara datos a nivel de palabra clave)key= tu clave de API de SEMrushdomain= el dominio que estás monitorizandodatabase= la base de datos de tu país objetivo (p. ej.,uspara EE. UU.)export_columns=Ph,Po,Nq,Cp,Ur(Phrase, Position, Search Volume, CPC, URL)
Para el seguimiento de posiciones a nivel de palabra clave, usa type=phrase_organic y añade un parámetro phrase para cada palabra clave. Si monitorizas una lista de palabras clave, las recorrerás con un nodo Split In Batches de n8n (lo vemos en el paso 3).
Cómo es la respuesta:
SEMrush devuelve una respuesta de texto delimitada por punto y coma. Añade un nodo Code después del HTTP Request para convertirla en JSON limpio:
const lines = $input.first().json.data.split('\n');
const headers = lines[0].split(';');
const rows = lines.slice(1).filter(line => line.trim() !== '');
return rows.map(row => {
const values = row.split(';');
const obj = {};
headers.forEach((header, i) => {
obj[header.trim()] = values[i]?.trim();
});
return { json: obj };
});Esto te da un elemento por palabra clave con campos como Keyword, Position, Search Volume y URL.
Paso 3: recorre una lista de palabras clave
Si monitorizas una lista definida de palabras clave en lugar de extraer todas las posiciones de un dominio, guarda esa lista en una hoja de Google Sheets y léela al inicio del flujo de trabajo.
Añade un nodo Google Sheets antes del HTTP Request:
- Operación: Read Rows
- Hoja: tu hoja de seguimiento de palabras clave (p. ej., «Keywords»)
- Rango: A:A (palabras clave en la columna A)
Después añade un nodo Split In Batches para recorrer cada palabra clave y lanzar una llamada independiente a la API de SEMrush por cada una. Establece el tamaño del lote en 1 para mantener los datos limpios y evitar problemas de límite de peticiones.
Conecta: Google Sheets → Split In Batches → HTTP Request → Code (parser)
Paso 4: lee las posiciones de ayer desde Google Sheets
La detección de cambios necesita una referencia. Tu hoja de Google Sheets también sirve como almacén histórico. Después de procesar los datos de hoy, añade otro nodo Google Sheets para leer las posiciones del día anterior.
Estructura tu hoja de seguimiento con estas columnas:
| Date | Keyword | Position | URL | Search Volume |
Ajustes del nodo Google Sheets:
- Operación: Read Rows
- Filtra por fecha: la fecha de ayer (usa una expresión como
{{ $now.minus({days: 1}).toFormat('yyyy-MM-dd') }})
Después añade un nodo Merge para unir los datos de hoy con los de ayer en el campo Keyword . Usa el modo Merge by Key con Keyword como campo de coincidencia.
Esto te da un conjunto de datos combinado en el que cada elemento contiene tanto la posición actual como la anterior de la misma palabra clave.
Paso 5: detecta los cambios de posición
Añade un nodo Code después del nodo Merge para calcular el cambio de cada palabra clave y señalar las que se han movido de forma significativa.
return $input.all().map(item => {
const today = parseInt(item.json.Position_today) || 0;
const yesterday = parseInt(item.json.Position_yesterday) || 0;
const change = yesterday - today; // positive = improved, negative = dropped
let status = 'stable';
if (change >= 3) status = 'improved';
if (change <= -3) status = 'dropped';
return {
json: {
keyword: item.json.Keyword,
position_today: today,
position_yesterday: yesterday,
change: change,
status: status,
url: item.json.URL_today
}
};
});Puedes ajustar el umbral (ahora está en 3 posiciones) según lo sensibles que quieras que sean tus alertas. Si además quieres mejorar la propia página de destino, estas variaciones de posición suelen señalar páginas que necesitan un mensaje más sólido o cambios orientados a la conversión, por lo que conviene repasar estas buenas prácticas y ejemplos de landing pages para SaaS junto con tu flujo de trabajo de SEO.
Paso 6: guarda los datos de hoy en Google Sheets
Antes de enviar el informe, guarda las posiciones de hoy para que sean la referencia de mañana.
Añade un nodo Google Sheets:
- Operación: Append Row
- Asigna los campos: Date (la fecha de hoy), Keyword, Position, URL, Search Volume
Este paso se ejecuta después de la detección de cambios, de modo que siempre tengas un histórico diario acumulado.
Paso 7: da formato y envía el informe a Slack
Añade un nodo Code para construir el mensaje de Slack. Un buen informe separa las palabras clave que han mejorado, las que han bajado y las estables, para que el lector pueda revisarlo en menos de 30 segundos.
const items = $input.all().map(i => i.json);
const improved = items.filter(i => i.status === 'improved');
const dropped = items.filter(i => i.status === 'dropped');
const formatRow = (i) =>
`• *${i.keyword}*: ${i.position_today} (was ${i.position_yesterday}, ${i.change > 0 ? '+' : ''}${i.change})`;
const message = [
`*Daily SEO Rank Report – ${new Date().toDateString()}*`,
'',
improved.length > 0 ? `*Improved (${improved.length})*\n${improved.map(formatRow).join('\n')}` : '',
dropped.length > 0 ? `*Dropped (${dropped.length})*\n${dropped.map(formatRow).join('\n')}` : '',
`_${items.length} keywords tracked_`
].filter(Boolean).join('\n');
return [{ json: { message } }];Después añade un nodo Slack:
- Resource: Message
- Operation: Send
- Canal: tu canal de informes (p. ej.,
#seo-reports) - Texto:
{{ $json.message }}
Paso 8: añade un gestor de errores
Todo flujo de trabajo en producción necesita un plan de respaldo. Añade un nodo Error Trigger y conéctalo a un segundo nodo de Slack que publique en un canal #workflow-errors si falla algún paso.
Así evitas los fallos silenciosos en los que el informe simplemente no llega y nadie se entera hasta que las posiciones ya han cambiado.
Cómo queda el flujo de trabajo terminado
Schedule Trigger (07:00 daily)
→ Google Sheets (read keyword list)
→ Split In Batches
→ HTTP Request (SEMrush API)
→ Code (parse response)
→ Google Sheets (read yesterday's data)
→ Merge (by keyword)
→ Code (change detection)
→ Google Sheets (append today's data)
→ Code (format Slack message)
→ Slack (send report)Total de nodos: 10-11 según cómo configures el gestor de errores. Tiempo de montaje para alguien familiarizado con n8n: unos 90 minutos en el primer intento.
Problemas comunes y cómo solucionarlos
SEMrush devuelve datos vacíos
Comprueba que el parámetro database corresponde a la base de datos regional correcta para tu mercado objetivo. Confirma también que tu clave de API tiene unidades suficientes. Cada consulta de palabra clave consume créditos de API.
El nodo Merge no devuelve coincidencias
Normalmente significa que el formato de fecha no es coherente entre el paso de escritura y el de lectura. Fija el formato en yyyy-MM-dd en todo el flujo usando $now.toFormat('yyyy-MM-dd').
El mensaje de Slack es demasiado largo
Slack bloquea los mensajes de más de 4000 caracteres. Si monitorizas más de 50-60 palabras clave, filtra la salida de Slack para mostrar solo las que hayan cambiado 5 posiciones o más, y enlaza a la hoja de Google Sheets completa para ver el panorama entero.
Límite de peticiones de SEMrush
Añade un nodo Wait (configurado en 1 segundo) entre los lotes de tu bucle Split In Batches. La API de SEMrush admite ráfagas, pero si las peticiones rápidas se mantienen en el tiempo devolverá errores 429.
Cómo ampliar este flujo de trabajo
Cuando el flujo básico funcione de forma fiable, tres ampliaciones aportan un valor real:
Resumen semanal: Añade un segundo Schedule Trigger programado los lunes que lea los últimos 7 días de datos de Google Sheets y envíe un resumen semanal de tendencias junto con el informe diario.
Solo alertas por umbral: Duplica el flujo de trabajo y elimina el resumen diario. Configura esta versión para que solo active el nodo de Slack cuando una palabra clave baje más de 5 posiciones en un solo día. Es útil para el monitoreo de cara al cliente, donde importa la relación señal-ruido.
Conexión con Google Looker Studio: Tu hoja de Google Sheets ya está estructurada como una tabla de datos limpia. Conéctala a Looker Studio (gratis) y crea un gráfico de tendencia de posiciones en vivo que se actualice automáticamente cada mañana.
Preguntas frecuentes
¿Qué hace un flujo de trabajo de n8n para el informe diario de posiciones SEO?
Extrae los datos de posición de las palabras clave de SEMrush con una programación diaria automática, compara la posición actual de cada palabra clave con los datos del día anterior almacenados en Google Sheets, identifica los cambios de ranking significativos y envía un resumen con formato a un canal de Slack. Una vez configurado, el flujo funciona sin ninguna intervención manual.
¿Necesito saber programar para crear esto en n8n?
No, pero debes sentirte cómodo leyendo y editando JavaScript básico. Los nodos Code de este flujo de trabajo usan métodos de arrays sencillos. Si puedes seguir los ejemplos anteriores y ajustar los nombres de las variables, puedes crear este flujo. Los nodos HTTP Request, Google Sheets y Slack se configuran simplemente haciendo clic.
¿Cuánto cuesta ejecutar este flujo de trabajo cada día?
El precio de n8n Cloud empieza en torno a 20 $ al mes. Los costes de la API de SEMrush dependen de tu plan y del volumen de palabras clave. Cada consulta de phrase_organic cuesta 10 unidades de API. Monitorizar 50 palabras clave al día usa 500 unidades, una cifra que cabe de sobra en la mayoría de los planes de pago de SEMrush. Slack y Google Sheets son gratuitos para este uso.
¿Puedo usar otra API de seguimiento de posiciones en lugar de SEMrush?
Sí. DataForSEO y Bright Data tienen APIs REST que funcionan con el nodo HTTP Request de n8n siguiendo el mismo patrón de este tutorial. Tendrás que ajustar el paso de análisis del nodo Code al formato de respuesta de la API que elijas.
¿Qué pasa si el workflow falla durante la noche?
El nodo Error Trigger del final del workflow detecta cualquier fallo y envía una alerta de Slack a tu canal de errores. Sin ese nodo, los fallos pasan desapercibidos. Añade siempre gestión de errores a los workflows programados antes de considerarlos listos para producción.
¿Este workflow sirve para que una agencia lo use con varios clientes?
Con algunas modificaciones, sí. La opción más sencilla es duplicar el workflow una vez por cliente y cambiar el dominio, la hoja de palabras clave y el canal de Slack. Una configuración más avanzada usa un único workflow que lee una hoja de configuración de clientes y recorre de forma dinámica los ajustes de cada uno. Si llegas al punto de necesitar ayuda externa para escalar los informes de SEO, la automatización o sistemas de crecimiento más amplios, en SaaS Hackers también puedes encontrar un experto o consultar agencias de SEO para B2B SaaS verificadas que te ayuden con la implementación.
Colaboración de
SaaS Hackers


