Aller au contenu

Comment créer un rapport quotidien de positionnement SEO dans n8n ?

Le suivi manuel des positions est une corvée répétitive : récupérer les données, les coller dans un tableur, les comparer à celles de la veille, puis recommencer. Cette définition explique comment n8n relie SEMrush, Google Sheets et Slack dans un seul workflow automatisé qui gère tout le processus chaque jour, à heure fixe. Si vous voulez arrêter de le faire à la main, c'est par ici que tout commence.

Contribution de

SaaS Hackers
Blog

Réponse rapide : vous pouvez créer un rapport quotidien de positionnement SEO dans n8n en connectant l'API de SEMrush pour récupérer les positions des mots-clés à intervalle régulier, en ajoutant une étape de détection des changements pour repérer les variations de classement, puis en envoyant un résumé mis en forme sur Slack. Le workflow s'exécute automatiquement, sans export manuel ni jonglerie avec les tableurs.

Le suivi des positions est le genre de tâche qui prend 20 à 30 minutes chaque matin quand on le fait à la main. Récupérer les données de SEMrush, les coller dans un tableur, les comparer à celles de la veille, repérer les mouvements, envoyer un résumé à l'équipe. Ce tutoriel vous montre comment construire tout ce processus dans n8n pour qu'il tourne tout seul, chaque jour, avant même votre premier café.

À la fin, vous disposerez d'un workflow fonctionnel qui récupère chaque jour les positions des mots-clés depuis SEMrush, détecte les variations par rapport aux données de la veille et publie un rapport clair dans un canal Slack.

Ce qu'il vous faut avant de commencer

  • Une instance n8n (auto-hébergée ou n8n Cloud)
  • Une clé d'API SEMrush (disponible avec n'importe quel abonnement SEMrush payant)
  • Un espace de travail Slack avec un token de bot et un canal dédié aux rapports
  • Un Google Sheet pour stocker l'historique des positions (il sert de mémoire persistante entre deux exécutions)

Étape 1 : configurer le déclencheur planifié

Tout rapport automatisé commence par un déclencheur. Dans n8n, ouvrez un nouveau workflow et ajoutez un nœud Schedule Trigger.

Configurez-le pour qu'il s'exécute une fois par jour. Une bonne valeur par défaut est 07:00 dans votre fuseau horaire, afin que le rapport arrive dans Slack avant le point d'équipe du matin.

Paramètres à appliquer :

  • Intervalle du déclencheur : Days
  • Exécuter toutes les : 1
  • À l'heure : 7
  • À la minute : 0

Enregistrez le nœud. C'est le cœur de tout votre workflow.

Étape 2 : récupérer les positions des mots-clés depuis SEMrush

Ajoutez un nœud HTTP Request après le Schedule Trigger. SEMrush expose les données de positionnement via son API, et le nœud HTTP Request de n8n gère très bien l'appel.

Configurez le nœud HTTP Request :

  • Méthode : GET
  • URL : https://api.semrush.com/
  • Paramètres de requête (ajoutez chacun dans un champ distinct) :
    • type = domain_ranks (ou phrase_organic pour des données au niveau du mot-clé)
    • key = votre clé d'API SEMrush
    • domain = le domaine que vous suivez
    • database = la base de données du pays ciblé (par ex. us pour les États-Unis)
    • export_columns = Ph,Po,Nq,Cp,Ur (Phrase, Position, Search Volume, CPC, URL)

Pour suivre la position au niveau du mot-clé, utilisez type=phrase_organic et ajoutez un paramètre phrase pour chaque mot-clé. Si vous suivez une liste de mots-clés, vous la parcourrez avec un nœud n8n Split In Batches nœud (traité à l'étape 3).

À quoi ressemble la réponse :

SEMrush renvoie une réponse textuelle délimitée par des points-virgules. Ajoutez un nœud Code après le HTTP Request pour la convertir en JSON propre :

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

Vous obtenez un élément par mot-clé, avec des champs comme Keyword, Position, Search Volume, et URL.

Étape 3 : parcourir une liste de mots-clés

Si vous suivez une liste définie de mots-clés plutôt que l'ensemble des positions d'un domaine, stockez cette liste dans un Google Sheet et lisez-la au début du workflow.

Ajoutez un nœud Google Sheets avant le HTTP Request :

  • Opération : Read Rows
  • Feuille : votre feuille de suivi des mots-clés (par ex. « Keywords »)
  • Plage : A:A (mots-clés dans la colonne A)

Ajoutez ensuite un nœud Split In Batches pour parcourir chaque mot-clé et lancer un appel distinct à l'API SEMrush par mot-clé. Définissez la taille de lot sur 1 pour garder des données propres et éviter les problèmes de limite de débit.

Connexion : Google Sheets → Split In Batches → HTTP Request → Code (parseur)

Étape 4 : lire les positions de la veille dans Google Sheets

La détection des changements nécessite un point de référence. Votre Google Sheet sert aussi d'historique. Après avoir analysé les données du jour, ajoutez un autre nœud Google Sheets pour lire les positions de la veille.

Structurez votre feuille de suivi avec ces colonnes :

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

Paramètres du nœud Google Sheets :

  • Opération : Read Rows
  • Filtrer par date : la date d'hier (utilisez une expression comme {{ $now.minus({days: 1}).toFormat('yyyy-MM-dd') }})

Ajoutez ensuite un nœud Merge pour joindre les données du jour à celles de la veille sur le champ Keyword Utilisez le mode Merge by Key avec Keyword comme champ de correspondance.

Vous obtenez un jeu de données combiné où chaque élément contient à la fois la position actuelle et la position précédente du même mot-clé.

Étape 5 : détecter les changements de position

Ajoutez un nœud Code après le nœud Merge pour calculer la variation de chaque mot-clé et signaler les mouvements significatifs.

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

Vous pouvez ajuster le seuil (actuellement fixé à 3 positions) selon la sensibilité souhaitée pour vos alertes. Si vous voulez aussi améliorer la page de destination elle-même, ces variations de classement révèlent souvent des pages qui ont besoin d'un message plus fort ou de mises à jour axées sur la conversion. C'est pourquoi il vaut la peine de consulter ces bonnes pratiques et exemples de landing pages SaaS en parallèle de votre workflow SEO.

Étape 6 : réécrire les données du jour dans Google Sheets

Avant d'envoyer le rapport, enregistrez les positions du jour pour qu'elles servent de référence demain.

Ajoutez un nœud Google Sheets :

  • Opération : Append Row
  • Associez les champs : Date (date du jour), Keyword, Position, URL, Search Volume

Cette étape s'exécute après la détection des changements, de sorte que vous disposez toujours d'un historique quotidien glissant.

Étape 7 : mettre en forme et envoyer le rapport Slack

Ajoutez un nœud Code pour construire le message Slack. Un bon rapport sépare les mots-clés en progression, en baisse et stables, pour que le lecteur puisse le parcourir en moins de 30 secondes.

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

Ajoutez ensuite un nœud Slack :

  • Ressource : Message
  • Opération : Send
  • Canal : votre canal de reporting (par ex. #seo-reports)
  • Texte : {{ $json.message }}

Étape 8 : ajouter un gestionnaire d'erreurs

Tout workflow en production a besoin d'un plan B. Ajoutez un nœud Error Trigger et connectez-le à un second nœud Slack qui publie dans un canal #workflow-errors si une étape échoue.

Cela évite les échecs silencieux, où le rapport n'arrive tout simplement pas et où personne ne s'en aperçoit avant que les positions aient déjà bougé.

À quoi ressemble le workflow terminé

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)

Nombre total de nœuds : 10 à 11 selon la configuration de votre gestionnaire d'erreurs. Temps de mise en place pour une personne qui connaît n8n : environ 90 minutes au premier essai.

Problèmes courants et solutions

SEMrush renvoie des données vides
Vérifiez que le paramètre database correspond à la bonne base de données régionale pour votre marché cible. Vérifiez aussi que votre clé d'API dispose d'assez d'unités. Chaque recherche de mot-clé consomme des crédits d'API.

Le nœud Merge ne renvoie aucune correspondance
Cela signifie généralement que le format de date est incohérent entre l'étape d'écriture et l'étape de lecture. Fixez le format sur yyyy-MM-dd partout en utilisant $now.toFormat('yyyy-MM-dd').

Le message Slack est trop long
Slack bloque les messages de plus de 4 000 caractères. Si vous suivez plus de 50 à 60 mots-clés, filtrez la sortie Slack pour n'afficher que les mots-clés dont la position a changé d'au moins 5 places, et ajoutez un lien vers le Google Sheet complet pour avoir une vue d'ensemble.

Limitation de débit côté SEMrush
Ajoutez un nœud Wait (réglé sur 1 seconde) entre les lots dans votre boucle Split In Batches. L'API de SEMrush tolère les pics de requêtes, mais des requêtes rapides et soutenues renverront des erreurs 429.

Comment étendre ce workflow

Une fois que le workflow de base fonctionne de façon fiable, trois extensions apportent une vraie valeur :

Résumé hebdomadaire : ajoutez un second Schedule Trigger réglé sur le lundi, qui lit les 7 derniers jours de données dans Google Sheets et envoie un résumé hebdomadaire des tendances en plus du rapport quotidien.

Alertes sur seuil uniquement : dupliquez le workflow et supprimez le résumé quotidien. Configurez cette version pour qu'elle ne déclenche le nœud Slack que lorsqu'un mot-clé perd plus de 5 positions en une seule journée. Utilisez-la pour un suivi destiné aux clients, où le rapport signal/bruit compte.

Connexion à Google Looker Studio : votre Google Sheet est déjà structuré comme un tableau de données propre. Connectez-le à Looker Studio (gratuit) et créez un graphique en direct de l'évolution des positions, mis à jour automatiquement chaque matin.

FAQ

À quoi sert un workflow n8n de rapport quotidien de positionnement SEO ?
Il récupère les positions des mots-clés depuis SEMrush selon un calendrier quotidien automatisé, compare la position actuelle de chaque mot-clé aux données de la veille stockées dans Google Sheets, identifie les changements de classement significatifs et envoie un résumé mis en forme dans un canal Slack. Une fois configuré, le workflow tourne sans aucune intervention manuelle.

Faut-il savoir coder pour créer ce workflow dans n8n ?
Non, mais vous devez être à l'aise pour lire et modifier du JavaScript de base. Les nœuds Code de ce workflow utilisent des méthodes de tableau simples. Si vous savez suivre les exemples ci-dessus et adapter les noms de variables, vous pouvez créer ce workflow. Les nœuds HTTP Request, Google Sheets et Slack se configurent entièrement par simple pointer-cliquer.

Combien coûte l'exécution quotidienne de ce workflow ?
Les tarifs de n8n Cloud démarrent à environ 20 $/mois. Les coûts de l'API SEMrush dépendent de votre abonnement et du volume de mots-clés. Chaque recherche phrase_organic coûte 10 unités d'API. Suivre 50 mots-clés par jour consomme 500 unités, ce qui reste largement dans les limites de la plupart des abonnements SEMrush payants. Slack et Google Sheets sont gratuits pour cet usage.

Puis-je utiliser une autre API de suivi de positionnement que SEMrush ?
Oui. DataForSEO et Bright Data disposent toutes deux d'API REST compatibles avec le nœud HTTP Request de n8n, selon le même schéma que dans ce tutoriel. L'étape d'analyse dans le nœud Code devra être adaptée au format de réponse de l'API que vous choisirez.

Que se passe-t-il si le workflow échoue pendant la nuit ?
Le nœud Error Trigger placé à la fin du workflow détecte toute défaillance et envoie une alerte Slack sur votre canal d'erreurs. Sans ce nœud, les échecs passent inaperçus. Ajoutez toujours une gestion des erreurs aux workflows planifiés avant de les considérer comme prêts pour la production.

Ce workflow convient-il à une agence qui gère plusieurs clients ?
Oui, avec quelques adaptations. L'approche la plus simple consiste à dupliquer le workflow pour chaque client et à changer le domaine, la feuille de mots-clés et le canal Slack. Une configuration plus avancée utilise un seul workflow qui lit une feuille de configuration des clients et parcourt dynamiquement les paramètres de chacun. Si vous avez besoin d'une aide extérieure pour développer votre reporting SEO, votre automatisation ou vos systèmes de croissance au sens large, SaaS Hackers vous permet aussi de trouver un expert ou de parcourir des agences SEO B2B SaaS sélectionnées pour vous accompagner dans la mise en œuvre.

Contribution de

SaaS Hackers

Trouver un expert B2B SaaS

Nous avons constitué un annuaire d'experts et d'agences B2B SaaS que nous avons évalués et classés par service et par spécialité, pour que vous puissiez les consulter.

Trouver un expert
Tout voir