GoFeels · Ingeniero Full-Stack Senior / Líder técnico · desde 2020
Un PMS hotelero: sobreventas, releases y endurecimiento
Rastreé sobreventas hasta una sincronización saliente de disponibilidad obsoleta, reconstruí el pipeline de release de más de 30 minutos a unos 7 y ejecuté un programa proactivo de endurecimiento de seguridad en un PMS usado por más de 150 hoteles.
- PHP
- Laravel
- AngularJS
- MySQL
- Docker
- CI/CD
Los nombres de clientes, hoteles y canales se omiten. Este caso describe solo el trabajo y sus resultados.
Problema
Un PMS hotelero no vende habitaciones solo. Cada propiedad también vende a través de agencias de viaje en línea, así que cada reserva, cancelación y cambio de tarifa tiene que llegar rápido a cada canal conectado y mantenerse correcto. Se reportaban sobreventas y el rastro terminaba en la sincronización saliente de disponibilidad: un envío podía fallar, o una actualización posterior podía procesarse antes que una anterior, y el canal seguía mostrando disponibilidad que el PMS ya había vendido.
La misma plataforma había crecido durante años sin una inversión equivalente en entrega y seguridad. Un release tardaba más de 30 minutos y dependía de pasos manuales, y el frontend del PMS arrastraba vulnerabilidades críticas y altas en dependencias: 2/44.
Decisiones
El channel manager tenía que dejar de tratar cada envío como fire-and-forget. Reconstruí la sincronización saliente como un outbox transaccional: cada cambio de disponibilidad o tarifa se registra primero, se colapsa al último estado por propiedad y fecha, y solo se marca como enviado cuando el canal lo confirma. Eso eliminó el problema de orden e hizo auditable cada envío.
Aislé los canales entre sí y convertí los envíos fallidos en fechas sucias que se reintentan con backoff, para que un canal no deje obsoletos a los demás. Los envíos se agrupan por rango de fechas y se registran de punta a punta.
Hice aburridos los releases: imágenes Docker con lockfiles estrictos, versiones, rollback en un paso y una suite end-to-end como puerta de cada release.
Extraje los componentes compartidos de CI que hoy usan todos los repositorios (linting, análisis estático, escaneo de secretos, auditorías de dependencias) y añadí una puerta de revisión con IA en cada merge request.
Ejecuté un programa proactivo de endurecimiento de seguridad: 2FA, política de seguridad de contenido, sesiones por cookie en vez de tokens en el almacenamiento del navegador, escaneo y rotación de secretos, redacción PCI de datos de tarjeta almacenados y auditorías de dependencias en CI.
Mantuve el frontend AngularJS funcionando mientras planificaba su salida por fases, en vez de apostar la hoja de ruta a una reescritura.
Resultado
La disponibilidad entre canales se mantiene en sincronización continua y desapareció la ruta de disponibilidad obsoleta que causaba las sobreventas.
Más de 150 hoteles con más de 2.000 habitaciones gestionan en la plataforma sus reservas, pagos y operación diaria. Acumula más de 750.000 reservas de habitaciones y unas 13 veces el volumen anual de reservas de 2020 para 2025.
Decenas de miles de pagos en línea al año pasan por el motor de reservas y los enlaces de pago.
Los releases tardan unos 7 minutos en vez de más de 30, con rollback en un paso.
Las vulnerabilidades críticas y altas en dependencias del frontend del PMS pasaron de 2/44 a 0/1.