Caso de estudio · Producto propio · pre-lanzamiento
EscapaYa
Marketplace de reservas de hoteles por horas, con APIs, pagos y notificaciones.
El problema
Hay hoteles con habitaciones disponibles que prácticamente no existen digitalmente.
¿Cómo hacemos que encontrar y reservar unas horas sea sencillo?
EscapaYa reúne reservas por horas, pagos, geolocalización y notificaciones. El backend conecta estas operaciones con la app Flutter y los procesos en segundo plano.
Contexto
Un producto propio, construido de punta a punta: app, web, API, pagos y notificaciones. Está en pre-lanzamiento, así que esta página habla de decisiones, no de métricas.
Mi rol
Producto, arquitectura y código: definir el alcance, diseñar la arquitectura y construir backend, app y web.
Restricciones
- Reintentos e idempotencia en operaciones críticas.
- Disponibilidad por horas, más fina que una reserva por noche.
- Pagos y notificaciones conectados mediante APIs y procesos asíncronos.
- Mobile first: la reserva ocurre en el celular.
Arquitectura
Esquema explicativo basado en el stack del producto. Los flujos ilustran cómo se conectan APIs, datos, colas y notificaciones. Toca una pieza para entender su función.
App · Flutter
- Qué resuelve
- La app de reservas para Android e iOS.
- Por qué existe
- Un solo código para las dos plataformas. Una reserva por horas se hace en el celular, muchas veces el mismo día.
- Qué otra opción había
- Dos apps nativas: el doble de trabajo para un equipo chico.
Web · Next.js
- Qué resuelve
- La web pública: búsqueda, fichas de hoteles y páginas para buscadores.
- Por qué existe
- Quien busca un hotel por horas llega desde Google: las páginas tienen que existir para los buscadores.
- Qué otra opción había
- Una SPA sin render en servidor: invisible para SEO.
Borde · Cloudflare
- Qué resuelve
- La puerta de entrada: caché, TLS y una primera capa contra abuso.
- Por qué existe
- Imágenes y páginas cerca del usuario, sin cargar el servidor con lo que no cambia.
- Qué otra opción había
- Servir todo desde el origen.
API · NestJS
- Qué resuelve
- Un solo punto de entrada para app y web: autenticación, validación y reglas de cada request.
- Por qué existe
- Módulos claros dentro de una sola aplicación: se despliega y se opera como una pieza.
- Qué otra opción había
- Microservicios desde el día uno: demasiada operación para un producto en pre-lanzamiento.
Reservas · NestJS modules
- Qué resuelve
- El dominio: hoteles, habitaciones, disponibilidad por horas y reservas.
- Por qué existe
- Acá vive la regla difícil: que dos personas no reserven la misma habitación a la misma hora.
- Qué otra opción había
- Lógica en procedimientos de la base de datos: difícil de testear y de cambiar.
Base de datos · PostgreSQL · Prisma
- Qué resuelve
- La fuente de verdad: hoteles, habitaciones y reservas.
- Por qué existe
- Transacciones y restricciones para que una reserva nunca se duplique.
- Qué otra opción había
- Una base NoSQL: más flexible, sin las garantías que pide una reserva.
Caché · Redis
- Qué resuelve
- Lo que se consulta seguido y cambia poco: disponibilidad reciente, sesiones.
- Por qué existe
- Responde rápido sin tocar la base de datos en cada búsqueda.
- Qué otra opción había
- Ir siempre a la base de datos.
Archivos · Object storage
- Qué resuelve
- Fotos de hoteles y habitaciones.
- Por qué existe
- Los archivos grandes fuera de la base de datos, servidos por el borde.
- Qué otra opción había
- Guardarlas en el servidor: no escala y complica cada deploy.
Colas · BullMQ
- Qué resuelve
- El trabajo que no cabe en el request: confirmaciones, recordatorios, vencimientos.
- Por qué existe
- Nadie espera a que salga un mensaje, y si algo falla se reintenta solo.
- Qué otra opción había
- Cron con polling, o un broker aparte. BullMQ reutiliza Redis, que ya estaba.
Avisos · FCM · WhatsApp
- Qué resuelve
- Avisos al usuario y al hotel.
- Por qué existe
- Una reserva por horas es inmediata: el hotel tiene que enterarse ya.
- Qué otra opción había
- Solo email: llega tarde y nadie lo lee a tiempo.
Pagos · Payment provider
- Qué resuelve
- El cobro de la reserva, con un proveedor de pagos.
- Por qué existe
- El dinero lo maneja un tercero certificado; la API solo guarda el estado del pago.
- Qué otra opción había
- Cobrar en el hotel: más fricción y más reservas que nunca llegan.
Resultados
Pre-lanzamiento. Sin métricas públicas todavía: cuando existan datos reales, van acá.