Wie erstellen Sie in n8n einen täglichen SEO-Ranking-Report?
Manuelles Rank Tracking ist eine zermürbende Routine: Daten abrufen, in eine Tabelle einfügen, mit dem Vortag vergleichen, und das Ganze von vorn. Diese Definition zeigt, wie n8n SEMrush, Google Sheets und Slack zu einem einzigen automatisierten Workflow verbindet, der den gesamten Prozess täglich nach Zeitplan erledigt. Wenn Sie das nicht mehr von Hand machen möchten, ist das der richtige Einstieg.
Beitrag von
SaaS Hackers
Kurzantwort: Sie können in n8n einen täglichen SEO-Ranking-Report erstellen, indem Sie die SEMrush-API anbinden, die Keyword-Positionen nach Zeitplan abrufen, in einem Schritt zur Änderungserkennung Ranking-Verschiebungen markieren und eine formatierte Zusammenfassung an Slack senden. Der gesamte Workflow läuft automatisch, ohne manuelle Exporte oder aufwendige Tabellenarbeit.
Rank Tracking gehört zu den Aufgaben, die jeden Morgen 20 bis 30 Minuten kosten, wenn Sie sie manuell erledigen. Daten aus SEMrush abrufen, in eine Tabelle einfügen, mit dem Vortag vergleichen, die größten Veränderungen markieren, dem Team eine Zusammenfassung schicken. Dieses Tutorial zeigt Ihnen, wie Sie den gesamten Prozess in n8n aufbauen, sodass er jeden Tag von allein läuft, noch bevor Sie Ihren Kaffee getrunken haben.
Am Ende haben Sie einen funktionierenden Workflow, der täglich nach Zeitplan Keyword-Rankings aus SEMrush abruft, Positionsänderungen gegenüber den Daten des Vortags erkennt und einen übersichtlichen Report in einen Slack-Kanal sendet.
Was Sie vor dem Start brauchen
- Eine n8n-Instanz (selbst gehostet oder n8n Cloud)
- Ein SEMrush-API-Schlüssel (in jedem kostenpflichtigen SEMrush-Tarif verfügbar)
- Ein Slack-Workspace mit Bot-Token und einem Kanal für das Reporting
- Ein Google Sheet zur Speicherung der historischen Ranking-Daten (dient als dauerhafter Speicher zwischen den Durchläufen)
Schritt 1: Den Schedule Trigger einrichten
Jeder automatisierte Report beginnt mit einem Trigger. Öffnen Sie in n8n einen neuen Workflow und fügen Sie einen Schedule Trigger-Node hinzu.
Konfigurieren Sie ihn so, dass er einmal pro Tag läuft. Eine gute Standardeinstellung ist 07:00 Uhr in Ihrer lokalen Zeitzone, damit der Report in Slack ankommt, bevor Ihr Team in das morgendliche Stand-up startet.
Einzustellende Werte:
- Trigger-Intervall: Tage
- Ausführung alle: 1
- Zur Stunde: 7
- Zur Minute: 0
Speichern Sie den Node. Er ist der Taktgeber Ihres gesamten Workflows.
Schritt 2: Keyword-Rankings aus SEMrush abrufen
Fügen Sie nach dem Schedule Trigger einen HTTP Request-Node hinzu. SEMrush stellt Ranking-Daten über seine API bereit, und der HTTP-Request-Node von n8n wickelt den Aufruf sauber ab.
HTTP-Request-Node konfigurieren:
- Methode:
GET - URL:
https://api.semrush.com/ - Abfrageparameter (jeweils als eigenes Feld hinzufügen):
type=domain_ranks(oderphrase_organicfür Daten auf Keyword-Ebene)key= Ihr SEMrush-API-Schlüsseldomain= die Domain, die Sie trackendatabase= Ihre Ziel-Länderdatenbank (z. B.usfür die USA)export_columns=Ph,Po,Nq,Cp,Ur(Phrase, Position, Suchvolumen, CPC, URL)
Für das Positions-Tracking auf Keyword-Ebene verwenden Sie type=phrase_organic und fügen für jedes Keyword einen phrase -Parameter hinzu. Wenn Sie eine Liste von Keywords tracken, durchlaufen Sie diese mit einem n8n-Split-In-Batches- Node (siehe Schritt 3).
So sieht die Antwort aus:
SEMrush liefert eine durch Semikolons getrennte Textantwort. Fügen Sie nach dem HTTP Request einen Code-Node hinzu, um sie in sauberes JSON zu parsen:
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 };
});Das ergibt einen Eintrag pro Keyword mit Feldern wie Keyword, Position, Search Volume, und URL.
Schritt 3: Eine Keyword-Liste durchlaufen
Wenn Sie eine festgelegte Keyword-Liste tracken, statt alle Rankings einer Domain abzurufen, speichern Sie Ihre Keyword-Liste in einem Google Sheet und lesen sie zu Beginn des Workflows ein.
Fügen Sie vor dem HTTP Request einen Google Sheets-Node hinzu:
- Operation: Read Rows
- Tabellenblatt: Ihr Keyword-Tracking-Blatt (z. B. „Keywords“)
- Bereich: A:A (Keywords in Spalte A)
Fügen Sie dann einen Split In Batches-Node hinzu, um jedes Keyword einzeln zu durchlaufen und pro Keyword einen eigenen SEMrush-API-Aufruf auszulösen. Setzen Sie die Batch-Größe auf 1, damit die Daten sauber bleiben und Sie keine Probleme mit Rate Limits bekommen.
Verbinden: Google Sheets → Split In Batches → HTTP Request → Code (Parser)
Schritt 4: Die gestrigen Rankings aus Google Sheets lesen
Für die Änderungserkennung brauchen Sie eine Vergleichsbasis. Ihr Google Sheet dient zugleich als historischer Speicher. Fügen Sie nach dem Parsen der heutigen Daten einen weiteren Google Sheets-Node hinzu, der die Rankings des Vortags liest.
Strukturieren Sie Ihr Tracking-Blatt mit diesen Spalten:
| Datum | Keyword | Position | URL | Suchvolumen |
Einstellungen des Google-Sheets-Nodes:
- Operation: Read Rows
- Nach Datum filtern: das gestrige Datum (verwenden Sie einen Ausdruck wie
{{ $now.minus({days: 1}).toFormat('yyyy-MM-dd') }})
Fügen Sie dann einen Merge -Node hinzu, um die heutigen Daten mit denen von gestern zu verknüpfen, und zwar über das Feld Keyword . Verwenden Sie den Modus Merge by Key mit Keyword als Abgleichsfeld.
So erhalten Sie einen kombinierten Datensatz, in dem jeder Eintrag sowohl die aktuelle als auch die vorherige Position desselben Keywords enthält.
Schritt 5: Positionsänderungen erkennen
Fügen Sie nach dem Merge-Node einen Code-Node hinzu, der die Veränderung für jedes Keyword berechnet und auffällige Bewegungen markiert.
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
}
};
});Sie können den Schwellenwert (aktuell 3 Positionen) daran anpassen, wie sensibel Ihre Benachrichtigungen sein sollen. Wenn Sie auch die Zielseite selbst verbessern möchten: Solche Ranking-Verschiebungen weisen oft auf Seiten hin, die eine stärkere Botschaft oder conversion-orientierte Updates brauchen. Deshalb lohnt es sich, parallel zu Ihrem SEO-Workflow bewährte Best Practices und Beispiele für SaaS-Landingpages anzusehen.
Schritt 6: Die heutigen Daten zurück in Google Sheets schreiben
Bevor Sie den Report senden, speichern Sie die heutigen Rankings, damit sie morgen als Vergleichsbasis dienen.
Fügen Sie einen Google Sheets-Node hinzu:
- Operation: Append Row
- Felder zuordnen: Datum (heutiges Datum), Keyword, Position, URL, Suchvolumen
Dieser Schritt läuft nach der Änderungserkennung, sodass Sie immer eine fortlaufende Tageshistorie haben.
Schritt 7: Den Slack-Report formatieren und senden
Fügen Sie einen Code-Node hinzu, der die Slack-Nachricht aufbaut. Ein übersichtlicher Report trennt verbesserte, verschlechterte und stabile Keywords, sodass sich der Leser in unter 30 Sekunden einen Überblick verschaffen kann.
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 } }];Fügen Sie dann einen Slack-Node hinzu:
- Resource: Message
- Operation: Send
- Kanal: Ihr Reporting-Kanal (z. B.
#seo-reports) - Text:
{{ $json.message }}
Schritt 8: Eine Fehlerbehandlung hinzufügen
Jeder Workflow im Produktivbetrieb braucht einen Fallback. Fügen Sie einen Error Trigger -Node hinzu und verbinden Sie ihn mit einem zweiten Slack-Node, der bei einem Fehler in einem beliebigen Schritt eine Nachricht in einen #workflow-errors -Kanal postet.
So vermeiden Sie stille Ausfälle, bei denen der Report einfach nicht ankommt und niemand es bemerkt, bis sich die Rankings bereits verschoben haben.
So sieht der fertige Workflow aus
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)Nodes insgesamt: 10 bis 11, je nach Einrichtung der Fehlerbehandlung. Aufbauzeit für jemanden, der n8n kennt: beim ersten Versuch etwa 90 Minuten.
Häufige Probleme und ihre Lösung
SEMrush liefert keine Daten
Prüfen Sie, ob der Parameter database zur richtigen regionalen Datenbank für Ihren Zielmarkt passt. Vergewissern Sie sich außerdem, dass Ihr API-Schlüssel über genügend Units verfügt. Jede Keyword-Abfrage verbraucht API-Guthaben.
Der Merge-Node findet keine Übereinstimmungen
Meist ist die Datumsformatierung zwischen Schreib- und Leseschritt uneinheitlich. Legen Sie das Format fest auf yyyy-MM-dd und verwenden Sie es durchgängig mit $now.toFormat('yyyy-MM-dd').
Slack-Nachricht ist zu lang
Slack blockiert Nachrichten mit mehr als 4.000 Zeichen. Wenn Sie mehr als 50 bis 60 Keywords tracken, filtern Sie die Slack-Ausgabe so, dass nur Keywords mit einer Änderung von 5 oder mehr Positionen angezeigt werden, und verlinken Sie auf das vollständige Google Sheet für das Gesamtbild.
Rate Limiting bei SEMrush
Fügen Sie in Ihrer Split-In-Batches-Schleife zwischen den Batches einen Wait-Node (auf 1 Sekunde gesetzt) ein. Die API von SEMrush erlaubt kurze Lastspitzen, aber dauerhaft schnelle Anfragen führen zu 429-Fehlern.
So erweitern Sie diesen Workflow
Sobald der Kern-Workflow zuverlässig läuft, bringen drei Erweiterungen echten Mehrwert:
Wöchentliche Zusammenfassung: Fügen Sie einen zweiten Schedule Trigger hinzu, der auf montags eingestellt ist, die Google-Sheets-Daten der letzten 7 Tage liest und zusätzlich zum Tagesreport eine wöchentliche Trendzusammenfassung sendet.
Nur Schwellenwert-Alarme: Duplizieren Sie den Workflow und entfernen Sie die tägliche Zusammenfassung. Konfigurieren Sie diese Version so, dass der Slack-Node nur ausgelöst wird, wenn ein Keyword an einem einzigen Tag um mehr als 5 Positionen fällt. Nutzen Sie das für das Monitoring gegenüber Kunden, bei dem das Verhältnis von Signal zu Rauschen zählt.
Anbindung an Google Looker Studio: Ihr Google Sheet ist bereits als saubere Datentabelle aufgebaut. Verbinden Sie es mit Looker Studio (kostenlos) und erstellen Sie ein Live-Diagramm zur Ranking-Entwicklung, das sich jeden Morgen automatisch aktualisiert.
FAQs
Was macht ein n8n-Workflow für den täglichen SEO-Ranking-Report?
Er ruft täglich automatisch Keyword-Positionen aus SEMrush ab, vergleicht die aktuelle Position jedes Keywords mit den in Google Sheets gespeicherten Daten des Vortags, erkennt deutliche Ranking-Änderungen und sendet eine formatierte Zusammenfassung an einen Slack-Kanal. Nach der Einrichtung läuft der Workflow ohne manuelles Zutun.
Brauche ich Programmiererfahrung, um das in n8n aufzubauen?
Nein, Sie sollten aber damit vertraut sein, einfaches JavaScript zu lesen und zu bearbeiten. Die Code-Nodes in diesem Workflow verwenden unkomplizierte Array-Methoden. Wenn Sie den obigen Beispielen folgen und Variablennamen anpassen können, können Sie diesen Workflow aufbauen. Die Nodes HTTP Request, Google Sheets und Slack lassen sich per Klick konfigurieren.
Was kostet der tägliche Betrieb dieses Workflows?
Die Preise für n8n Cloud beginnen bei etwa 20 $ pro Monat. Die Kosten für die SEMrush-API hängen von Ihrem Tarif und dem Keyword-Volumen ab. Jede phrase_organic Abfrage kostet 10 API-Units. Beim täglichen Tracking von 50 Keywords werden 500 Units verbraucht, was in den meisten kostenpflichtigen SEMrush-Tarifen problemlos abgedeckt ist. Slack und Google Sheets sind für diesen Anwendungsfall kostenlos.
Kann ich statt SEMrush eine andere Rank-Tracking-API verwenden?
Ja. DataForSEO und Bright Data bieten beide REST-APIs, die mit dem HTTP-Request-Node von n8n nach demselben Muster funktionieren wie in diesem Tutorial. Der Parsing-Schritt im Code-Node muss an das Antwortformat der jeweils gewählten API angepasst werden.
Was passiert, wenn der Workflow über Nacht fehlschlägt?
Die Error-Trigger-Node am Ende des Workflows fängt jeden Fehler ab und sendet eine Slack-Benachrichtigung an Ihren Fehlerkanal. Ohne diese Node bleiben Fehler unbemerkt. Fügen Sie bei zeitgesteuerten Workflows deshalb immer eine Fehlerbehandlung hinzu, bevor Sie sie als produktionsreif betrachten.
Eignet sich dieser Workflow für den Einsatz in Agenturen mit mehreren Kunden?
Mit Anpassungen ja. Am einfachsten duplizieren Sie den Workflow für jeden Kunden und tauschen Domain, Keyword-Tabelle und Slack-Kanal aus. Bei einem fortgeschritteneren Setup liest ein einziger Workflow eine Konfigurationstabelle mit den Kundendaten aus und durchläuft die Einstellungen jedes Kunden dynamisch in einer Schleife. Wenn Sie an den Punkt kommen, an dem Sie externe Unterstützung beim Skalieren von SEO-Reporting, Automatisierung oder umfassenderen Wachstumssystemen brauchen, können Sie bei SaaS Hackers außerdem einen Experten finden oder geprüfte B2B SaaS SEO-Agenturen für die Umsetzung durchsuchen.
Beitrag von
SaaS Hackers


