Los errores que más sangran un gimnasio no son los grandes — son los chiquitos repetidos. Un cero de más al cobrar una cuota. Una venta del shop a un precio simbólico que en realidad era un typo. Una "cortesía" que ensucia el reporte de caja del mes. Tres errores que cualquier cajero comete tarde un domingo y que recién aparecen cuando el dueño abre el reporte del mes y no le cierra.
Esta semana sumamos a GymFlow tres validaciones nuevas que atrapan estos casos antes de que impacten en caja, stock o reportes. Ninguna te frena de hacer la operación si realmente la querés hacer — pero te muestran un confirm explícito con detalle de qué estás por aceptar. Porque la diferencia entre "lo aceptaste" y "no te diste cuenta" es justo el dato que después no podés reconstruir.
1. Sobrepago al asignar membresía
El caso clásico: un cajero asigna el plan mensual de $35.000, tipea el monto pagado y suelta un cero de más sin querer — 350000 en vez de 35000. La membresía queda registrada como sobrepagada en $315.000, el reporte de ingresos del día sale completamente inflado y al cierre del turno el efectivo real no cierra contra lo registrado.
Ahora, al asignar o editar una membresía, GymFlow chequea:
- Importe cobrado mayor al adeudado → rechazo con mensaje "El importe cobrado ($350.000) supera lo adeudado ($35.000). Revisá el monto.". Atrapa el typo del cero.
- Importes negativos → rechazo directo. No deberían existir y no aportan nada.
- Fecha de vencimiento anterior a hoy → no permite asignar una membresía que nace ya vencida (típico cuando el operador olvidó actualizar la fecha de inicio).
- Backdate excesivo (fecha de inicio >30 días atrás) → para correcciones históricas hay que crear la membresía con fecha actual y editarla después; nunca al alta directa.
- Rango muy distinto a la duración del plan (plan de 30 días con vencimiento a 200 días) → suele ser un typo en la fecha o un cambio manual del operador que no corresponde.
Cada rechazo explica qué pasó, no es un genérico "datos inválidos". El cajero ve "el rango (200 días) excede la duración del plan (30 días)" y sabe exactamente dónde mirar.
2. Venta del shop por debajo del costo
El shop también tiene su typo clásico — una bebida con costo $1.400 que se vende a $1 porque alguien le puso un punto de más al cargar el precio del producto. La venta procesa, el stock baja, la caja registra $1 de ingreso... y la rentabilidad del producto cae a -99% sin que nadie se entere hasta que el reporte mensual muestre profit negativo.
Antes de procesar cualquier venta del shop, GymFlow estima el costo FIFO de los productos del carrito (toma el lote más antiguo disponible) y compara contra el precio de venta. Si cualquier línea está por debajo del costo, en lugar de procesar muestra:
⚠️ ESTÁS VENDIENDO POR DEBAJO DEL COSTO
• 1× Agua 500ml: precio $1 vs costo $1.400 (pérdida $1.399/u)
Total venta: $1
Costo de los productos: $1.400
Pérdida estimada: -$1.399
Esto suele indicar un typo en el precio del producto. Si estás haciendo una promo o liquidación, confirmá. Si no, cancelá y revisá el precio del producto.
El cajero ve el detalle exacto, no una alerta vaga. Si era un error puede cancelar y arreglar el precio del producto en un click. Si era una promo real (liquidar stock viejo, cortesía a un cliente VIP, lo que sea), confirma y la venta procesa — pero queda registrada como shop.sell_at_loss en la auditoría, separada de las ventas normales para que el dueño después pueda filtrarlas en el reporte.
El protocolo es de defensa en profundidad: el chequeo se hace en el frontend (con modal claro) y también en el backend. Aunque alguien manipulara el JS para evitar el modal, el servidor responde con HTTP 422 pidiendo el flag confirm_loss — sin ese flag explícito no procesa.
3. Cortesía / regalo / ajuste de stock en $0
El tercer caso: un cajero le regala una bebida a un alumno habitual ("tomate algo, va de la casa") y para registrar la salida del stock procesa una venta con total $0. Hasta ahora el sistema no preguntaba nada — procesaba la venta, descontaba el stock y insertaba un movimiento de caja con monto $0. La caja del turno se llenaba de movimientos vacíos que no aportaban nada al arqueo pero ensuciaban el conteo de operaciones del día.
El nuevo comportamiento:
- Si el carrito suma $0, GymFlow muestra un confirm explícito: "El total del carrito es $0,00. Esto registra una CORTESÍA / regalo / ajuste de stock. ✓ El stock se descuenta igual. ✗ No se cobra nada en caja. ✗ No se emite factura AFIP. ¿Confirmás?"
- Si confirmás, la venta se procesa pero NO se inserta movimiento de caja — la caja queda limpia.
- La venta queda registrada en el historial como
shop.sell_courtesycon flagcourtesy: true, fácil de filtrar en reportes y auditoría. - Si cancelás, no pasa nada — el cajero arregla el precio del producto o desiste de la operación.
AFIP, por su parte, no permite emitir facturas por $0 — y eso ya estaba bien manejado: el flow de auto-emisión rechaza silenciosamente, no genera comprobante inválido. Lo que faltaba era no contaminar la caja con movimientos vacíos.
Por qué esto importa más de lo que parece
Las tres validaciones tienen el mismo principio: no frenan al operador, pero le obligan a confirmar. Eso convierte un error silencioso en una decisión consciente. Si el cajero se equivoca, lo ve y arregla en el momento. Si lo hace a propósito (promo real, cortesía intencional), el sistema lo registra como tal y el dueño después tiene cómo filtrarlo en reportería.
El costo de cada uno de estos errores no es enorme tomado de a uno — pero tomados a lo largo de un mes en un gym con varios cajeros y cientos de operaciones, se acumulan. El "el reporte no me cierra y no entiendo por qué" suele venir de acá: un par de typos que nadie atrapó a tiempo, una cortesía mal registrada, un ingreso fantasma de $0 que infla el conteo del turno.
La diferencia entre "lo aceptaste" y "no te diste cuenta" es justo el dato que después no podés reconstruir. Estas validaciones convierten lo segundo en lo primero.
Auditoría discrimina cada caso
En el log de auditoría — accesible desde Configurador → Auditoría — cada operación queda con una acción específica:
shop.sell_cart— venta normal (precio > costo, total > 0).shop.sell_at_loss— venta a pérdida confirmada por el operador.shop.sell_courtesy— cortesía / regalo en $0 confirmado.membership.assign— alta de membresía con detalle de monto cobrado vs adeudado, fecha de inicio/fin y plan.
El dueño puede filtrar la auditoría por estas acciones para entender exactamente cuántas cortesías se dieron en el mes, cuántas ventas a pérdida (y por qué), o si hubo intentos de cargar membresías con sobrepago. El historial no se pierde — solo se separa del flujo normal para no distorsionar las métricas operativas.
Lo que sigue
Estas validaciones son la primera capa de un trabajo más grande de "guardarrieles" en operaciones de caja y stock. Lo que viene en las próximas semanas, alineado con el feedback que vamos recibiendo:
- Alerta proactiva al dueño cuando hay más de N ventas a pérdida o cortesías en un día (umbral configurable por gym).
- Reporte semanal de "operaciones inusuales" que llega por email al admin — un resumen de ventas a pérdida, cortesías, sobrepagos rechazados y otras señales de fricción operativa.
- Validación cruzada con el costo promedio del lote en lugar de solo el lote más antiguo, para detectar mejor casos de promos legítimas vs typos.
La filosofía de fondo no cambia: el sistema no decide por el operador, pero le da contexto suficiente para tomar la decisión correcta. Si te equivocás, lo ves al toque. Si fue intencional, queda registrado como tal. Cero errores silenciosos que el dueño descubre tres semanas después en un reporte que no cierra.
Caja prolija, reportes que cierran
Validaciones automáticas, auditoría granular y reportes financieros consolidados — todo integrado en GymFlow. Probalo 30 días gratis, sin tarjeta de crédito.
Probar gratis 30 días →Artículos relacionados
- Turnos de caja: apertura, cierre y arqueo sin errores
- Vender productos en tu gimnasio: stock FIFO, caja integrada y control total
- Reportes financieros del gimnasio: KPIs, proyección y churn en un panel
- Auditoría total del sistema: registros de todo lo que pasa en tu gym
- Medios de pago en gimnasios: efectivo, transferencia y tarjeta