Gestclinic
SaaS full-stack para clínicas dentales con app Angular, web pública Next.js y API NestJS multi-tenant con Prisma, PostgreSQL, JWT, RLS, correos y recordatorios automáticos.

Modesto Cabral
Desarrollador
Contexto
Gestclinic es un producto SaaS full-stack orientado exclusivamente a clínicas dentales. El objetivo es centralizar la operativa diaria de una consulta: pacientes, citas, gabinete, historia clínica odontológica, odontograma, consentimientos, facturación, inventario e informes.
El sistema se divide en tres piezas: aplicación clínica interna en Angular, web pública/comercial en Next.js y backend NestJS con API REST para la lógica de negocio, seguridad, persistencia y automatizaciones.
Qué resuelve
- Gestión de pacientes y búsqueda operativa.
- Calendario semanal y gestión de citas.
- Historia clínica dental con evolución, anamnesis y odontograma.
- Consentimientos, plantillas y documentos firmados.
- Personal clínico, usuarios internos y control por roles.
- Facturación, inventario, informes y configuración de clínica.
- Modo plataforma para provisionar clínicas desde un rol
SUPER_ADMIN.
Trabajo técnico
- Aplicación clínica con Angular 21, standalone components, SSR y PWA.
- Web pública con Next.js 16, React 19 y Nx.
- Separación clara entre app operativa, web comercial y librería compartida.
- Autenticación con sesión, guards, interceptor, refresh token y control de roles.
- Integración con API REST externa para módulos clínicos y administrativos.
Backend y arquitectura
El backend vive en un repositorio separado (gestclinic-back) y expone la API bajo /api/v1. Está construido con NestJS 11, Prisma y PostgreSQL.
- API REST modular con controladores finos y lógica en servicios.
- Persistencia con Prisma, migraciones SQL y modelo de datos versionado.
- Autenticación con JWT, Passport y refresh token en cookie
httpOnly. - Guards globales para autenticación y roles (
JwtAuthGuardyRolesGuard). - Multi-tenancy por clínica combinando
clinicId, contexto por petición y RLS en PostgreSQL. AsyncLocalStoragepara transportaruserId,roleyclinicIddurante cada request.- Swagger disponible en desarrollo para documentar y probar la API.
- Docker multi-stage y
docker-composepara Postgres local.
Módulos de negocio
La API da soporte a los módulos principales de una clínica dental:
Auth: login, registro, refresh, perfil, cambio y reset de contraseña.Clinics: configuración de clínica y provisionado de tenants.Patients: pacientes con búsqueda y paginación.Appointments: citas, calendario, conflictos, emails y recordatorios.Medical records: historia clínica dental, odontograma y adjuntos clínicos.Consents: plantillas, documentos firmados, PDF y envío por email.Billing: facturas y resumen económico.Inventory: stock, categorías y resumen inventariable.Reports: KPIs, comparativas y exportación PDF.UsersyStaff: cuentas internas, roles y personal clínico.
Seguridad y automatizaciones
Además de la separación por tenant, el backend incorpora varias capas transversales:
helmet, CORS restringido yValidationPipecon whitelist.PrismaExceptionFilterpara normalizar errores de base de datos.ThrottlerGuardcon límite de peticiones por minuto.- Correos transaccionales con Resend.
- Webhooks de Resend para tracking de entrega.
- Jobs programados con
@nestjs/schedulepara recordatorios de citas 24h antes. - Plantillas de email para confirmaciones, reprogramaciones, cancelaciones, consentimientos y recuperación de contraseña.
Aprendizaje
Un software clínico no puede ser genérico: el dominio dental marca el lenguaje, las prioridades y los flujos. En este caso, la parte más importante no es solo crear pantallas, sino sostener una arquitectura multi-clínica segura, mantenible y preparada para automatizar procesos reales de una consulta.
Compartir proyecto
Si este caso te resulta útil, puedes compartirlo con tu red.
