Multi-tenant, dirigido por eventos, y aburrido a propósito.
Cada decisión de arquitectura aquí existe porque algo se rompió en producción. Esta página es la lista, con el porqué.
Multi-tenant
El motor no sabe que vende verduras
Catálogo, zonas, precios, cadencias, tono del agente y hasta la escalera de recomendación salen de la configuración del tenant. La escalera ordena las cajas por el precio real del catálogo, nunca por nombres fijos, así que un tenant que venda otra cosa funciona sin tocar código.
Porque el primer prototipo tenía «basica», «media» y «premium» escritos en el código, y eso convierte al segundo cliente en una reescritura.
Workflows durables
Ninguna espera vive en memoria
Esperar un pago 23 horas, pedir feedback días después, retocar un lead la semana siguiente. Cada paso se guarda, cada espera es un temporizador real, y un fallo se reanuda donde iba. Los reintentos son explícitos y una reemisión de link cancela el temporizador viejo por evento.
Porque un timeout en string en vez de fecha colapsó a cero y expiró cada orden de tarjeta un segundo después de crearla, liberando el cupo de entrega.
Plano de hechos
Eventos con esquema, no filas sobreescritas
Cada cambio de estado se escribe como un hecho. Los workflows se suscriben a hechos en vez de consultar tablas, así que un comportamiento nuevo es un workflow más y no una modificación del camino que ya funciona.
Porque atribución de anuncios, feedback y control de calidad necesitaban los mismos momentos del ciclo de vida, y consultarlos por separado los desincronizaba.
CQRS
El agente despacha comandos, no escribe tablas
Las herramientas del agente ejecutan los mismos comandos y consultas que usa el portal de administración. Una regla de negocio existe una sola vez y se aplica igual si la disparó un modelo o un humano dando clic.
Porque cuando el bot y el panel tienen cada uno su camino de escritura, se contradicen en producción y nadie sabe cuál ganó.
Guardrails deterministas
Las reglas críticas no se le piden al modelo
La escalera de cajas, el borrado de precios inventados y el colapso de oraciones duplicadas son funciones puras con pruebas unitarias que corren después de generar y antes de enviar. Una regla en el prompt es una sugerencia; una en código es una garantía.
Porque el modelo recomendaba la caja mediana a hogares de cinco personas — más barata, más fácil de vender, y una mentira.
Ventanas de envío
Un mensaje automático que llega a las 3am cuesta el cliente
Todo envío programado pasa por una compuerta que lo retiene hasta la ventana horaria permitida y verifica que la ventana de WhatsApp esté abierta y que el hilo siga en manos del bot. Un evento produce un envío como máximo.
Porque dos workflows distintos pueden querer recordarle lo mismo a la misma persona, y eso es la vía rápida a que bloqueen el número.
El camino de un pedido
De la primera pregunta a la caja en la puerta. Cada tramo lo ejecuta un proceso propio con su reloj, así que ninguna espera depende de que la conversación siga abierta.
Cada espera tiene su reloj
Los plazos se fijan cuando nace el pedido y no se recalculan después. Un reintento del sistema nunca los alarga ni los acorta.
Vencer no es cancelar
Un pedido sin pagar libera su cupo pero se puede revivir. Cancelar de verdad se reserva para cuando no queda nada que rescatar.
Lo delicado lo mira una persona
Nada que involucre dinero en revisión se resuelve solo. El proceso vuelve a avisarle al encargado y deja el pedido abierto.
Nada de esto sabe que vende verduras.
El catálogo, la geografía, la cadencia y la voz del agente vienen de la configuración del negocio. Loma es el negocio que probó el motor; el siguiente puede vender otra cosa.