Documentation Index
Fetch the complete documentation index at: https://mintlify.com/KevinhosUTP/Automatizacion-Lurwis/llms.txt
Use this file to discover all available pages before exploring further.
Descripción General
El flujo Receptor es el punto de entrada crítico de la automatización de Lurwis. Actúa como gateway entre Meta (WhatsApp Business API) y el sistema de procesamiento interno. Su función principal es recibir webhooks de manera instantánea, validar su autenticidad, filtrar eventos irrelevantes y agrupar mensajes múltiples de un mismo usuario usando Redis como buffer temporal.Arquitectura asíncrona: Este flujo responde inmediatamente a Meta (200 OK) y delega el procesamiento al flujo Procesador, evitando timeouts.
Configuración del Webhook
El flujo utiliza un nodo Webhook de n8n configurado para recibir peticiones de la API de WhatsApp Business:- Ruta:
/meta-verify - Métodos HTTP: GET (verificación) y POST (mensajes)
- Modo de respuesta:
responseNode(control manual de respuestas) - ID del Webhook:
44c93f39-fc17-4ae4-b36e-034e7bdd40c4
Flujo de Trabajo Detallado
Cuando Meta intenta verificar el webhook (suscripción inicial), envía una petición GET con parámetros específicos:
hub.mode=== “subscribe”hub.verify_token=== “meta-verify”
hub.challenge con código 200El nodo Identificador de vacíos (If) filtra los eventos para procesar solo mensajes de texto reales:
body.entry[0].changes[0].value.messages no está vacíobody.entry[0].changes[0].value.messages[0].text.body contiene textobody.entry[0].changes[0].value.statuses está vacío (no es un estado de “leído”/“entregado”)Eventos filtrados automáticamente:
- Actualizaciones de estado (mensaje entregado, leído)
- Webhooks de confirmación vacíos
- Mensajes multimedia sin texto (imágenes, videos, audios)
{
"from": "51900769907", // Número del remitente
"text.body": "Quiero hacer un pedido", // Contenido del mensaje
"id cliente": "wamid.HBgL...", // ID único del mensaje
"id mensajero": "947279508470714", // Phone Number ID de Meta
"profile_name": "Kevin", // Nombre del perfil de WhatsApp
"mensaje_real": true // Flag de validación
}
body.entry[0].changes[0].value.messages[0].from → frombody.entry[0].changes[0].value.messages[0].text.body → text.bodybody.entry[0].changes[0].value.messages[0].id → id clientebody.entry[0].changes[0].value.metadata.phone_number_id → id mensajerobody.entry[0].changes[0].value.contacts[0].profile.name → profile_nameObjetivo: Evitar que el bot responda múltiples veces si el cliente envía varios mensajes cortos seguidos (ej: “Hola”, “Quiero”, “Un ceviche”).
buffer_<número_teléfono> (ej: buffer_51900769907)null si no existelet existingBuffer = '';
try {
const redisResult = $input.first()?.json;
existingBuffer = redisResult?.value || '';
} catch (e) {
existingBuffer = '';
}
const newMessage = extractorData?.text?.body || '';
const userId = extractorData.from;
// Concatenar con salto de línea
const updatedBuffer = existingBuffer
? `${existingBuffer}\n${newMessage}`
: newMessage;
const now = Date.now();
return {
json: {
bufferKey: `buffer_${userId}`,
timestampKey: `ts_${userId}`,
metaKey: `meta_${userId}`,
bufferContent: updatedBuffer,
timestamp: now,
userId: userId,
idMensajero: extractorData['id mensajero'],
profileName: extractorData.profile_name,
messageCount: updatedBuffer.split('\n').length
}
};
Buffer: Guardar)
- Clave:
buffer_<userId> - Valor: Mensajes concatenados con
\n - TTL: 30 segundos
Buffer: Timestamp)
- Clave:
ts_<userId> - Valor: Timestamp del último mensaje (milisegundos)
- TTL: 30 segundos
Buffer: Meta)
- Clave:
meta_<userId> - Valor:
id mensajero(Phone Number ID) - TTL: 120 segundos (más largo para mantener contexto)
TTL de 30 segundos: Si el cliente no envía más mensajes en 30 segundos, Redis expira automáticamente las claves. El flujo Procesador debe consumir el buffer antes de que expire.
Diagrama de Flujo
Tecnologías Utilizadas
| Componente | Tecnología | Propósito |
|---|---|---|
| Webhook Server | n8n Webhook Node | Recibir peticiones HTTP de Meta |
| Buffer Temporal | Redis | Agrupar mensajes del mismo usuario |
| Validación | n8n If Node | Filtrar eventos no deseados |
| Transformación | n8n Set/Code Nodes | Limpiar y estructurar datos |
| Respuestas HTTP | n8n Respond to Webhook | Comunicación con Meta |
Conexión con Credenciales
Redis Credential:- Nombre: “Buffer Lurwis”
- ID:
LuOIeLYx2ps0SCoP - Configuración: Host, puerto, password, DB index
Asegúrate de que la instancia de Redis esté siempre disponible, ya que caídas del servicio romperían la cadena de procesamiento.
Manejo de Errores
Estrategia de Error Handling
- Webhook inválido: Responde 403 sin procesar
- Mensaje vacío: Ejecuta “No Operation” y responde 403
- Error en Redis: El flujo no captura errores de Redis intencionalmente, dejando que falle visiblemente para alertar problemas de infraestructura
- Error global: Conectado a un “Error Workflow” que notifica al WhatsApp personal del administrador
Consideraciones de Seguridad
El token
meta-verify debe coincidir exactamente con el configurado en Meta. Este valor debe guardarse como secreto.Meta envía headers
x-hub-signature y x-hub-signature-256 para verificar autenticidad. Actualmente no implementado en el flujo.Recomendación de seguridad: Implementar validación de firma HMAC usando el App Secret de Meta para evitar webhooks falsificados.
Métricas y Monitoreo
Indicadores clave del flujo:- Tasa de webhooks recibidos vs. procesados
- TTL expirado (mensajes que no fueron consumidos por el Procesador)
- Mensajes concatenados por buffer (promedio)
- Tiempo de respuesta a Meta (debe ser < 5s)
Flujo Siguiente
Una vez que los mensajes están en Redis, el flujo Procesador se encarga de:- Leer los buffers cada 10 segundos
- Validar el tiempo de espera (8 segundos desde el último mensaje)
- Consumir el buffer y procesar con agentes de IA
- Enviar respuestas al cliente por WhatsApp
Código de Ejemplo: Payload de Meta
Ver payload completo de webhook de Meta
Ver payload completo de webhook de Meta