← Todos los proyectos

Psic. María Fernanda Ramírez

Plataforma de agendamiento white-label para consultorios de psicología — reserva pública con Google Calendar + Meet, portal del paciente sin login y branding por configuración. NestJS 11 + Prisma + Angular 22, en producción para una psicóloga clínica en Guadalajara.

NestJSPrismaPostgreSQLAngularRedisSSR

Un consultorio de psicología vive de las citas, pero las agenda como puede: un chat de WhatsApp, una libreta y la cabeza de la persona que contesta. El paciente que quiere reagendar a las once de la noche no puede; el recordatorio depende de que alguien se acuerde de mandarlo; y la sesión en línea es otro mensaje más con un link pegado a mano. Remanso es una plataforma de agendamiento white-label para consultorios de psicología y terapia que convierte todo eso en un solo flujo — y su primer despliegue está en producción para una psicóloga clínica en Guadalajara, en psicfernandaramirez.com.

Qué hace

Cubre el ciclo completo de una cita, desde que el paciente la reserva hasta que entra a la sesión:

  • Reserva pública. El paciente elige servicio, modalidad (presencial o en línea), consultorio cuando hay varios, y un horario disponible — todo sin crear cuenta. La disponibilidad se calcula contra la agenda real, no contra una lista estática.
  • Portal del paciente por código. Cada cita genera un código. Con él, el paciente cancela o reagenda sin login, descarga el evento a su calendario (.ics) y guarda el contacto del consultorio (.vCard) — sin contraseñas que olvidar.
  • Google Calendar + Meet automáticos. Cuando la psicóloga conecta su Google, cada cita confirmada crea el evento en su calendario, y las sesiones en línea generan su enlace de Meet sola — sin pegar links a mano.
  • Pase en la wallet del teléfono. El paciente agrega su cita a Apple Wallet o Google Wallet —según su dispositivo— como un pase generado bajo demanda, con la hora, el lugar y el enlace de la sesión.
  • Correo transaccional con marca + recordatorios. Confirmaciones, reagendas y recordatorios salen como correo con la marca del consultorio, y los recordatorios se programan en segundo plano para que lleguen a tiempo.
  • WhatsApp click-to-send. Para lo que de verdad conviene un humano, un botón abre WhatsApp con el mensaje ya armado — sin integrar una API pesada para un MVP.

Por dentro

Remanso está construido alrededor de una idea: el producto es uno, pero cada consultorio lo ve como suyo. Todo lo interesante de la arquitectura sale de tomar esa decisión en serio.

White-label de verdad, dirigido por configuración. El nombre del cliente no está escrito en el código en ningún lado. La marca — nombre del consultorio, colores, contacto, servicios, horarios — vive en configuración y variables de entorno, así que montar un consultorio nuevo es cambiar config, no bifurcar la base. Eso obliga a una disciplina sana: si un nombre de cliente se cuela en una plantilla o un correo, es un bug, no una opción.

El paciente nunca se autentica. Toda la experiencia del paciente — reservar, cancelar, reagendar, descargar la cita — funciona contra un código público por cita, no contra una cuenta. Es deliberado: nadie va a crear un usuario para pedir una cita de terapia, y obligar a hacerlo es la forma más segura de perder la reserva. El código es la credencial, con su propio alcance acotado en el servidor.

Integración con Google bien encapsulada. La conexión con Google Calendar y Meet pasa por OAuth, con el token de la psicóloga guardado del lado del servidor, y un modelo de integración propio que el panel de admin enciende y apaga. La creación del evento y el Meet ocurren cuando la cita se confirma — no en el camino del request del paciente.

El pase de Wallet, reusado con cuidado. El paciente guarda su cita en Apple Wallet (un .pkpass firmado) o en Google Wallet, según su teléfono. Ambos pases se portaron desde otro de mis productos y comparten el mismo issuer y credenciales, pero llevan un prefijo guard que separa a Remanso de cualquier otra cosa que viva bajo ese issuer. Reusar infraestructura es barato; reusarla sin aislamiento es cómo terminas con el pase de un producto apareciendo en otro.

El trabajo lento sale del request. Los recordatorios y el correo corren en colas sobre Redis (Bull), programados con offsets configurables. La reserva del paciente responde rápido; el sistema se encarga de avisar a tiempo en segundo plano.

Horario consistente en UTC. Las horas de pared se manejan con un criterio único de zona horaria de punta a punta, para que la cita que el paciente ve, la que cae en el calendario de la psicóloga y la que viaja en el .ics y el pase sean la misma hora — sin el clásico desfase de una hora que aparece cuando cada capa interpreta la fecha a su modo.

El stack

  • Frontend — Angular 22 con renderizado en servidor (SSR) y Tailwind 4, con una interfaz de estilo acuarela y “liquid glass”; internacionalización con Transloco; calendario de reserva propio (sin dependencia), generación de .ics y .vCard.
  • Backend — NestJS 11 en TypeScript estricto sobre Node.js, API REST.
  • Datos — PostgreSQL vía Prisma; Redis para colas de trabajos Bull (recordatorios y correo).
  • IntegracionesGoogle OAuth + Calendar + Meet (eventos y sesiones en línea automáticos), Apple Wallet + Google Wallet (pase de la cita según el dispositivo), Resend para correo transaccional con marca sobre HTTPS, y WhatsApp click-to-send.
  • Branding — configuración white-label por cliente (nombre, colores, contacto, servicios, consultorios y disponibilidad) vía config y variables de entorno.
  • Plataforma — backend en Railway (con Postgres y Redis administrados), frontend en Firebase App Hosting con dominio propio; migraciones de Prisma al arrancar.

Vale la pena saber

Construí Remanso de punta a punta — el frontend, el backend, el modelo de datos, las integraciones con Google, la capa white-label y el despliegue — y su primer cliente está en producción. La decisión que define el proyecto no es ninguna integración en particular: es que está pensado como producto, no como un sitio para un solo cliente. Rebrandear para el siguiente consultorio es configuración, no un fork.

Y donde tenía sentido para un MVP, elegí lo simple a propósito: WhatsApp manual y correo transaccional (Resend) en lugar de integraciones pesadas, porque el trabajo de un primer despliegue es validar el flujo que crea valor — reservar, recordar, llegar a la sesión — no acumular plomería que nadie pidió todavía.

¿Un café y platicamos?

¿Te gustó lo que leíste? Construyo productos así de punta a punta — y siempre estoy para una buena plática. Hablemos del tuyo, o nomás intercambiamos ideas con un café.