Brand Tracking automatisieren: wöchentlich messen mit n8n + AskAudience

Das Problem: Brand Tracking ist teuer und langsam
Ein Kunde aus der E-Commerce-Branche wollte seine Markenwahrnehmung engmaschig überwachen. Klassische Brand-Tracking-Studien kosten pro Welle 5.000–15.000 Euro und liefern Ergebnisse alle drei Monate. Viel zu träge, um auf Kampagnen oder Shitstorms zeitnah zu reagieren.
Die Lösung: Wir haben mit n8n und AskAudience ein System gebaut, das jeden Montag automatisch eine kompakte Brand-Health-Messung durchführt. Kosten pro Messung: ca. 15 Euro. Ergebnisse: innerhalb von Minuten.
Wie das Setup funktioniert
Schritt 1: Audience definieren
Wir haben in AskAudience eine Audience "Deutsche Online-Shopper 25-45" angelegt – 2.400 Personen, die in den letzten drei Monaten online eingekauft haben. Diese Audience wird wöchentlich aktualisiert, sodass immer aktuelle Käufer enthalten sind.
Schritt 2: n8n-Workflow erstellen
Der Workflow startet jeden Montag um 8 Uhr:
- Cron-Trigger löst den Workflow aus
- HTTP-Request-Node fragt AskAudience: "Welche drei Eigenschaften verbindest du mit der Marke [Kundenname]? Antworte in Stichpunkten."
- Zweite Frage: "Auf einer Skala von 1-10: Wie wahrscheinlich würdest du [Kundenname] weiterempfehlen?"
- Code-Node wertet die Antworten aus: extrahiert Net Promoter Score, clustert Eigenschaften nach Sentiment
- Google Sheets-Node schreibt Ergebnisse in ein Dashboard-Sheet
- Slack-Node postet Zusammenfassung ins Marketing-Channel
Schritt 3: Anomalie-Erkennung
Besonders wertvoll: Der Workflow vergleicht die aktuellen Werte mit dem 4-Wochen-Durchschnitt. Weicht der NPS um mehr als 5 Punkte ab oder tauchen plötzlich negative Begriffe gehäuft auf ("teuer", "langsam", "Probleme"), wird ein Alert an den CMO geschickt.
Konkretes Beispiel: KW 47/2024
In Kalenderwoche 47 schlug das System Alarm. Der NPS war von durchschnittlich 42 auf 31 gefallen. Die häufigsten negativen Begriffe: "Lieferzeit" (23% der Nennungen), "Kundenservice nicht erreichbar" (18%).
Das Team konnte sofort reagieren: Ein technisches Problem hatte die Service-Hotline lahmgelegt. Innerhalb von 48 Stunden wurde das Problem behoben und eine Entschuldigungs-Mail an betroffene Kunden verschickt.
KW 48: NPS wieder bei 40, negative Nennungen zu "Kundenservice" von 18% auf 4% gesunken.
Kosten-Vergleich:
- Klassisches Tracking (4x jährlich): 40.000 Euro
- Automatisiertes Tracking (52x jährlich): 780 Euro
- Zeitersparnis: ca. 20 Stunden manueller Arbeit pro Monat
Was wir gelernt haben
Sampling-Größe anpassen: Anfangs haben wir nur 50 Personen pro Woche befragt. Das führte zu starken Schwankungen. Ab 150 Personen wurden die Werte stabil genug für Woche-zu-Woche-Vergleiche.
Offene Fragen sind Gold wert: Die strukturierten NPS-Werte sind nützlich, aber die offenen Assoziationen liefern die echten Insights. Ein Sentiment-Analyse-Tool (wir nutzen ein einfaches Python-Script in n8n) hilft beim Clustern.
Nicht jede Schwankung ist relevant: In den ersten Wochen haben wir auf jeden Ausreißer reagiert. Jetzt haben wir gelernt: Erst ab zwei Wochen in Folge mit negativem Trend wird eskaliert.
Nächste Schritte
Der Kunde plant, das System zu erweitern:
- Wettbewerbs-Tracking: Parallel die Top-3-Konkurrenten abfragen
- Kampagnen-Tracking: Vor/nach großen Kampagnen zusätzliche Messungen
- Segment-Analysen: Unterschiede zwischen Neu- und Bestandskunden
Das Schöne: Alles lässt sich im bestehenden Workflow ergänzen, ohne dass wir ein neues Tool einführen müssen.
💻 Code-Beispiel
# curl-Beispiel für wöchentliche Brand-Abfrage
curl -X POST https://askaudience.de/api/v1/audiences/aud_xyz123/ask \
-H "Authorization: Bearer aa_live_..." \
-H "Content-Type: application/json" \
-d '{"question":"Welche drei Eigenschaften verbindest du mit der Marke MusterShop? Antworte in Stichpunkten.","responseFormat":"text"}'
// TypeScript-Beispiel für n8n Function-Node
const responses = $input.all();
const npsScores = [];
const associations = [];
for (const item of responses) {
const answer = item.json.answer;
// NPS extrahieren (Annahme: Antwort enthält Zahl 1-10)
const npsMatch = answer.match(/\b([1-9]|10)\b/);
if (npsMatch) npsScores.push(parseInt(npsMatch[1]));
// Assoziationen sammeln
const words = answer.toLowerCase().split(/[,;.\n]/).map(w => w.trim());
associations.push(...words.filter(w => w.length > 3));
}
const avgNPS = npsScores.reduce((a,b) => a+b, 0) / npsScores.length;
const topAssociations = [...new Set(associations)]
.map(word => ({ word, count: associations.filter(w => w === word).length }))
.sort((a,b) => b.count - a.count)
.slice(0, 10);
return [{ json: { avgNPS, topAssociations, timestamp: new Date() } }];