In den beiden vorherigen Artikeln dieser Reihe haben wir zuerst gesehen, warum es sich lohnt, Kundenfeedback zu sammeln, und danach, wie man ein nützliches Feedbackformular erstellt, um zu verstehen, was auf einer Website oder App direkt nach einer Conversion passiert.
In diesem dritten Artikel gehen wir noch eine Ebene tiefer. Es geht nicht mehr nur darum, Antworten zu sammeln, sondern sie zu verarbeiten.
Denn die Analyse der Antworten aus offenen Feldern eines Formulars kostet Zeit, wenn sie nicht automatisiert wird. Vor allem, wenn sie in mehreren Sprachen eingehen.
Die komplette Reihe darüber, wie man Kundenfeedback sammelt und nutzt, besteht aus vier Teilen:
- Warum Kundenfeedback zu sammeln unverzichtbar ist.
- Wie man ein nützliches Feedbackformular erstellt.
- Wie man KI nutzt, um offene Antworten zu übersetzen und zu klassifizieren.
- Wie man dieses Feedback in Dashboards und eine monatliche Monitoring-Routine verwandelt.
Hier konzentrieren wir uns auf den dritten Punkt: einen Workflow mit n8n, Google Sheets und Gemini aufzubauen, um offene Formularantworten zu übersetzen, zu klassifizieren und anzureichern.
Índice de Contenidos del Artículo
- Welches Problem lösen wir mit diesem Workflow
- Was wir bauen werden
- Werkzeuge, die wir verwenden werden
- Bevor es losgeht: Wie das Antwortblatt vorbereitet sein muss
- Workflow in n8n Schritt für Schritt
- Was wir am Ende des Prozesses erreichen
- Häufige Fehler beim Automatisieren von Feedback mit KI
- Nächster Schritt: diese Daten in ein Dashboard umwandeln
- Häufige Fragen
- Wozu dient die Automatisierung von Formularantworten mit n8n und KI?
- Welches Problem löst dieser Workflow?
- Welche Tools werden im Workflow verwendet?
- Muss man genau Gemini verwenden?
- Wie muss das Antwortblatt vorbereitet sein?
- Warum ist es wichtig, Duplikate zu vermeiden?
- Warum muss man der KI geschlossene Kategorien geben?
- Was gibt die KI in diesem Flow zurück?
- Warum muss man das JSON validieren, das die KI zurückgibt?
- Ersetzt die KI die menschliche Analyse?
Welches Problem lösen wir mit diesem Workflow
Geschlossene Fragen im Formular sind leicht zu analysieren.
Wenn du nach einer Bewertung von eins bis zehn für die Einfachheit des Prozesses (oder etwas anderes), nach dem wichtigsten Entscheidungsgrund, dem Alter, dem Land oder danach fragst, ob der Nutzer Probleme hatte, wird jede Antwort einem Wert aus einer begrenzten Anzahl von Variablen zugeordnet.
Das Problem entsteht bei offenen Antworten.
Dort erklärt der Nutzer mit eigenen Worten, was passiert ist: dass er eine Information nicht gefunden hat, dass die Zahlung Zweifel ausgelöst hat, dass er mit einer anderen Plattform verglichen hat, auf der es günstiger war, dass er ein Problem mit einem Gutschein im Checkout hatte, dass er mit einer Person sprechen wollte oder dass der Prozess klar und schnell war.
Diese Art Kommentar ist sehr wertvoll, hat aber drei Schwierigkeiten:
- Man muss ihn lesen.
- Man muss den Kontext verstehen und interpretieren.
- Und wenn es mehrere Sprachen gibt, muss man ihn übersetzen oder normalisieren, bevor man ihn vergleichen kann.
Wenn du nur wenige Antworten hast, kannst du das von Hand machen. Wenn Volumen, verschiedene Märkte oder Kommentare in fünf Sprachen dazukommen, ist es nicht mehr praktikabel.
In dem Fall, den wir als Beispiel verwenden, war das Formular auf Spanisch, Niederländisch, Französisch, Englisch und Deutsch angelegt. Deshalb war es sinnvoll, eine KI-Schicht hinzuzufügen.
Die Idee ist nicht, dass die KI für das Unternehmen entscheidet, sondern dass sie die Daten vorbereitet:
- Kommentare übersetzen.
- Vorfälle klassifizieren.
- Erwähnungen von Wettbewerbern erkennen.
- Ein Google-Spreadsheets-Dokument bereitstellen, das im nächsten Schritt analysiert werden kann.
Was wir bauen werden
Wir werden einen n8n-Workflow bauen, der Folgendes macht:
- Er liest ein Google-Sheets-Blatt mit Formularantworten.
- Er erkennt, welche Antworten neu sind, damit keine Duplikate verarbeitet werden.
- Er fügt einen Kategorienkontext hinzu, damit die KI konsistent klassifiziert.
- Er sendet die offenen Felder an ein LLM (in unserem Fall Gemini).
- Er erhält eine Antwort in JSON.
- Er wandelt dieses JSON in Spalten mit dem richtigen Format um.
- Er schreibt das Endergebnis in ein anderes Google-Sheets-Blatt mit den KI-Ergebnissen.
Das ist kein universelles Rezept, das du ohne Anpassungen kopieren kannst.
Es ist auf ein konkretes Kundenfeedbackformular einer Buchungswebsite zugeschnitten, aber die Logik lässt sich übertragen auf einen Ecommerce, eine Schulung, eine Dienstleistungswebsite oder jedes Feedbackformular zu einem digitalen Asset, in dem du offene Antworten klassifizieren möchtest.
Werkzeuge, die wir verwenden werden
Für diesen Ablauf verwenden wir mehrere konkrete Werkzeuge:
- n8n, als Automatisierungstool.
- Google Sheets, als Eingabe- und Ausgabeblatt.
- Gemini, als KI-Modell zum Übersetzen und Klassifizieren.
- Data Studio, das im nächsten Artikel das naheliegende Ziel für die Visualisierung der Daten sein wird.
In diesem Fall verwenden wir Gemini Flash Lite weil die Aufgabe relativ leicht ist: kurze Kommentare analysieren, eine Kategorie auswählen, erkennen, ob ein Wettbewerber erwähnt wird, und ein JSON zurückgeben. Dafür brauchen wir nicht das leistungsfähigste Modell, sondern ein schnelles, günstiges und stabiles Modell.
In unserem Fall lagen die erwarteten Kosten bei nur wenigen Cent pro Tag. Außerdem haben wir die latest-Version von Flash Lite gewählt, weil beim Festlegen älterer Versionen wie 2.0 oder 2.5 Verfügbarkeitsprobleme auftraten.
Und in einem automatisierten Ablauf ist Stabilität genauso wichtig wie Qualität, wenn nicht wichtiger.
Die Modelltemperatur ist auf 0.1 eingestellt.
Auch das ist Absicht: Hier suchen wir keine Kreativität, sondern Konsistenz.
Wir wollen, dass ähnliche Antworten ähnlich klassifiziert werden und dass das Modell das JSON-Format respektiert, das wir anfordern.
Bevor es losgeht: Wie das Antwortblatt vorbereitet sein muss
Wie ich dir im vorherigen Post erklärt habe, brauchen wir vor dem Aufbau des Workflows ein Google-Sheets-Blatt mit den ursprünglichen Formularantworten.
Es kann direkt aus Google Forms kommen oder ein Blatt sein, in dem wir Antworten zusammengeführt haben, die aus einem anderen System stammen, etwa aus einem CRM oder aus mehreren Formularen in verschiedenen Sprachen.
Wichtig ist, dass das Blatt eine stabile Struktur hat: eine Zeile pro Antwort und eine Spalte pro Frage.
In diesem Beispiel arbeiten wir mit Feldern, die mit den Antworten verknüpft sind:
- Record ID (die wir verwenden, um Duplikate zu vermeiden).
- Datum.
- Markt (es sind fünf verschiedene Domains).
Und die eigentlichen Antwortfelder:
- Buchungsfreundlichkeit (Skala 1-10).
- Entscheidungsgrund (5 Möglichkeiten).
- Ob es Vorfälle gab und Details zum Vorfall.
- Bewertung der Website.
- Freier Kommentar.
- Land (nicht dasselbe wie Markt, da ein Finne auf der englischen Website buchen kann).
- Geschlecht.
- Alter.
- Und ob der Nutzer eine Antwort erwartet.
Dein Blatt muss nicht genau dieselben Spalten haben. Wichtig ist, dass es eine eindeutige Kennung pro Antwortgibt. In diesem Workflow verwenden wir Record ID, um zu wissen, welche Zeilen bereits verarbeitet wurden und welche neu sind.

Wenn du in mehreren Sprachen arbeitest, solltest du in allen dieselbe Struktur von Fragen und Antworten beibehalten und nur die Übersetzung variieren.
So kannst du aggregierte Daten analysieren und gleichzeitig nach Sprache, Land oder Markt segmentieren. All das haben wir im vorherigen Post über die Erstellung des Formulars gesehen.
Workflow in n8n Schritt für Schritt
Der komplette Workflow ist in neun Hauptknoten organisiert:
Jede Stunde:
→ Google-Sheets-Quelle lesen.
→ Quelle bündeln.
→ Neue IDs filtern.
→ Kategorienkontext erstellen.
→ Mit Gemini Flash klassifizieren.
→ KI-Antwort parsen.
→ Ergebnisse für das neue Google Sheet vorbereiten.
→ In das neue Google Sheet schreiben.

Zuerst erkläre ich dir grob, wie der Flow funktioniert, und danach gehen wir jeden Knoten im Detail durch.
In diesem Flow wird n8n mit einer definierten Frequenz ausgeführt, liest das Antwortblatt, normalisiert die Daten, verwirft bereits verarbeitete Datensätze, fügt die Kategorien hinzu, die die KI verwenden soll, sendet die offenen Felder an Gemini, interpretiert die Antwort und schreibt eine angereicherte Zeile in das finale Blatt.
Gehen wir jetzt Knoten für Knoten vor.
Schritt 1: Jede Stunde
Dieser Knoten ist der Auslöser des Workflows.
Im Beispiel ist er so konfiguriert, dass er jede Stundeausgeführt wird, aber die Frequenz kann an das Antwortvolumen angepasst werden.
Wenn du viele Antworten erhältst, kann eine stündliche Ausführung sinnvoll sein. Wenn du wenige erhältst, reicht vielleicht einmal täglich.
Außerdem musst du ihn während einer Testphase manuell starten.
Grundkonfiguration:
Node type: Schedule Trigger
Rule: every hour
Entscheidend ist, die Frequenz anzupassen. Für Formularfeedback muss normalerweise nicht jede Minute verarbeitet werden.
Schritt 2: Google-Sheets-Quelle lesen
Dieser Knoten liest das Google-Sheets-Blatt in dem die ursprünglichen Formularantworten stehen.
In diesem Fall verwenden wir den Quell-Tab nur lesend.
Wichtig: Wir markieren keine Zeilen, schreiben keine Statuswerte und verwenden dieses Blatt nicht als operative Datenbank.
Wir könnten das tun, aber da dieses Blatt vom Kunden erstellt wurde, ist es besser, es nicht anzufassen. Wenn es dein eigenes Unternehmen ist, ist es wahrscheinlich sinnvoll, ein zweites Blatt hinzuzufügen, statt ein weiteres Google Sheet zu erstellen, wie wir es hier tun.
Grundkonfiguration:
Node type: Google Sheets
Operation: Read
Document ID: [ID_DEL_SPREADSHEET_ORIGEN]
Sheet name: [NOMBRE_HOJA_ORIGEN]
Credential: [CREDENCIAL_GOOGLE_SHEETS]
Das Quellblatt sollte so sauber wie möglich sein.
Wenn es aus Google Forms kommt, hast du bereits eine recht komfortable Struktur. Wenn es aus einem CRM oder aus mehreren Formularen kommt, solltest du die Antworten vorher in einem Blatt mit konsistenten Spalten vereinheitlichen.
Schritt 3: Quelle verpacken
Dieser Code-Knoten (JS) normalisiert die Zeilen die aus dem Quellblatt kommen, und bereitet sie für den Rest des Workflows vor.
In der Praxis kopiert er jedes Item unverändert.
Code des Knotens:
// Normaliza las filas del Sheets origen para usarlas despues desde otros nodos.
// El origen es solo lectura, asi que no marcamos nada aqui.
return $input.all().map(item => ({
json: { ...item.json }
}));
Schritt 4: Neue Record IDs filtern
Dieser Knoten vermeidet Duplikate.
Das ist einer der wichtigsten Punkte des Workflows. Wenn wir bei jeder Ausführung des Flows alle Antworten an Gemini senden würden, würden wir dieselben Kommentare immer wieder verarbeiten, mehr Tokens ausgeben und das finale Blatt mit Duplikaten füllen.
Um das zu vermeiden, verwenden wir den Knoten Remove Duplicates von n8n mit der Operation Remove Items Processed in Previous Executions. Die Konfiguration basiert auf dem Feld Record ID, das für jede Antwort eindeutig sein muss.
Grundkonfiguration:
Node type: Remove Duplicates
Operation: Remove Items Processed in Previous Executions
Value to Dedupe On: {{ $json["Record ID"] }}
Das ist wichtig:
Wenn der Workflow eingerichtet wird, bevor Antworten vorhanden sind, muss nichts initialisiert werden. Die erste Antwort, die eingeht, ist neu und wird verarbeitet.
Wenn das Blatt bereits alte Antworten enthält, wenn du den Workflow aktivierst (der übliche Fall), solltest du den gesamten Flow bis zu diesem Knoten (einschließlich) ausführen, bevor du ihn mit dem Rest des Flows verbindest.
So lernt n8n diese Record IDs als bereits gesehen und sendet nicht die gesamte Historie bei der ersten Ausführung an die KI.
Außerdem solltest du den Flow testen, ohne ihn bereits zu veröffentlichen: einmal ausführen, prüfen, welche Datensätze durchgehen, erneut ausführen und bestätigen, dass keine Duplikate entstehen.
Drücke nicht auf Clear Deduplication Historyes sei denn, du willst alles erneut verarbeiten.
Schritt 5: Kategorienkontext bauen
Hier definieren wir die Kategorien die die KI verwenden kann, um die Antworten zu klassifizieren.
Dieser Punkt ist entscheidend, weil wir nicht wollen, dass Gemini für jeden Kommentar eine andere Kategorie erfindet. Wir wollen, dass es innerhalb eines geschlossenen Rahmens klassifiziert.
In diesem Beispiel haben wir zwei Gruppen von Kategorien: eine für Vorfälle im Buchungsprozess und eine für offene Kommentare.
Kategorien für Q3, Vorfälle im Prozess:
- Zahlung / Gateway.
- Rabattcode.
- Navigation / UX.
- Falsche Verfügbarkeit.
- Probleme mit der Buchung.
- Anderes.
Kategorien für Q5, offene Kommentare:
- Zufriedenheit / Lob.
- Aktionen / Rabatte.
- Kundenservice / menschlicher Support.
- Zahlungsart / Überweisung.
- Preis.
- Vergleich mit Wettbewerbern.
- Listing-Informationen.
- Stornierungsbedingungen.
- Antwortzeit.
- Kein relevanter Kommentar.
- Anderes.
In diesem Fall haben wir entschieden, die Kategorien hardzucoden innerhalb des Code-Knotens selbst, um einen zusätzlichen Lesezugriff auf Google Sheets zu vermeiden.
Das ist nicht nur eine technische Vorliebe: es hilft, Aufrufe an die Google-Sheets-API zu reduzieren.
Es mag bequem erscheinen, Google Sheets wie eine kleine Datenbank zu verwenden: ein Blatt für Antworten, ein anderes für Kategorien, ein anderes zum Prüfen verarbeiteter Einträge, ein weiteres zum Schreiben der Ergebnisse.
Aber wenn der Flow wächst, kannst du auf Quotenlimits stoßen, wie es uns hier passiert ist.
Deshalb verwenden wir Google Sheets in diesem Fall als Ein- und Ausgabe, nicht als allgemeine Datenbank des Systems (dafür wird die Datenbank genutzt, die du in deiner n8n-Installation hast, standardmäßig SQLite).
Code des Knotens:
// Categorías hardcodeadas para eliminar una lectura adicional a Google Sheets.
// Si cambias Categorias_Config, actualiza estas listas aquí.
const categoriasQ3 = [
[
'Pago / pasarela',
'Tarjeta rechazada, fallo con Bancontact, Paypal u otro metodo de pago'
],
[
'Codigo descuento',
'Cupon o codigo de descuento invalido que bloquea o impide completar el pago'
],
[
'Navegacion / UX',
'Problemas de usabilidad en la web, ej. volver al listado, botones confusos'
],
[
'Disponibilidad incorrecta',
'Fechas que desaparecen, alojamiento mostrado como disponible pero no lo esta'
],
[
'Problemas con la reserva',
'Reserva equivocada, duplicada o cancelada por error del sistema, demora o ausencia de confirmacion de reserva, email de confirmacion o validacion del propietario'
],
[
'Otro',
'Incidencia que no encaja en ninguna categoria anterior'
],
];
const categoriasQ5 = [
[
'Satisfaccion / elogio',
'Comentarios positivos, felicitaciones, recomendacion del servicio o buena experiencia'
],
[
'Promociones / descuentos',
'Peticiones de codigos promocionales, descuentos para clientes habituales o promociones'
],
[
'Atencion / soporte humano',
'Peticiones de hablar con una persona, chat humano, soporte no automatizado o ayuda comercial'
],
[
'Forma de pago / transferencia',
'Comentarios sobre transferencia, tarjeta, medios de pago disponibles o preferencia de pago'
],
[
'Precio',
'Comentarios sobre subida de precios, coste percibido como alto o comparacion de precio'
],
[
'Comparacion con competencia',
'Menciona explicitamente otra plataforma como Booking.com, Airbnb, Vrbo, etc.'
],
[
'Informacion del listing',
'Falta de fotos, ubicacion/coordenadas poco claras, info de mascotas, descripcion del alojamiento'
],
[
'Politica de cancelacion',
'Plazo de cancelacion gratuita considerado corto o poco flexible'
],
[
'Tiempo de respuesta',
'Quejas sobre lentitud en la respuesta a consultas o soporte'
],
[
'Sin comentario relevante',
"Respuestas vacias de contenido: 'No', 'nada que destacar', 'all good', etc."
],
[
'Otro',
'Comentario con contenido pero que no encaja en ninguna categoria anterior'
],
];
const catsQ3 = categoriasQ3
.map(([cat, desc]) => `- ${cat}: ${desc}`)
.join('
');
const catsQ5 = categoriasQ5
.map(([cat, desc]) => `- ${cat}: ${desc}`)
.join('
');
return $input.all().map(item => ({
json: {
...item.json,
categorias_q3_texto: catsQ3,
categorias_q5_texto: catsQ5,
}
}));
Offensichtlich sind diese Kategorien nicht universell. Für andere digitale Unternehmen müssten sie angepasst werden.
Schritt 6: Mit Gemini Flash klassifizieren
Das ist der Knoten, der die offenen Felder an Gemini sendet. Konkret analysieren wir zwei Felder: die Details zum Vorfall während der Buchung und den freien Schlusskommentar.
Das Modell muss ausschließlich ein gültiges JSON zurückgeben, ohne Erklärungen, ohne Markdown und ohne zusätzlichen Text. Das ist entscheidend, weil der nächste Knoten diese Antwort parsen und in Spalten umwandeln soll.
Grundkonfiguration:
Node type: Google Gemini
Model: models/gemini-flash-lite-latest
Temperature: 0.1
Credential: [CREDENCIAL_GEMINI]
Verwendeter Prompt:
Du bist ein Klassifizierer für Nutzerfeedback einer Website für die Buchung ländlicher Unterkünfte. Du musst zwei Textfelder analysieren und NUR ein gültiges JSON zurückgeben, ohne zusätzlichen Text, ohne Markdown, ohne Backticks.
Feld Q3 - Issue Detail (Vorfall während der Buchung): "{{ $json['Q3 - Issue Detail'] }}"
Erlaubte Kategorien für Q3 (wähle eine, oder verwende exakt den Text "Sin incidencia", wenn das Feld leer ist):
{{ $json.categorias_q3_texto }}
Feld Q5 - Comments (freier Kommentar): "{{ $json['Q5 - Comments'] }}"
Erlaubte Kategorien für Q5 (wähle eine, oder verwende exakt den Text "Sin comentario relevante", wenn es leer ist oder keinen Inhalt liefert wie 'No', 'nada', 'all good'):
{{ $json.categorias_q5_texto }}
Zusätzlich:
- Wenn Q5 ausdrücklich eine konkurrierende Plattform erwähnt (Booking.com, Airbnb, Vrbo, Expedia, HomeAway oder eine andere), gib menciona_competidor true und den erkannten Namen an. Wenn nicht, false und eine leere Zeichenkette.
- Übersetze den Inhalt von Q5 treu und natürlich ins Spanische in comentario_traducido_es. Wenn es leer ist, gib eine leere Zeichenkette zurück.
- Für Q3 gib zusätzlich zur Kategorie in causa_raiz_resumen einen kurzen Satz (maximal 8 Wörter) auf Spanisch an, der die technische Ursache zusammenfasst und hilft, ähnliche Vorfälle zu gruppieren, auch wenn sie unterschiedlich formuliert sind. Wenn es keinen Vorfall gibt, leere Zeichenkette.
Gib genau dieses JSON-Format zurück:
{
"q3_categoria": "",
"q3_causa_raiz_resumen": "",
"q5_categoria": "",
"q5_menciona_competidor": false,
"q5_competidor_detectado": "",
"q5_comentario_traducido_es": ""
}
Der Prompt macht mehrere Dinge gleichzeitig:
- Er klassifiziert und übersetzt Q3.
- Er fasst eine kurze Root Cause für Vorfälle zusammen.
- Er klassifiziert und übersetzt Q5.
- Er erkennt, ob ein Wettbewerber erwähnt wird, und übersetzt den freien Kommentar ins Spanische.
All das kommt in einem JSON mit festen Feldern zurück.
Wichtig ist, dass das Modell nicht frei entscheidet, was zu tun ist. Wir geben ihm erlaubte Kategorien, das exakte Ausgabeformat und bitten es, keinen Text außerhalb des JSON hinzuzufügen.
Schritt 7: KI-Antwort parsen
Dieser Knoten wandelt die Gemini-Antwort in nützliche Spalten um.
Zuerst extrahiert er den vom Modell zurückgegebenen Text, entfernt mögliche Backticks oder Markdown-Blöcke und versucht danach, ihn in JSON umzuwandeln.
Außerdem enthält er eine Sicherheitsschicht: Wenn die KI etwas zurückgibt, das nicht geparst werden kann, markiert er die Zeile als Klassifizierungsfehler. So bricht der Flow nicht wegen einer einzelnen schlecht formatierten Antwort.
Außerdem erzwingt er eine wichtige Regel für unseren Beispielfall: Wenn Q3 keine Details enthält oder der Nutzer angegeben hat, dass er keine Probleme hatte, wird die Q3-Kategorie auf Sin incidencia gesetzt.
Das verhindert, dass die KI einen Q5-Kommentar so interpretiert, als wäre er ein Vorfall im Prozess.
Code des Knotens:
function extractModelText(json) {
// Caso Gemini n8n actual:
// item.json.content.parts[0].text
if (json?.content?.parts?.[0]?.text) {
return json.content.parts[0].text;
}
// Otros formatos posibles según nodo/modelo
if (typeof json?.text === 'string') return json.text;
if (typeof json?.message === 'string') return json.message;
if (typeof json?.output === 'string') return json.output;
if (typeof json?.content === 'string') return json.content;
// OpenAI/LangChain style fallback
if (json?.message?.content) return json.message.content;
if (json?.choices?.[0]?.message?.content) return json.choices[0].message.content;
return '';
}
function cleanJsonText(raw) {
return String(raw || '')
.replace(/```json/gi, '')
.replace(/```/g, '')
.trim();
}
const items = $input.all();
const originales = $('Construir contexto de categorias').all();
return items.map((item, index) => {
const raw = cleanJsonText(extractModelText(item.json));
let parsed;
try {
parsed = JSON.parse(raw);
} catch (e) {
parsed = {
q3_categoria: 'Error de clasificacion',
q3_causa_raiz_resumen: '',
q5_categoria: 'Error de clasificacion',
q5_menciona_competidor: false,
q5_competidor_detectado: '',
q5_comentario_traducido_es: ''
};
}
const original = originales[index] ? originales[index].json : {};
const q3HadIssues = String(original['Q3 - Had Issues'] || '').trim().toLowerCase();
const q3Detail = String(original['Q3 - Issue Detail'] || '').trim();
if (!q3Detail || q3HadIssues === 'no') {
parsed.q3_categoria = 'Sin incidencia';
parsed.q3_causa_raiz_resumen = '';
}
return {
json: {
'Record ID': original['Record ID'],
'Timestamp': original['Timestamp'],
'Market': original['Market'],
'Q1 - Ease of Booking': original['Q1 - Ease of Booking'],
'Q2 - Decision Driver': original['Q2 - Decision Driver'],
'Q2 - Other (Specify)': original['Q2 - Other (Specify)'],
'Q3 - Had Issues': original['Q3 - Had Issues'],
'Q3 - Issue Detail': original['Q3 - Issue Detail'],
'Q3 - Cluster Causa Raiz': parsed.q3_categoria || '',
'Q3 - Causa Raiz Resumen': parsed.q3_causa_raiz_resumen || '',
'Q4 - NPS Score': original['Q4 - NPS Score'],
'Q5 - Comments': original['Q5 - Comments'],
'Q5 - Cluster Tema': parsed.q5_categoria || '',
'Q5 - Menciona Competidor': parsed.q5_menciona_competidor ? 'Si' : 'No',
'Q5 - Competidor Detectado': parsed.q5_competidor_detectado || '',
'Q5 - Comentario Traducido ES': parsed.q5_comentario_traducido_es || '',
'Country': original['Country'],
'Gender': original['Gender'],
'Age': original['Age'],
'Reply Requested': original['Reply Requested'],
'Fecha Procesado IA': new Date().toISOString()
}
};
});
Wenn du den Namen des vorherigen Knotens änderst, musst du diese Zeile anpassen:
const originales = $('Construir contexto de categorias').all();
In n8n müssen Referenzen über Knotennamen exakt übereinstimmen. Deshalb sollte man klare Namen verwenden und sie später nicht ändern, ohne den Code zu prüfen.
Schritt 8: Resultados_IA vorbereiten
Dieser Knoten führt eine abschließende Bereinigung durch, bevor die Daten in das Ergebnisblatt geschrieben werden. Er entfernt interne Felder, die nur während des Prozesses dienen, etwa die Kategorien als Text, die wir für den Prompt hinzugefügt hatten.
Code des Knotens:
// Limpia campos internos antes de escribir en Resultados_IA.
return $input.all().map(item => {
const row = { ...item.json };
delete row['_timestamp_unix'];
delete row['_clasificacion_error'];
delete row['_error_message'];
delete row['categorias_q3_texto'];
delete row['categorias_q5_texto'];
return { json: row };
});
Dieser Schritt verändert die Analyse nicht, macht die Ausgabe aber sauberer.
Das finale Blatt muss nicht alles speichern, was intern für die Klassifizierung verwendet wurde, sondern die Daten, die wir später analysieren werden.
Schritt 9: Resultados_IA schreiben
Der letzte Knoten schreibt die angereicherte Zeile in ein neues Google-Sheets-Blatt.
In diesem Fall verwenden wir ein Blatt namens Resultados_IA und die Operation append, um für jede verarbeitete Antwort eine neue Zeile hinzuzufügen.
Grundkonfiguration:
Node type: Google Sheets
Authentication: Service Account
Operation: Append
Document ID: [ID_DEL_SPREADSHEET_RESULTADOS]
Sheet name: [NOMBRE_HOJA_RESULTADOS]
Mapping mode: Auto-map input data
Credential: [CREDENCIAL_GOOGLE_SHEETS]
Das finale Blatt enthält sowohl Originaldaten als auch KI-generierte Felder. Zum Beispiel:
- Record ID
- Timestamp
- Market
- Q1 – Ease of Booking
- Q2 – Decision Driver
- Q3 – Had Issues
- Q3 – Issue Detail
- Q3 – Cluster Causa Raiz
- Q3 – Causa Raiz Resumen
- Q4 – NPS Score
- Q5 – Comments
- Q5 – Cluster Tema
- Q5 – Menciona Competidor
- Q5 – Competidor Detectado
- Q5 – Comentario Traducido ES
- Country
- Gender
- Age
- Reply Requested
- KI-Verarbeitungsdatum

Ab hier haben wir nicht mehr nur einzelne lose Antworten. Wir haben eine angereicherte Tabelle mit übersetzten Kommentaren, gruppierten Vorfällen, klassifizierten Themen und Feldern, die für Diagramme bereit sind.
Was wir am Ende des Prozesses erreichen
Wenn der Workflow abgeschlossen ist, wird jede neue Antwort in eine nützlichere Zeile für die Analyse verwandelt.
Wir behalten weiterhin die Originaldaten, fügen aber Schichten hinzu, die vorher manuelle Prüfung erfordert hätten.
In der Praxis erreichen wir:
- Offene Kommentare ins Spanische übersetzt.
- Vorfälle nach Root Cause klassifiziert.
- Kommentare nach Thema gruppiert.
- Erkennung von Wettbewerber-Erwähnungen.
- Ein KI-Verarbeitungsdatum.
- Eine Tabelle, die bereit ist, mit Looker Studio verbunden zu werden.
Das ersetzt keine menschliche Prüfung. Es nimmt nur mechanische Arbeit weg.
Statt damit zu beginnen, hundert Kommentare in fünf Sprachen zu lesen, beginnst du mit Themen, Kategorien, Häufigkeiten und übersetzten Kommentaren. Danach kannst du Stichproben prüfen und entscheiden, welche Maßnahmen sinnvoll sind, wie wir im nächsten und letzten Post der Reihe sehen werden.
Häufige Fehler beim Automatisieren von Feedback mit KI
Kommen wir zu den häufigsten.
Die KI Kategorien erfinden lassen
Wenn jede Ausführung neue Labels erstellt, kannst du später nichts vergleichen.
Damit das System funktioniert, muss die KI innerhalb einer geschlossenen oder zumindest sehr kontrollierten Liste klassifizieren.
Das JSON, das das Modell zurückgibt, nicht validieren
Auch wenn du ein konkretes Format anforderst, kann es irgendwann falsch antworten. Deshalb muss der Parse-Knoten bereinigen, versuchen in JSON umzuwandeln und Fehler abfangen, ohne den gesamten Flow zu brechen.
Duplikate nicht prüfen
Bevor du den Workflow veröffentlichst, solltest du ihn in Tests ausführen und prüfen, dass dieselbe Antwort nicht mehrfach im zweiten Blatt landet.
Der Knoten für neue Record IDs verhindert, dass du zweimal für dieselbe Klassifizierung zahlst und das finale Blatt verschmutzt.
Google Sheets als operative Datenbank verwenden
Google Sheets funktioniert sehr gut als Ein- und Ausgabe, aber man sollte nicht für alles ständig Lesevorgänge machen: Kategorien, Status, Prüfungen, Ergebnisse und Kontrolle verarbeiteter Einträge.
Wenn du es übertreibst, kannst du auf Quotenprobleme stoßen oder einen fragileren Flow bekommen, als nötig wäre.
Den Flow veröffentlichen, ohne ihn zu testen
Zuerst muss man ihn manuell ausführen, prüfen, welche Daten hineingehen, welche herauskommen, ob das JSON korrekt geparst wird, ob es keine Duplikate gibt und ob die Kategorien die gewünschten sind.
Glauben, dass die KI die ganze Arbeit erledigt
Die KI klassifiziert und übersetzt, aber das Unternehmen muss weiterhin interpretieren.
Eine häufige Kategorie bedeutet nicht immer eine sofortige Maßnahme. Man muss Volumen, Wirkung, Umsetzungsaufwand und Kontext bewerten.
Nächster Schritt: diese Daten in ein Dashboard umwandeln
Nach diesem Workflow haben wir bereits ein Ergebnisblatt, das das ursprüngliche Formularblatt ergänzt.
Wir wissen nicht nur, was jeder Nutzer geantwortet hat, sondern haben auch Felder für die Analyse vorbereitet: Kategorien, Übersetzungen, Wettbewerber, Vorfälle und Verarbeitungsdatum.
Der nächste und letzte Schritt ist:
Diese Daten in ein Dashboard bringen und die Governance für das Monitoring erstellen.
Im nächsten Artikel sehen wir, wie man Google Sheets mit Data Studio verbindet, welche Metriken sinnvoll sind und wie man Feedback in eine monatliche Monitoring-Routine verwandelt.
Denn die Automatisierung der Analyse bringt nichts, wenn danach niemand auf die Daten schaut, was ja oft passiert.

Schreibe einen Kommentar