Ir para o conteúdo

Como criar um relatório diário de posições de SEO no n8n?

O acompanhamento manual de rankings é um desgaste repetitivo: extrair os dados, colar em uma planilha, comparar com o dia anterior e recomeçar. Esta definição mostra como o n8n conecta SEMrush, Google Sheets e Slack em um único workflow automatizado que cuida de todo o processo em uma programação diária. Se você quer parar de fazer isso manualmente, comece por aqui.

Contribuição de

SaaS Hackers
Blog

Resposta rápida: você pode criar um relatório diário de ranking de SEO no n8n conectando a API do SEMrush para extrair dados de posição de palavras-chave de forma programada, executando uma etapa de detecção de mudanças para sinalizar variações de ranking e enviando um resumo formatado para o Slack. O workflow inteiro roda automaticamente, sem exportações manuais nem malabarismos com planilhas.

O acompanhamento de rankings é uma daquelas tarefas que consomem de 20 a 30 minutos toda manhã quando feitas manualmente. Extrair dados do SEMrush, colar em uma planilha, comparar com o dia anterior, destacar o que mudou e enviar um resumo para o time. Este tutorial mostra como montar todo esse processo no n8n para que ele rode sozinho, todos os dias, antes mesmo de você tomar seu café.

No final, você terá um workflow funcionando que extrai os rankings de palavras-chave do SEMrush em uma programação diária, detecta mudanças de posição em relação aos dados do dia anterior e envia um relatório limpo para um canal do Slack.

O que você precisa antes de começar

  • Uma instância do n8n (auto-hospedada ou n8n Cloud)
  • Uma chave de API do SEMrush (disponível em qualquer plano pago do SEMrush)
  • Um workspace do Slack com um token de bot e um canal para os relatórios
  • Uma planilha do Google Sheets para armazenar o histórico de rankings (funciona como a memória persistente entre as execuções)

Etapa 1: configure o Schedule Trigger

Todo relatório automatizado começa com um gatilho. No n8n, abra um novo workflow e adicione um nó Schedule Trigger.

Configure-o para rodar uma vez por dia. Um bom padrão é às 07:00 no seu fuso horário local, para que o relatório chegue ao Slack antes da daily do seu time.

Configurações a aplicar:

  • Intervalo do gatilho: Days
  • Executar a cada: 1
  • Na hora: 7
  • No minuto: 0

Salve o nó. Ele é o coração de todo o seu workflow.

Etapa 2: extraia os rankings de palavras-chave do SEMrush

Adicione um nó HTTP Request depois do Schedule Trigger. O SEMrush expõe os dados de ranking pela API, e o nó HTTP Request do n8n faz a chamada sem complicação.

Configure o nó HTTP Request:

  • Método: GET
  • URL: https://api.semrush.com/
  • Parâmetros de consulta (adicione cada um como um campo separado):
    • type = domain_ranks (ou phrase_organic para dados no nível da palavra-chave)
    • key = sua chave de API do SEMrush
    • domain = o domínio que você está acompanhando
    • database = o banco de dados do país de destino (por exemplo, us para os EUA)
    • export_columns = Ph,Po,Nq,Cp,Ur (Phrase, Position, Search Volume, CPC, URL)

Para acompanhar a posição no nível da palavra-chave, use type=phrase_organic e adicione um parâmetro phrase para cada palavra-chave. Se você acompanha uma lista de palavras-chave, será preciso percorrê-las com um nó n8n Split In Batches (abordado na Etapa 3).

Como é a resposta:

O SEMrush retorna uma resposta em texto delimitado por ponto e vírgula. Adicione um nó Code depois do HTTP Request para convertê-la em um JSON limpo:

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 };
});

Isso gera um item por palavra-chave, com campos como Keyword, Position, Search Volume, e URL.

Etapa 3: percorra uma lista de palavras-chave

Se você acompanha uma lista definida de palavras-chave, em vez de extrair todos os rankings de um domínio, guarde essa lista em uma planilha do Google Sheets e leia-a no início do workflow.

Adicione um nó Google Sheets antes do HTTP Request:

  • Operação: Read Rows
  • Planilha: sua planilha de acompanhamento de palavras-chave (por exemplo, "Keywords")
  • Intervalo: A:A (palavras-chave na coluna A)

Depois, adicione um nó Split In Batches para percorrer cada palavra-chave e disparar uma chamada separada à API do SEMrush para cada uma. Defina o tamanho do lote como 1 para manter os dados limpos e evitar problemas de limite de requisições.

Conecte: Google Sheets → Split In Batches → HTTP Request → Code (parser)

Etapa 4: leia os rankings de ontem no Google Sheets

A detecção de mudanças exige uma linha de base. Sua planilha do Google Sheets também serve como armazenamento histórico. Depois de processar os dados de hoje, adicione outro nó Google Sheets para ler os rankings do dia anterior.

Estruture sua planilha de acompanhamento com estas colunas:

| Date | Keyword | Position | URL | Search Volume |

Configurações do nó Google Sheets:

  • Operação: Read Rows
  • Filtrar por data: a data de ontem (use uma expressão como {{ $now.minus({days: 1}).toFormat('yyyy-MM-dd') }})

Depois, adicione um nó Merge para juntar os dados de hoje com os de ontem pelo campo Keyword . Use o modo Merge by Key com Keyword como campo de correspondência.

Isso gera um conjunto de dados combinado em que cada item contém a posição atual e a posição anterior da mesma palavra-chave.

Etapa 5: detecte as mudanças de posição

Adicione um nó Code depois do nó Merge para calcular a variação de cada palavra-chave e sinalizar as que mais se movimentaram.

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
    }
  };
});

Você pode ajustar o limite (atualmente definido em 3 posições) conforme a sensibilidade que quiser para os alertas. Se você também quer melhorar a própria página de destino, essas variações de ranking muitas vezes apontam páginas que precisam de uma mensagem mais forte ou de ajustes focados em conversão, e por isso vale a pena conhecer boas práticas e exemplos de landing pages para SaaS junto com o seu workflow de SEO.

Etapa 6: grave os dados de hoje de volta no Google Sheets

Antes de enviar o relatório, salve os rankings de hoje para que se tornem a linha de base de amanhã.

Adicione um nó Google Sheets:

  • Operação: Append Row
  • Mapeie os campos: Date (data de hoje), Keyword, Position, URL, Search Volume

Esse nó roda depois da etapa de detecção de mudanças, para que você sempre tenha um histórico diário contínuo.

Etapa 7: formate e envie o relatório para o Slack

Adicione um nó Code para montar a mensagem do Slack. Um bom relatório separa as palavras-chave que subiram, as que caíram e as estáveis, para que o leitor consiga ler tudo em 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 } }];

Depois, adicione um nó Slack:

  • Recurso: Message
  • Operação: Send
  • Canal: seu canal de relatórios (por exemplo, #seo-reports)
  • Texto: {{ $json.message }}

Etapa 8: adicione um tratamento de erros

Todo workflow em produção precisa de um plano B. Adicione um nó Error Trigger e conecte-o a um segundo nó do Slack que publique em um canal #workflow-errors caso alguma etapa falhe.

Isso evita falhas silenciosas, em que o relatório simplesmente não chega e ninguém percebe até que os rankings já tenham mudado.

Como fica o workflow finalizado

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 nós: 10 a 11, dependendo de como você configurar o tratamento de erros. Tempo de montagem para quem já conhece o n8n: cerca de 90 minutos na primeira tentativa.

Problemas comuns e como resolvê-los

O SEMrush retorna dados vazios
Verifique se o parâmetro database corresponde ao banco de dados regional correto para o seu mercado-alvo. Confirme também se a sua chave de API tem unidades suficientes. Cada consulta de palavra-chave consome créditos de API.

O nó Merge não encontra correspondências
Em geral, isso significa que o formato de data está inconsistente entre a etapa de gravação e a de leitura. Fixe o formato em yyyy-MM-dd em todo o workflow usando $now.toFormat('yyyy-MM-dd').

A mensagem do Slack está longa demais
O Slack bloqueia mensagens acima de 4.000 caracteres. Se você acompanha mais de 50 a 60 palavras-chave, filtre a saída do Slack para mostrar apenas as palavras-chave com variação de 5 posições ou mais e inclua um link para a planilha completa, para uma visão total.

Limite de requisições do SEMrush
Adicione um nó Wait (configurado para 1 segundo) entre os lotes do seu loop Split In Batches. A API do SEMrush aceita picos de requisições, mas uma sequência rápida e contínua retornará erros 429.

Como ampliar este workflow

Quando o workflow principal estiver rodando de forma confiável, três extensões agregam valor real:

Resumo semanal: adicione um segundo Schedule Trigger programado para as segundas-feiras, que leia os dados dos últimos 7 dias do Google Sheets e envie um resumo semanal de tendências junto com o relatório diário.

Somente alertas por limite: duplique o workflow e remova o resumo diário. Configure esta versão para disparar o nó do Slack apenas quando uma palavra-chave cair mais de 5 posições em um único dia. Use-a no monitoramento voltado a clientes, em que a relação sinal-ruído importa.

Conexão com o Google Looker Studio: sua planilha do Google Sheets já está estruturada como uma tabela de dados limpa. Conecte-a ao Looker Studio (gratuito) e crie um gráfico de tendência de ranking ao vivo, atualizado automaticamente toda manhã.

Perguntas frequentes

O que faz um workflow de relatório diário de ranking de SEO no n8n?
Ele extrai dados de posição de palavras-chave do SEMrush em uma programação diária automatizada, compara a posição atual de cada palavra-chave com os dados do dia anterior armazenados no Google Sheets, identifica mudanças significativas de ranking e envia um resumo formatado para um canal do Slack. Depois de configurado, o workflow roda sem nenhuma intervenção manual.

Preciso saber programar para criar isso no n8n?
Não, mas você precisa se sentir à vontade para ler e editar JavaScript básico. Os nós Code deste workflow usam métodos de array simples. Se você consegue acompanhar os exemplos acima e ajustar nomes de variáveis, consegue montar este workflow. Os nós HTTP Request, Google Sheets e Slack são todos configurados apenas com cliques.

Quanto custa rodar este workflow diariamente?
O n8n Cloud custa a partir de cerca de US$ 20 por mês. Os custos da API do SEMrush dependem do seu plano e do volume de palavras-chave. Cada consulta phrase_organic custa 10 unidades de API. Acompanhar 50 palavras-chave por dia usa 500 unidades, o que cabe com folga na maioria dos planos pagos do SEMrush. Slack e Google Sheets são gratuitos para este caso de uso.

Posso usar outra API de rank tracking em vez do SEMrush?
Sim. DataForSEO e Bright Data têm APIs REST que funcionam com o nó HTTP Request do n8n no mesmo padrão mostrado neste tutorial. A etapa de parsing no nó Code precisará de ajustes para corresponder ao formato de resposta da API que você escolher.

O que acontece se o workflow falhar durante a noite?
O nó Error Trigger no final do workflow captura qualquer falha e envia um alerta no Slack para o seu canal de erros. Sem esse nó, as falhas passam em silêncio. Sempre adicione tratamento de erros aos workflows agendados antes de considerá-los prontos para produção.

Este workflow serve para uso por agências com vários clientes?
Com algumas adaptações, sim. A abordagem mais simples é duplicar o workflow para cada cliente e trocar o domínio, a planilha de palavras-chave e o canal do Slack. Uma configuração mais avançada usa um único workflow que lê uma planilha de configuração de clientes e percorre dinamicamente as definições de cada um. Se chegar o momento em que você precisar de ajuda externa para escalar relatórios de SEO, automação ou sistemas de crescimento mais amplos, o SaaS Hackers também permite que você encontre um especialista ou veja agências de SEO para B2B SaaS verificadas para apoiar a implementação.

Contribuição de

SaaS Hackers

Encontre um especialista em B2B SaaS

Reunimos um diretório de especialistas e agências de B2B SaaS que avaliamos e categorizamos por serviço e especialização para você analisar.

Encontre um especialista
Ver tudo