El Desafío: De la Idea al Producto
Un grupo hotelero necesitaba una herramienta SaaS de marketing que permitiera a cada hotel gestionar sus campañas, promociones y comunicaciones con clientes de forma independiente, pero con administración centralizada.
El Proyecto: Construir desde Cero
Requerimientos Clave
- Multi-tenancy: Aislamiento total de datos entre hoteles
- Escalabilidad: Soportar crecimiento de cientos de hoteles
- Roles complejos: Administradores corporativos, managers de hotel, marketers
- Integraciones: Email marketing, CRM, sistemas de reservas
- Performance: Respuesta rápida incluso con alto volumen de datos
Arquitectura Diseñada
Optamos por una arquitectura multi-tenant estratégica:
┌─────────────────────────────────────────┐
│ API Gateway (Load Balancer) │
└────────────┬────────────────────────────┘
│
┌────────┴────────┐
│ App Frontend │ (React SPA)
│ Multi-tenant │
└────────┬────────┘
│
┌────────┴────────┐
│ Backend API │ (.NET Core)
│ Tenant Router │
└────────┬────────┘
│
┌────────┴────────┐
│ Database │ (PostgreSQL)
│ Row-level │
│ Tenant ID │
└─────────────────┘
Decisiones Técnicas Críticas
1. Multi-tenancy a Nivel de Fila
En lugar de bases de datos separadas por tenant (costoso y difícil de mantener), usamos row-level tenancy:
// Cada query automáticamente filtra por tenant
public class TenantDbContext : DbContext
{
private readonly string _tenantId;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Global query filter
modelBuilder.Entity<Campaign>()
.HasQueryFilter(c => c.TenantId == _tenantId);
}
}
Beneficios:
- Un solo esquema de DB (fácil de actualizar)
- Costos de infraestructura optimizados
- Backups y mantenimiento simplificados
2. Frontend Compartido, Personalizable
Un solo codebase de React que se adapta según el tenant:
// Configuración por tenant
interface TenantConfig {
brandColors: {
primary: string
secondary: string
}
features: {
emailMarketing: boolean
smsMarketing: boolean
socialMedia: boolean
}
limits: {
campaignsPerMonth: number
emailsPerDay: number
}
}
// Hook para acceder a configuración del tenant
const { config } = useTenant()
3. Pipelines DevOps Automatizados
Implementamos CI/CD completo:
# Pipeline simplificado
stages:
- test
- build
- deploy-staging
- smoke-tests
- deploy-production
deploy-production:
script:
- docker build -t app:$CI_COMMIT_SHA .
- kubectl set image deployment/app app=app:$CI_COMMIT_SHA
- kubectl rollout status deployment/app
only:
- main
Features del Pipeline:
- Tests unitarios y de integración automáticos
- Build de Docker images optimizadas
- Deploy a staging automático en cada PR
- Deploy a producción con un click (manual approval)
- Rollback automático si health checks fallan
Stack Tecnológico
Frontend
- React con TypeScript
- Redux Toolkit para state management
- Material-UI con theming dinámico por tenant
- React Query para data fetching
Backend
- .NET Core 6 (Web API)
- Entity Framework Core con multi-tenancy
- SignalR para notificaciones real-time
- Hangfire para jobs background
Infraestructura
- Azure App Service para hosting
- Azure SQL Database con elastic pools
- Azure Blob Storage para assets
- Azure Application Insights para monitoring
- Azure DevOps para CI/CD
Integraciones
- SendGrid para email marketing
- Twilio para SMS
- Stripe para pagos/suscripciones
Desarrollo: Metodología Ágil
Sprints de 2 Semanas
- Planning los lunes
- Daily standups (15 min)
- Demo + Retro los viernes
- Deployment a staging cada sprint
- Release a producción cada 2 sprints
Equipo
- 1 Product Owner
- 3 Developers fullstack
- 1 UX/UI Designer
- 1 QA Engineer
- Yo como Tech Lead
Resultados
Métricas de Negocio
- ✅ Lanzamiento: MVP en 4 meses
- ✅ Adopción: 20 hoteles en el primer año
- ✅ Usuarios: 4,000 usuarios activos
- ✅ Uptime: 99.7% en el primer año
- ✅ Satisfacción: NPS de 72
Métricas Técnicas
- ✅ Performance: Promedio de respuesta < 200ms
- ✅ Deploys: 2 releases por mes sin downtime
- ✅ Bugs críticos: Solo 3 en producción (primer año)
- ✅ Cobertura de tests: 75%
Impacto en Usuarios
- Reducción del 60% en tiempo de creación de campañas
- Aumento del 40% en tasa de apertura de emails
- Centralización de reportes (antes dispersos en Excel)
Aprendizajes Clave
1. Multi-tenancy desde el Día 1
No intentes agregar multi-tenancy después. Diseña tu arquitectura con esto en mente desde el inicio:
- Tenant ID en cada tabla
- Query filters automáticos
- Configuración por tenant en código
2. DevOps No es Opcional
Para un SaaS, tener CI/CD robusto es crítico:
- Deploy frecuente con confianza
- Rollback rápido ante problemas
- Ambiente de staging idéntico a producción
3. Start Simple, Scale Later
No sobre-ingenierices:
- Empezamos con un monolito bien diseñado
- Agregamos microservicios solo cuando fue necesario
- Cloud managed services > infrastructure custom
4. Monitoring desde el Inicio
Implementamos observabilidad desde el MVP:
- Logs estructurados (JSON)
- Application Performance Monitoring (APM)
- Alertas automáticas para métricas clave
- Dashboards para stakeholders
5. Security First en SaaS
Con múltiples tenants, la seguridad es crítica:
- Row-level security (RLS)
- Tests de penetración regulares
- Auditoría de accesos
- Encriptación en tránsito y reposo
De MVP a Producto Maduro
El proyecto no terminó en el lanzamiento. Continuamos iterando:
Fase 2 (Meses 6-12)
- Integración con más proveedores de email
- Analytics avanzados
- A/B testing de campañas
- Mobile app (React Native)
Fase 3 (Año 2)
- Inteligencia artificial para optimización de campañas
- Automatización de workflows
- API pública para integraciones
- White-label para partners
¿Quieres Construir un SaaS?
Si estás planificando construir un producto SaaS y necesitas:
- Arquitectura multi-tenant escalable
- Pipelines DevOps robustos
- Tech leadership experimentado
- Mentoría para tu equipo
Resultado: De una idea a un producto generando valor para 4,000 usuarios en 20 hoteles, con arquitectura escalable y procesos DevOps que permiten iterar rápido y con confianza.


