← Volver a trabajos realizados

Caso de estudio · Full-stack

Bonita Yo Estética

Turnero online, panel de gestión y caja para un consultorio de estética real en San Nicolás. Lo diseñé, desarrollé y sigo manteniendo en producción de punta a punta: base de datos, seguridad, frontend y despliegue.

  • React + Vite
  • Supabase
  • PostgreSQL
  • Row Level Security
  • Supabase Storage
  • GitHub + Netlify CI/CD
Turnero público de Bonita Yo: formulario para pedir un turno

El turnero público: la clienta elige uno o varios servicios —se suman costo y duración— y un horario donde entra la sesión completa, sin que la web vea nunca datos de otras pacientes.

El contexto

Ana, la dueña del consultorio, coordinaba los turnos a mano y necesitaba algo más: un lugar único donde cargar pacientes, tratamientos y productos clasificados por zona corporal o facial, una caja real con ingresos y egresos, y que las clientas pudieran pedir turno solas sin la ida y vuelta de siempre por WhatsApp — pero sin exponer la agenda completa del consultorio en una web pública.

Mi rol

Full-stack, solo: diseño del esquema de base de datos y de las políticas de seguridad en Supabase, la portada pública y el turnero, el panel de gestión completo (pacientes, turnos, tratamientos, productos, caja y solicitudes), el recorte automático de fotos y el flujo de confirmación de turnos por WhatsApp. Sigue en desarrollo activo.

Arquitectura

Supabase como backend completo otra vez, pero acá el frontend es React en vez de HTML plano: son seis pantallas (portada, turnero, tratamientos, productos, panel y confirmación) que comparten estado y se actualizan en tiempo real entre sí. La web pública nunca consulta datos de pacientes directamente: solo llama funciones puntuales que devuelven qué horarios están ocupados.

  1. Portada y turnero — React + Vite, rutas públicas sin necesidad de login.
  2. Panel de gestión — mismo proyecto, protegido con usuario y contraseña.
  3. Supabase — PostgreSQL, autenticación, Storage y funciones de seguridad como backend completo.
  4. Row Level Security — sin sesión de admin válida, no hay acceso a los datos reales del consultorio.
  5. GitHub → Netlify — cada git push a main despliega todo automáticamente.

Problemas que resolví

Casos límite reales, no ejercicios de tutorial

Turnos que no se pisan

Cada tratamiento tiene su propia duración en minutos; al agendar, la app avisa si se superpone con otro turno antes de confirmarlo.

Varios servicios, un solo horario

La clienta puede elegir más de un servicio en el mismo pedido: se suman el costo y la duración, y se busca un horario donde entre la sesión completa.

Confirmación sin exponer la agenda

El pedido queda retenido 12 horas y llega por WhatsApp con un enlace propio. Al abrirlo con la sesión del consultorio iniciada, se confirma o se rechaza, y recién ahí se le avisa a la clienta.

Fotos que se recortan solas

Al subir una foto de "Quién soy" o de un tratamiento, se recorta sola a formato vertical 4:5 (800×1000) y se guarda en Supabase Storage, sin pasar por ningún editor externo.

Catálogo clasificado, no una lista plana

Cada tratamiento y producto se clasifica como corporal o facial; sin clasificar, directamente no aparece en la web pública.

Caja con ingresos y egresos reales

Ingresos por sesión más movimientos manuales de ingresos y egresos, con balance diario, semanal y mensual, editable desde el panel.

Panel de gestión de Bonita Yo: pantalla de acceso

El panel: sin ningún enlace desde la web pública, se entra escribiendo la dirección y con usuario y contraseña. Row Level Security bloquea cualquier consulta sin esa sesión.

Stack técnico

  • FrontendReact + Vite — elegido por la cantidad de pantallas con estado compartido
  • BackendSupabase: PostgreSQL, Auth, Storage, Row Level Security
  • ComunicaciónConfirmación de turnos por WhatsApp, con enlaces únicos por solicitud
  • InfraestructuraGitHub + Netlify, con despliegue continuo en cada push a main
¿Por qué con framework esta vez? En Lumil y en LB Barber Studio elijo HTML plano porque alcanza y sobra. Acá no: son seis pantallas que comparten estado entre sí y se actualizan en tiempo real — portada, turnero, tratamientos, productos, panel y confirmación. Esa es justo la señal que uso para justificar la complejidad extra de un framework.

¿Te sirve algo así?

Hablemos de tu proyecto

Si tu negocio necesita turnos online, un catálogo propio o una caja real, te cuento cómo lo encararía.

Contame tu proyecto