¿Qué son los ingresos estimados?
El Dashboard muestra una proyección de los ingresos del día basada en:- Precio de los servicios agendados
- Citas completadas (no confirmadas)
- NO son pagos reales ni transacciones bancarias
¿Cómo se calculan?
Paso 1: Filtrar citas completadas
El sistema busca todas las citas con:clinic_id = tu_clinicaDATE(start_datetime) = HOYstatus = COMPLETED
Paso 2: Multiplicar por precio del servicio
Para cada servicio, obtiene el precio de la tablaservices:
| Servicio | Precio | Citas | Subtotal |
|---|---|---|---|
| Corte de pelo | €15 | 8 | €120 |
| Tinte | €45 | 2 | €90 |
| Barba | €10 | 5 | €50 |
| TOTAL | 15 | €260 |
Paso 3: Sumar todos los subtotales
El cálculo se ejecuta cada vez que se actualiza el Dashboard (cada 5 minutos).
Estados de citas y facturación
¿Qué citas cuentan?
| Estado | Cuenta para ingresos? | Razón |
|---|---|---|
CONFIRMED | ❌ NO | Aún no se completó, puede cancelarse |
COMPLETED | ✅ SÍ | Servicio ya prestado |
CANCELLED | ❌ NO | Cita cancelada, no hubo ingreso |
Transición automática a COMPLETED
El sistema marca citas comoCOMPLETED cada 60 segundos:
Desglose por servicio
Vista detallada (en desarrollo)
Actualmente el Dashboard muestra solo el total agregado (ej: €260). Mejora futura: Tabla de desglose por servicio:| Servicio | Citas | Precio Unitario | Subtotal |
|---|---|---|---|
| Corte de pelo | 8 | €15 | €120 |
| Tinte | 2 | €45 | €90 |
| Barba | 5 | €10 | €50 |
| TOTAL | 15 | €260 |
¿Necesitas este desglose ahora? Usa la API
/v1/dashboard/stats y procesa el JSON manualmente.Comparación con ingresos reales
Escenario 1: Inasistencias (no-shows)
Problema: Cita se marca comoCOMPLETED pero el paciente no vino.
Ejemplo:
- Cancelar manualmente la cita (cambia a
CANCELLED) - Esto elimina los €15 de “Ingresos Estimados”
- Opcional: Agregar nota en perfil del paciente
Escenario 2: Descuentos o promociones
Problema: Aplicaste descuento del 20% pero el sistema suma precio completo. Ejemplo:- Opción A (recomendada): Crear servicio temporal “Tinte con descuento” (€36)
- Opción B: Registrar descuentos manualmente en hoja de cálculo externa
- Opción C: Esperar integración con sistema de cobros (Stripe, TPV)
Los descuentos NO están implementados en el sistema. Si los aplicas frecuentemente, considera crear servicios duplicados con diferentes precios.
Escenario 3: Pagos parciales o adelantos
Problema: Cliente pagó €20 de adelanto para un tinte de €45. Ejemplo:- El sistema NO gestiona adelantos
- Debes llevar registro manual (ej: Excel, cuaderno)
- Los “Ingresos Estimados” reflejan el precio total (€45), no el adelanto (€20)
Casos de uso comunes
Escenario 1: Proyectar facturación del día
Objetivo: Al iniciar el día, estimar cuánto facturarás. Pasos:- Abre el Dashboard a las 09:00
- Revisa “Citas Confirmadas”: 18 citas
- Calcula precio promedio: €15 (mayoría son cortes de pelo)
- Proyección: 18 citas × €15 = €270 estimados
- A lo largo del día, las citas se completan automáticamente
- A las 20:00, revisas: “Ingresos Estimados”: €245
- Análisis: Facturaste €25 menos de lo esperado (1 inasistencia + 1 cancelación)
Escenario 2: Identificar servicios más rentables
Objetivo: Saber qué servicios generan más ingresos. Pasos:- Exporta datos del Dashboard usando la API:
- Procesa el JSON para agrupar por servicio
- Resultado:
- Corte de pelo: 8 citas × €15 = €120 (46%)
- Tinte: 2 citas × €45 = €90 (35%)
- Barba: 5 citas × €10 = €50 (19%)
- Conclusión: Los cortes generan más volumen, pero los tintes tienen mejor margen
- Acción: Promocionas los tintes en redes sociales para aumentar demanda
Escenario 3: Comparar ingresos entre días
Objetivo: Identificar días de mayor/menor facturación. Pasos:- Lunes: Dashboard muestra €320 estimados
- Martes: €180 estimados
- Miércoles: €450 estimados
- Conclusión: Los miércoles son tu día más rentable
- Acción:
- Planificas promociones para los martes (día lento)
- Evitas cerrar los miércoles (día pico)
Para análisis histórico robusto, necesitas exportar datos a Excel o implementar reportes (funcionalidad futura).
Optimización de ingresos
Estrategia 1: Aumentar ticket promedio
Objetivo: Subir el ingreso por cita de €15 a €20. Tácticas:- Upselling: Ofrecer servicios complementarios
- Corte de pelo (€15) + Barba (€10) = €25
- Paquetes: Crear combos con descuento
- “Corte + Barba + Ceja” = €30 (ahorro de €5 vs precio individual)
- Servicios premium: Añadir opciones más caras
- Corte básico (€15) vs Corte + tratamiento capilar (€25)
Estrategia 2: Aumentar volumen de citas
Objetivo: Pasar de 15 citas/día a 20 citas/día. Tácticas:- Reducir duración de servicios: Optimizar procesos para atender más rápido
- Corte actual: 30 min → Corte optimizado: 20 min
- Capacidad: 20 citas/día (10h × 60min / 20min = 30 slots, asumiendo 66% ocupación)
- Contratar más personal: Añadir un segundo peluquero
- Capacidad: 15 citas × 2 peluqueros = 30 citas/día
- Ampliar horario: Abrir 1 hora más temprano o cerrar 1 hora más tarde
- Horario actual: 10:00-20:00 (10h)
- Horario ampliado: 09:00-21:00 (12h) → +20% capacidad
Estrategia 3: Reducir inasistencias
Objetivo: Reducir no-shows del 10% al 5%. Tácticas:- Recordatorios automáticos: WhatsApp 24h antes de la cita
- Implementado: Sistema envía recordatorios (job del scheduler)
- Confirmación obligatoria: Pedir confirmación 2h antes
- “Confirma con SÍ para mantener tu cita de las 15:00”
- Política de adelantos: Cobrar €5 al agendar (descontado del total)
- Ejemplo: Cita de €15 → Adelanto €5 → Pago final €10
- Reduce inasistencias porque el cliente ya pagó algo
Integración con sistemas de cobros
Problema actual
El Dashboard muestra “ingresos estimados” pero NO rastrea:- ¿El cliente pagó en efectivo, tarjeta o Bizum?
- ¿Pagó el total o parcial?
- ¿Dejó propina?
- Sistema de TPV (Terminal Punto de Venta)
- Stripe / PayPal para pagos online
- Software de contabilidad (ej: Holded, Sage)
Integración futura con Stripe
Flujo propuesto:- Cita se completa → Estado:
COMPLETED - Sistema genera “Payment Intent” en Stripe (€15 para el corte)
- Cliente paga con tarjeta en el local (TPV físico o link de pago)
- Stripe confirma el pago → Webhook actualiza cita con
payment_status: PAID - Dashboard muestra:
- Ingresos estimados: €15 (basado en servicio)
- Ingresos confirmados: €15 (basado en pago real)
- Reconciliación automática (ingresos estimados vs reales)
- Tracking de inasistencias (citas completadas pero no pagadas)
- Reportes financieros exportables
Esta integración está en el roadmap pero no implementada. Si la necesitas, contacta a soporte para planificar desarrollo.
Reportes históricos
Exportar datos vía API
Para analizar ingresos de períodos más largos (semana, mes, año), usa la API: Endpoint:GET /v1/dashboard/stats?clinic_id={id}&start_date={date}&end_date={date}
Ejemplo:
- Descarga el JSON
- Impórtalo a Excel / Google Sheets
- Crea gráficos de tendencia (línea de tiempo de ingresos)
Reportes automáticos (en desarrollo)
Funcionalidades planificadas:- 📊 Dashboard de reportes: Vista dedicada con gráficos
- 📅 Filtros por rango de fechas: Semana, mes, trimestre, año
- 📈 Gráfico de tendencia: Línea de tiempo de ingresos diarios
- 📊 Desglose por servicio: Pie chart de distribución de ingresos
- 📊 Desglose por proveedor: Comparar productividad de peluqueros
- 📄 Exportar a PDF/Excel: Descarga reportes para contabilidad
¿Necesitas reportes avanzados urgentemente? Usa la API para extraer datos crudos y procésalos en Excel.
Solución de problemas
Ingresos estimados no coinciden con registros manuales
Diagnóstico:- Verifica estados de citas: Solo
COMPLETEDcuentan - Verifica precios de servicios: Asegúrate de que coincidan
- Verifica zona horaria: La fecha “hoy” depende de
CLINIC_DEFAULT_TZ
Ingresos estimados no aumentan aunque completo citas
Causas posibles:- Job del scheduler no corre: Las citas no se marcan como
COMPLETED - Cita sin servicio asignado: Si
service_id IS NULL, el precio es €0 - Cache del Dashboard: Espera 5 minutos para actualización automática
Ingresos estimados están inflados
Causas posibles:- Citas de inasistencias no canceladas: Marcadas como
COMPLETEDpero cliente no vino- Solución: Cancela manualmente las citas (cambia a
CANCELLED)
- Solución: Cancela manualmente las citas (cambia a
- Precios incorrectos en servicios: Servicio tiene precio €45 pero debería ser €30
- Solución: Actualiza el precio en “Servicios” (NO afecta citas ya creadas)
- Citas duplicadas: Error al crear cita (ej: doble clic en botón “Crear”)
- Solución: Elimina duplicados manualmente