Flujo 10: Análisis de Feedback de Clientes
El problema
El feedback de clientes llega en formularios de satisfacción, reseñas de Google, emails de soporte y encuestas NPS. Nadie tiene tiempo de leerlo todo, clasificarlo y actuar. Las quejas graves se pierden entre el ruido de respuestas positivas. Las empresas que analizan su feedback sistemáticamente mejoran su NPS 20-30 puntos en un año. Este flujo convierte cada respuesta de Typeform en un análisis de sentimiento accionable, con escalado automático al equipo cuando el feedback es negativo.
Herramientas necesarias
| Nodo n8n | Función |
|---|---|
| Typeform Trigger | Detecta cada nueva respuesta de la encuesta de satisfacción |
| HTTP Request | Llama a Claude API para análisis de sentimiento y categorización |
| IF | Bifurca según sentimiento: negativo vs positivo/neutro |
| Slack | Alerta al equipo con feedback negativo (escalado inmediato) |
| Notion | Registra todo el feedback analizado en la base de datos |
Servicios externos:
- Cuenta Typeform con formulario de satisfacción publicado
- API Key de Anthropic (console.anthropic.com)
- Workspace de Slack con canal
#feedback-clientes - Integración Notion configurada en n8n
Configuración paso a paso
Nodo 1: Typeform Trigger
Añade el nodo Typeform Trigger:
- Credentials: cuenta Typeform (OAuth2)
- Form: tu encuesta de satisfacción o NPS
- Simplify: ON
Estructura recomendada del formulario Typeform:
- Pregunta NPS: "¿Cuánto nos recomendarías a un amigo?" (escala 0-10)
- Pregunta abierta: "¿Qué es lo que más valoras de nuestro servicio?"
- Pregunta abierta: "¿Qué mejorarías o qué no ha funcionado bien?"
- Campo oculto:
cliente_id(para vincular con el CRM)
Campos disponibles:
{{ $json['¿Cuánto nos recomendarías?'] }} → puntuación NPS (0-10)
{{ $json['¿Qué más valoras?'] }} → feedback positivo
{{ $json['¿Qué mejorarías?'] }} → feedback de mejora
{{ $json['Email'] }} → email del respondiente
Nodo 2: Set — Preparar texto completo del feedback
Añade un nodo Set:
texto_feedback: expresión que concatena todas las respuestas abiertasnps:={{ $json['¿Cuánto nos recomendarías?'] }}email_cliente:={{ $json['Email'] || 'Anónimo' }}fecha:={{ $now.toFormat('dd/MM/yyyy HH:mm') }}texto_completo:
=`NPS: ${$json['¿Cuánto nos recomendarías?']}/10
Lo que más valoro: ${$json['¿Qué más valoras?'] || 'Sin respuesta'}
Lo que mejoraría: ${$json['¿Qué mejorarías?'] || 'Sin respuesta'}`
Nodo 3: HTTP Request — Claude API (análisis de sentimiento)
Añade el nodo HTTP Request:
- Method: POST
- URL:
https://api.anthropic.com/v1/messages - Authentication: Header Auth
x-api-key: tu API Key de Anthropic
- Headers:
anthropic-version: 2023-06-01,content-type: application/json - Body (JSON):
{
"model": "claude-3-5-haiku-20241022",
"max_tokens": 500,
"messages": [
{
"role": "user",
"content": "={{ $json.prompt_analisis }}"
}
]
}
En el nodo Set anterior, crea el campo prompt_analisis:
Analiza este feedback de cliente y devuelve ÚNICAMENTE un JSON válido.
FEEDBACK:
{{ $json.texto_completo }}
Devuelve este JSON:
{
"sentimiento": "positivo|negativo|neutro|mixto",
"puntuacion_sentimiento": número del 1 al 10 (1=muy negativo, 10=muy positivo),
"categoria_principal": "producto|precio|servicio|atencion_cliente|usabilidad|entrega|otro",
"problema_especifico": "descripción breve del problema si existe, o null",
"aspecto_positivo": "lo que destaca positivamente si existe, o null",
"urgencia": "alta|media|baja",
"requiere_respuesta": true si el cliente espera contacto, false si no,
"resumen_accionable": "una frase con la acción que debería tomarse, máximo 20 palabras"
}
Nodo 4: Code — Parsear respuesta de Claude
Añade un nodo Code (JavaScript):
const respuesta = $input.first().json.content[0].text;
const limpio = respuesta.replace(/```json\n?/g, '').replace(/```\n?/g, '').trim();
const analisis = JSON.parse(limpio);
return [{json: {
...analisis,
nps: $('Set').item.json.nps,
email_cliente: $('Set').item.json.email_cliente,
texto_original: $('Set').item.json.texto_completo,
fecha: $('Set').item.json.fecha
}}];
Nodo 5: IF — Filtrar feedback negativo
Añade el nodo IF:
- Condition 1:
- Value 1:
={{ $json.sentimiento }} - Operation:
Equals - Value 2:
negativo
- Value 1:
- OR
- Condition 2:
- Value 1:
={{ $json.puntuacion_sentimiento }} - Operation:
Smaller or Equal - Value 2:
4
- Value 1:
Rama true → feedback negativo (alerta inmediata) Rama false → feedback positivo/neutro (solo log en Notion)
Nodo 6a: Slack — Alerta de feedback negativo (rama true)
Añade el nodo Slack:
- Operation: Send a Message
- Channel:
#feedback-clientes - Text (expresión):
=`🚨 *FEEDBACK NEGATIVO — Atención requerida*
*NPS:* ${$json.nps}/10 | *Sentimiento:* ${$json.puntuacion_sentimiento}/10
*Categoría:* ${$json.categoria_principal}
*Urgencia:* ${$json.urgencia}
*Problema detectado:*
${$json.problema_especifico || 'Ver texto completo'}
*Acción recomendada:*
${$json.resumen_accionable}
*Texto original del cliente:*
_${$json.texto_original}_
*Cliente:* ${$json.email_cliente}
*Requiere respuesta directa:* ${$json.requiere_respuesta ? 'SÍ' : 'No necesariamente'}
*Fecha:* ${$json.fecha}`
Nodo 6b: Notion — Registrar todo el feedback
Añade el nodo Notion en ambas ramas (positivo y negativo):
- Operation: Create a Page in Database
- Database: tu base de datos de feedback en Notion
- Title:
={{ $json.fecha }} — {{ $json.sentimiento }} — NPS: {{ $json.nps }} - Properties:
Sentimiento(Select):={{ $json.sentimiento }}Puntuacion_Sentimiento(Number):={{ $json.puntuacion_sentimiento }}NPS(Number):={{ $json.nps }}Categoria(Select):={{ $json.categoria_principal }}Urgencia(Select):={{ $json.urgencia }}Email_Cliente(Email):={{ $json.email_cliente }}Requiere_Respuesta(Checkbox):={{ $json.requiere_respuesta }}Fecha(Date):={{ $now.toISO() }}
- Content: añade un bloque de texto con el feedback original y el análisis completo
Ejemplo de prompt IA
Analiza este feedback de cliente:
FEEDBACK:
NPS: 3/10
Lo que más valoro: El producto funciona bien cuando funciona.
Lo que mejoraría: El soporte tarda 3 días en responder. La última actualización
rompió la exportación de informes y nadie nos avisó. Llevamos una semana
sin poder exportar nada. Es inaceptable para un servicio de pago.
Respuesta de Claude:
{
"sentimiento": "negativo",
"puntuacion_sentimiento": 2,
"categoria_principal": "atencion_cliente",
"problema_especifico": "Bug en exportación de informes post-actualización sin aviso, soporte con 3 días de respuesta",
"aspecto_positivo": "Producto funciona correctamente en condiciones normales",
"urgencia": "alta",
"requiere_respuesta": true,
"resumen_accionable": "Contactar cliente en menos de 2 horas, resolver bug de exportación y explicar protocolo de actualizaciones"
}
Ahorro estimado
| Tarea | Antes | Con automatización |
|---|---|---|
| Leer y clasificar feedback manualmente | 2 h/semana | 0 min |
| Detectar quejas críticas en tiempo real | Imposible (revisión semanal) | Instantáneo |
| Registrar y categorizar en base de datos | 1 h/semana | 0 min |
| Total semanal | 3 h/semana | ~15 min (responder alertas urgentes) |
Ahorro neto: ~2,75 horas/semana. El mayor valor no es el tiempo ahorrado: es responder a quejas críticas en minutos en lugar de días. Un cliente insatisfecho contactado en 2 horas tiene 5 veces más probabilidades de renovar que uno contactado en 3 días. Coste de Claude por análisis: ~€0,0005 por respuesta procesada.