Proyectos
03Celestina
03En producción130h invertidas

Celestina

APP de gestión + bot de WhatsApp para una distribuidora de agua.

ReactViteSupabaseNode.jsDockerRender
El problema

Una distribuidora de agua gestionaba repartos, cuentas de clientes, inventario, caja y comisiones de repartidores en un Excel desestructurado. Sin automatización: los clientes inactivos se perdían silenciosamente y las deudas vencidas se descubrían tarde o nunca.

La idea

App web mobile-first con dos módulos diferenciados: panel administrativo completo para el dueño (clientes, almacén, caja, comisiones e historial) y vista de reparto para el repartidor (ruta del día, confirmación de entregas y registro de pagos). Más un bot de WhatsApp que corre automáticamente: avisa a clientes sin consumo en 14 días y recuerda deudas vencidas.

El resultado

App en producción con roles diferenciados. El administrador opera desde el panel con visibilidad total de la operación; el repartidor accede solo a su vista de ruta desde el celular. El bot de WhatsApp corre diariamente en Render con Docker y reemplazó el seguimiento manual. Las cobranzas vencidas y el seguimiento de clientes inactivos que antes dependían de revisar el Excel hoy son automáticos. Iteración constante desde el lanzamiento: historial global de transacciones, filtro por mes para ver quién debe qué período puntual, y una corrección de un bug de coma flotante que bloqueaba retiros de caja del repartidor cuando el monto no cerraba exacto. También se sumó un registro independiente para la planta llenadora externa que le provee los bidones al cliente, con su propio stock separado del inventario general.

Arquitectura

Frontend React SPA con dos vistas por rol + bot Node.js completamente independiente. Ambos conectados a la misma instancia de Supabase.

Panel AdminVista completa: clientes, almacén, caja, comisiones e historial de repartos. Solo accesible para el rol admin.
Vista RepartidorMobile-first: ruta del día, confirmación de entregas y registro de pagos. Acceso limitado por rol.
Auth + RolesSupabase Auth con RPC get_my_role(). El rol determina qué módulos ve cada usuario.
Bot WhatsAppNode.js con whatsapp-web.js + Puppeteer. Express dummy server para que Render no lo mate.
Cron + Anti-bannode-cron a las 10 AM. Delays aleatorios entre 65s y 150s entre mensajes para evitar bloqueos.
PersistenciaDocker volume en Render para mantener la sesión de WhatsApp entre reinicios sin re-escanear QR.
Decisiones técnicas

¿Cómo evitar que Render mate el proceso del bot?

elegido

Express dummy server que responde en el puerto que Render requiere

descartado

Background Worker de Render

El plan gratuito de Render requiere un puerto HTTP. El Express sirve solo para mantener vivo el proceso.

Errores reales · lo que salió mal
01

Sin el volumen persistente en Render, cada deploy pedía escanear el QR de WhatsApp de nuevo. Fix: disco persistente montado en el path de LocalAuth.

02

Dos mensajes al mismo cliente en el mismo minuto provocaban ban temporal. Fix: delay aleatorio mínimo de 65 segundos entre envíos.

03

Un bug de precisión de coma flotante en JavaScript hacía que un retiro de caja del repartidor se bloqueara cuando el monto disponible no cerraba con exactitud matemática. Fix: redondeo explícito antes de comparar montos, en vez de comparar floats crudos.

Qué mejoraría

Migrar el bot a WhatsApp Business API oficial para eliminar el riesgo de ban. Agregar geotracking en tiempo real para seguimiento de rutas. Convertir la app en una aplicación nativa (React Native) para mejor experiencia del repartidor en campo. Dashboard de métricas de cobranza y eficiencia de rutas.