Mensajería y chatbot · RF-04 y RF-05
Bandeja unificada
conversations agrupa por canal e identificador externo. Una conversación
puede existir sin cliente: alguien desconocido escribe primero y se vincula
—o se da de alta— después.
La ventana de 24 horas
Meta sólo permite texto libre dentro de las 24 h siguientes al último mensaje del usuario. Fuera de eso, sólo plantillas aprobadas.
El modelo lo sabe (window_expires_at, que se reabre con cada mensaje
entrante) y la API lo expone como canSendFreeform, para que las dos
interfaces bloqueen el compositor en vez de dejar que el envío falle en Meta.
Se bloquea en la interfaz y en el servidor: la interfaz no puede ser la única defensa.
Idempotencia
Meta reintenta los webhooks. webhook_events tiene unicidad sobre
(provider, external_id): sin eso, un solo mensaje aparecería tres veces en la
bandeja.
Firma
Cada webhook se valida con HMAC-SHA256 contra el secreto de la app. Una firma
inválida se registra (signature_ok = false) y no se procesa — un pico de
firmas inválidas es la señal de que alguien está tanteando el endpoint.
Chatbot
Un motor de reglas por palabra clave, no un modelo de lenguaje. Es deliberado: RF-05 pide exactamente cuatro cosas —respuestas frecuentes, alta de incidencia, consulta de estado y derivación— y un modelo generativo añadiría imprevisibilidad sin resolver nada más.
Sólo responde al primer contacto (bot_greeted_at lo garantiza). Un bot
que saluda en cada mensaje es la forma más rápida de que un cliente deje de
escribir.
Las reglas se editan desde Configuración, sin tocar código.
El disparador de RF-02: cuando alguien hace clic en un producto de la fanpage,
el webhook crea el ticket con channel = 'facebook' y guarda la referencia del
producto en source_reference — que es lo que permite saber qué producto
genera consultas.