COMAL · 04-user-flows.md · 5 de 21

En esta página Convenciones 0%

04 — Flujos de usuario · COMAL

Convenciones

  • TZ: Europe/Madrid
  • Slot: 1 hora; reserva mínima configurable (default 2 h)
  • Idempotencia: Idempotency-Key en pago y creación de reserva

F1 — Descubrimiento → Landing → Explorar

EntradaSEO, ads, link compartido, /
PasosVer hero → CTA Explorar → Listado con geo default ciudad
ResultadoUsuario en explorar (auth opcional para ver precios completos: decisión — precios visibles sin auth)
Analyticslanding_view, cta_explore_click

F2 — Registro / Login

Registro

  1. Email + contraseña (min 10 chars) o Google OAuth
  2. Nombre y teléfono
  3. Rol inicial: Cocinero (default) u Operador (ruta separada)
  4. Aceptación términos + privacidad
  5. Verificación email (magic link)
  6. Onboarding: ciudad, equipos frecuentes, aviso legal producción

Errores: email en uso, contraseña débil, OAuth cancelado
Recuperación: mensaje + link a login

Login

Email/password o Google · “Recordarme” · link olvidé contraseña

Recuperación contraseña

Email → link 30 min → nueva contraseña → sesión invalidada en otros dispositivos

Analytics: sign_up, login, password_reset_request


F3 — Explorar y filtrar

  1. Listado ordenado por distancia o relevancia
  2. Abrir filtros → aplicar chips equipo / precio / horario
  3. Vacío → empty state
  4. Tap en card → ficha

Estados: loading skeleton, error red, empty, resultados

Analytics: search_filter_apply, listing_impression, listing_click


F4 — Reserva end-to-end (crítico)

Ficha → Reservar → Fecha → Slots → Resumen → Pago → Confirmación
PasoUIReglas
FechaCalendario 14–60 días vistaNo pasado; lead time min 2 h
SlotsGrid horasSolo disponibles; selección contigua
ResumenCocina, estación, horas, €Desglose IVA, descuento membresía
PagoStripe Payment Element3DS si aplica
OKID reserva, ICS, QR previewEmail + push opcional

Decisiones en branch:

  • Slot se ocupa entre resumen y pago → error “ya no disponible” + reembolso si cargo
  • Pago falla → reintentar; no crear reserva
  • Usuario cierra → carrito no persistente (slots no hold largos); hold 10 min opcional v1.1

Analytics: booking_start, slot_select, checkout_start, payment_success|fail, booking_confirmed


F5 — Check-in

  1. Desde Mis reservas o tab Acceso
  2. Ventana: desde 15 min antes hasta fin de franja
  3. Muestra QR + PIN de 6 dígitos
  4. Operador escanea o introduce PIN en /ops/checkin
  5. Estado → “En curso”

Offline: PIN visible si reserva cacheada; validación operador puede ser manual
Error: fuera de ventana; reserva cancelada; PIN revocado


F6 — Cancelación

  1. Detalle reserva → Cancelar
  2. Mostrar política y importe reembolsable
  3. Confirmar
  4. Reembolso Stripe (parcial/total) async
  5. Slot liberado

Analytics: booking_cancel, refund_initiated


F7 — Membresía

Planes:

  • Sin plan: pay-as-you-go
  • Base (29€/mes): 10 % dto, soporte prioritario
  • Pro (59€/mes): 15 % dto, hold prioritario, 1 cancelación flexible/mes

Flujo: ver planes → Stripe Subscription → badge en UI


F8 — Operador: bloqueo y dashboard

  1. Login rol operador
  2. Dashboard: estaciones del día, llegadas, ocupación %
  3. Bloquear franja: motivo + rango
  4. Slots dejan de venderse

Estados de UI transversales

EstadoComportamiento
Empty listadoIlustración industrial + “Ampliar zona o quitar filtros”
LoadingSkeletons, no spinners de página completa en móvil
Error redBanner + Reintentar
ValidaciónInline bajo campo, aria-invalid
403“No tienes acceso” + volver
Sesión expiradaModal → re-login, preservar deep link
Sin resultadosEmpty específico
Pago parcialNo aplica (all-or-nothing)
DestructivoModal confirmación cancelar/borrar cuenta
UndoToast 5 s solo en favoritos (no en pagos)

Eventos analíticos (lista maestra)

Ver 12-analytics.md.