Proyecto
Sitafacil
Agenda y catálogo para negocios de servicios, multi-tenant, en producción.
- Año
- 2025
- Rol
- Full-stack
- Equipo
- 1
- Stack
- Next.jsFastifytRPCPostgreSQLResendDocker

01
El problema
Un negocio de servicios con dos sedes llevaba el agendamiento en papel: citas, fechas, nombres y pagos. No había un solo lugar para el flujo ni para mostrar servicios y paquetes. Si el recorte servía a un local, no servía como producto: hacía falta que varios negocios operaran en tiempo real sobre la misma plataforma.
02
Decisiones técnicas
Recabé el flujo de agendamiento y lo modelé en una app propia. Lo gestioné solo: requisitos, diseño y cada iteración. Usé herramientas de IA para validar ideas y recortes, no para saltarme el modelo. El esquema es multi-tenant desde el principio.
Multi-tenant desde el primer modelo
El caso inicial eran dos locales de un negocio. El producto tenía que admitir varios negocios a la vez, no una instalación por cliente.
Next.js + Fastify + tRPC + PostgreSQL
La UI y el servidor van separados; tRPC mantiene el contrato tipado entre ambos. Postgres guarda tenants, agenda, servicios y paquetes. Resend cubre el correo.
Docker y CI/CD en GitHub
Las imágenes se construyen en pipeline y se despliegan en infra propia. Definir ese flujo fue la parte del proyecto que más me importó: un push no puede ser un deploy a mano.
03
Interfaz
Web. El negocio publica servicios y paquetes y opera la agenda (citas, fechas, pagos) en un solo lugar. Varios tenants en la misma instalación. La imagen principal y la galería salen de la marca en producción (Open Graph, lockup e isotipo). Aún no hay capturas de la interfaz.

04
Resultado
2
sedes del caso inicial
Live
sitafacil.com
La demo está en sitafacil.com. El recorte sale de un flujo real (papel, dos locales), no de un brief inventado. No hay cifra de tenants ni de reservas publicada aquí.
05
Aprendizajes
El trabajo que más me dejó fue el CI/CD en GitHub: build de imágenes Docker y despliegue repetible. También: un caso de un solo negocio no se modela como tenant único si el producto va a ser plataforma. Recabar el flujo (citas, pagos, paquetes) antes de escribir código evitó un CRUD genérico.