Ir al contenido

Roles y permisos

EMA Well se diseñó como producto B2C: cada cuenta corresponde a una sola persona y nadie administra cuentas de otra. Esa decisión elimina toda la complejidad de roles que aparece en los productos institucionales del ecosistema (Clinic, Lab, Vault) y la reemplaza por una distinción simple basada en el tier de suscripción. La diferencia entre Free y Pro define qué features están disponibles, no qué partes del producto puede ver una persona.

Las dos categorías de usuario son Free y Pro, con la diferencia acotada a las features que requieren cómputo más caro o flexibilidad mayor. El plan Free no es una versión inutilizada del producto: el ciclo completo —onboarding, check-in diario, programa de doce semanas, racha y achievements— está disponible. Lo que Pro agrega es lo que no se puede entregar gratis a escala:

  • Pilares ilimitados en lugar del límite de cuatro de Free.
  • Acceso a Claude durante el onboarding (entre cinco y ocho preguntas con generación personalizada de pilares) y para sugerencias diarias.
  • Una congelación de racha al mes, que permite proteger un día perdido cuando la vida lo requiere.
  • Export FHIR del Bundle completo de observaciones del usuario.
  • Coaching EMI vía el agente especializado.

EMA Well no expone un dashboard de administración dentro de la app. La operación interna —soporte de cuentas, revisión de casos puntuales, validación de billing— se hace desde Supabase directamente o desde EMA Vault cuando aplica, no desde el producto mismo. La integridad de los datos individuales está protegida por RLS estricta, no por una capa de admin que pudiera ser comprometida. La consecuencia es que ningún empleado de EMA Health puede ver los datos personales de un usuario sin acceso de Postgres explícito y auditado.

La asignación del tier es automática y se mantiene en la columna subscriptions.tier de la tabla correspondiente. La tabla siguiente resume los tres eventos que cambian el tier:

EventoResultado
Usuario nuevo sin suscripcióntier = free (default)
Stripe webhook confirma pagotier = pro
Cancelación de suscripcióntier = free al final del período

La cancelación es un caso interesante: en lugar de revocar el acceso inmediatamente, el sistema mantiene tier = pro hasta que termine el período pagado. El usuario que canceló sigue teniendo features Pro durante esos días y no pierde funcionalidad de forma abrupta.

Los endpoints sensibles validan el tier antes de habilitar features Pro. La verificación se hace en cada request, no en login, lo que permite que una conversión de Free a Pro produzca features activas inmediatamente sin necesidad de cerrar sesión:

  • Crear el quinto pilar (Free queda bloqueado, Pro se permite).
  • Activar el freeze de racha (solo Pro).
  • Disparar la sugerencia diaria por IA (solo Pro).
  • Solicitar el export FHIR (solo Pro).

Si una cuenta Free intenta una acción Pro, el endpoint responde con HTTP 402 (Payment Required) y el frontend muestra el modal de upgrade con el mismo diseño side-by-side de la página /upgrade.