ACTIVO FARO NECESARIO
Fórmulas FARO por KPI
Versión V1 — 1.000 fórmulas iniciales diseñadas
---
1. Objetivo del activo
Definir la biblioteca de fórmulas que FARO utiliza para calcular KPIs por:
- Empresa.
- Unidad de negocio.
- Sucursal.
- Área.
- Módulo.
- Responsable.
- Vendedor.
- Cliente.
- Producto.
- Rubro.
- Subrubro.
- Canal.
- Proveedor.
- Proyecto.
- Centro de costo.
- Industria.
- Período.
Este activo permite que FARO ejecute fórmulas simples, compuestas, comparativas, contextuales y ponderadas para alimentar:
- KPIs.
- Alertas.
- Tensiones.
- Diagnósticos.
- Recomendaciones.
- Acciones.
- Reportes.
- FARO Score.
---
2. Tesis FARO
FARO no debe tener KPIs escritos a mano como fórmulas sueltas.
Debe tener un motor de fórmulas gobernado, donde cada KPI tenga:
- Código.
- Nombre.
- Fórmula.
- Fuente de datos.
- Dimensiones de cálculo.
- Frecuencia.
- Responsable.
- Umbral.
- Contexto.
- Calidad mínima del dato.
- Impacto en alertas.
- Impacto en tensiones.
- Impacto en Score.
La regla madre:
Todo KPI FARO debe tener fórmula trazable, ejecutable, versionada y auditable.
Si no hay fórmula clara, el KPI es opinión con porcentaje. Y de eso las empresas ya tienen bastante.
---
3. Diferencia entre métrica, KPI, fórmula, alerta y tensión
| Concepto | Qué es | Ejemplo |
|---|---|---|
| Métrica | Dato medible simple | Venta neta |
| Fórmula | Cálculo que produce una métrica o KPI | Venta - descuentos |
| KPI | Indicador con propósito ejecutivo | Margen bruto |
| Alerta | Desvío contra umbral | Margen menor al 24% |
| Tensión | Contradicción entre KPIs | Venta sube, margen baja |
| Acción | Respuesta ejecutiva | Revisar descuentos |
---
4. Tipos de fórmulas FARO
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Simple | Cálculo directo | Venta neta = venta bruta - descuentos |
| Porcentual | Relación entre dos variables | Margen % = margen / venta neta |
| Promedio | Media simple o ponderada | Ticket promedio |
| Acumulada | Suma por período | Venta mensual |
| Comparativa | Actual vs anterior | Variación mensual |
| Ponderada | Usa pesos por contexto | FARO Score |
| Condicional | Depende de regla | Comisión si margen supera mínimo |
| Compuesta | Combina varias fórmulas | Rentabilidad por cliente |
| Temporal | Usa días, vencimientos o aging | DSO |
| Contextual | Cambia según industria, canal o rubro | Margen esperado por rubro |
| Predictiva básica | Proyecta con histórico | Forecast de ventas |
| De confianza | Ajusta por calidad del dato | KPI con confianza reducida |
---
5. Convenciones de fórmula FARO
Para estandarizar, FARO debería usar una sintaxis interna.
Funciones base
| Función | Uso |
|---|---|
| `SUM()` | Suma valores |
| `COUNT()` | Cuenta registros |
| `AVG()` | Promedio |
| `MAX()` | Máximo |
| `MIN()` | Mínimo |
| `SAFE_DIVIDE(a,b)` | Divide evitando error por cero |
| `DATEDIFF(a,b)` | Diferencia de fechas |
| `IF(condition,a,b)` | Condición |
| `COALESCE(a,b)` | Valor alternativo si es nulo |
| `WEIGHTED_AVG(value,weight)` | Promedio ponderado |
| `PERIOD_PREVIOUS(value)` | Valor del período anterior |
| `VAR_PCT(current,previous)` | Variación porcentual |
| `SCORE_BAND(value,thresholds)` | Clasificación por rango |
---
6. Dimensiones obligatorias de ejecución
Cada fórmula debe poder ejecutarse con filtros o agrupaciones.
| Dimensión | Ejemplo |
|---|---|
| company_id | Empresa |
| branch_id | Sucursal |
| area_code | Comercial, Finanzas, Stock |
| module_code | Ventas, Cobranza, Compras |
| responsible_user_id | Responsable |
| seller_id | Vendedor |
| customer_id | Cliente |
| product_id | Producto |
| supplier_id | Proveedor |
| project_id | Proyecto |
| cost_center_id | Centro de costo |
| channel_code | Canal |
| rubro_code | Rubro |
| subrubro_code | Subrubro |
| industry_code | Industria |
| period_id | Semana, mes, trimestre, año |
---
7. Estructura técnica de cada fórmula
Cada fórmula FARO debe tener esta ficha.
| Campo | Descripción |
|---|---|
| formula_id | Identificador |
| formula_code | Código único |
| kpi_code | KPI asociado |
| formula_name | Nombre |
| formula_type | Simple, compuesta, ponderada, condicional |
| expression | Fórmula ejecutable |
| data_sources | Fuentes requeridas |
| input_fields | Campos necesarios |
| output_type | Monto, porcentaje, cantidad, score, días |
| aggregation_level | Empresa, sucursal, área, responsable |
| dimensions | Dimensiones permitidas |
| frequency | Frecuencia de cálculo |
| minimum_data_quality | Calidad mínima requerida |
| threshold_rules | Umbrales |
| alert_codes | Alertas vinculadas |
| tension_codes | Tensiones vinculadas |
| action_codes | Acciones sugeridas |
| score_impact | Impacto en FARO Score |
| industry_scope | Industrias donde aplica |
| version | Versión |
| active_status | Activa/inactiva |
---
8. Volumen recomendado
| Nivel | Cantidad de fórmulas |
|---|---|
| MVP mínimo | 120 a 180 |
| MVP sólido | 200 a 300 |
| Business | 400 a 600 |
| Enterprise | 800 a 1.000 |
| Neural / Multiindustria | 1.000 a 1.500+ |
Decisión recomendada
Diseñar 1.000 fórmulas iniciales.
Activar 180 en MVP.
Activar 450 en Business.
Activar 800 en Enterprise.
Usar 1.000+ en Neural.
---
9. Familias de fórmulas FARO
La biblioteca V1 se organiza en 25 familias, con 40 fórmulas por familia.
| Nº | Familia de fórmulas | Cantidad |
|---|---|---|
| 1 | Comercial / Ventas | 40 |
| 2 | Margen / Rentabilidad comercial | 40 |
| 3 | Clientes / CRM | 40 |
| 4 | Cotizaciones / Conversión | 40 |
| 5 | Descuentos / Bonificaciones | 40 |
| 6 | Comisiones / Incentivos | 40 |
| 7 | Caja / Bancos | 40 |
| 8 | Cobranza / Cuentas por cobrar | 40 |
| 9 | Pagos / Cuentas por pagar | 40 |
| 10 | Gastos / Administración | 40 |
| 11 | Compras | 40 |
| 12 | Proveedores | 40 |
| 13 | Stock / Inventario | 40 |
| 14 | Reposición / Abastecimiento | 40 |
| 15 | Logística / Entregas | 40 |
| 16 | Operaciones / Productividad | 40 |
| 17 | RRHH / Personas | 40 |
| 18 | Sueldos / Costo laboral | 40 |
| 19 | Proyectos / Obras / Servicios | 40 |
| 20 | Contratos / Abonos | 40 |
| 21 | Calidad / Reclamos / SLA | 40 |
| 22 | Datos / Calidad / Auditoría | 40 |
| 23 | Workflow / Acciones / Evidencia | 40 |
| 24 | FARO Score / Dirección | 40 |
| 25 | Industria / Contexto / Benchmark | 40 |
| **Total V1** | **1.000** |
---
10. Núcleo MVP — 180 fórmulas prioritarias
Para el MVP, FARO debe activar primero fórmulas que demuestren la cadena completa:
dato → KPI → alerta → tensión → acción → Score
---
10.1 Comercial / Ventas
15 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-COM-001 | Venta bruta | `SUM(sales.gross_amount)` |
| FML-COM-002 | Venta neta | `SUM(sales.gross_amount - sales.discount_amount - sales.returns_amount)` |
| FML-COM-003 | Cantidad vendida | `SUM(sales.quantity)` |
| FML-COM-004 | Tickets / operaciones | `COUNT(DISTINCT sales.transaction_id)` |
| FML-COM-005 | Ticket promedio | `SAFE_DIVIDE(venta_neta, tickets)` |
| FML-COM-006 | Venta por sucursal | `SUM(sales.net_amount) GROUP BY branch_id` |
| FML-COM-007 | Venta por vendedor | `SUM(sales.net_amount) GROUP BY seller_id` |
| FML-COM-008 | Venta por cliente | `SUM(sales.net_amount) GROUP BY customer_id` |
| FML-COM-009 | Venta por producto | `SUM(sales.net_amount) GROUP BY product_id` |
| FML-COM-010 | Venta por rubro | `SUM(sales.net_amount) GROUP BY rubro_code` |
| FML-COM-011 | Venta por canal | `SUM(sales.net_amount) GROUP BY channel_code` |
| FML-COM-012 | Variación venta vs período anterior | `VAR_PCT(venta_neta, PERIOD_PREVIOUS(venta_neta))` |
| FML-COM-013 | Cumplimiento objetivo ventas | `SAFE_DIVIDE(venta_neta, sales_target)` |
| FML-COM-014 | Participación de sucursal en ventas | `SAFE_DIVIDE(venta_sucursal, venta_total_empresa)` |
| FML-COM-015 | Concentración de ventas top clientes | `SAFE_DIVIDE(SUM(top_10_customers.sales), venta_total)` |
---
10.2 Margen / Rentabilidad Comercial
15 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-MAR-001 | Costo de mercadería vendida | `SUM(sales.quantity * sales.unit_cost)` |
| FML-MAR-002 | Margen bruto monto | `SUM(sales.net_amount - sales.cost_amount)` |
| FML-MAR-003 | Margen bruto % | `SAFE_DIVIDE(margen_bruto_monto, venta_neta)` |
| FML-MAR-004 | Margen por producto | `SAFE_DIVIDE(SUM(product.net_amount - product.cost_amount), SUM(product.net_amount))` |
| FML-MAR-005 | Margen por rubro | `SAFE_DIVIDE(SUM(rubro.net_amount - rubro.cost_amount), SUM(rubro.net_amount))` |
| FML-MAR-006 | Margen por vendedor | `SAFE_DIVIDE(SUM(seller.net_amount - seller.cost_amount), SUM(seller.net_amount))` |
| FML-MAR-007 | Margen por cliente | `SAFE_DIVIDE(SUM(customer.net_amount - customer.cost_amount), SUM(customer.net_amount))` |
| FML-MAR-008 | Margen por canal | `SAFE_DIVIDE(SUM(channel.net_amount - channel.cost_amount), SUM(channel.net_amount))` |
| FML-MAR-009 | Margen esperado vs real | `actual_margin_pct - expected_margin_pct` |
| FML-MAR-010 | Venta bajo margen mínimo | `SUM(IF(actual_margin_pct < minimum_margin_pct, sales.net_amount, 0))` |
| FML-MAR-011 | % venta bajo margen mínimo | `SAFE_DIVIDE(venta_bajo_margen_minimo, venta_neta)` |
| FML-MAR-012 | Margen perdido por descuento | `SUM(discount_amount * expected_margin_pct)` |
| FML-MAR-013 | Rentabilidad neta comercial estimada | `margen_bruto_monto - commercial_variable_costs` |
| FML-MAR-014 | Variación margen vs período anterior | `VAR_PCT(margen_bruto_pct, PERIOD_PREVIOUS(margen_bruto_pct))` |
| FML-MAR-015 | Aporte al margen por rubro | `SAFE_DIVIDE(margen_rubro_monto, margen_total_monto)` |
---
10.3 Descuentos / Bonificaciones
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-DES-001 | Descuento total | `SUM(sales.discount_amount)` |
| FML-DES-002 | Descuento promedio % | `SAFE_DIVIDE(SUM(discount_amount), SUM(gross_amount))` |
| FML-DES-003 | Descuento por vendedor | `SAFE_DIVIDE(SUM(seller.discount_amount), SUM(seller.gross_amount))` |
| FML-DES-004 | Descuento por cliente | `SAFE_DIVIDE(SUM(customer.discount_amount), SUM(customer.gross_amount))` |
| FML-DES-005 | Descuento por rubro | `SAFE_DIVIDE(SUM(rubro.discount_amount), SUM(rubro.gross_amount))` |
| FML-DES-006 | Operaciones con descuento superior al límite | `COUNT(IF(discount_pct > authorized_discount_pct, transaction_id, NULL))` |
| FML-DES-007 | Venta con descuento no autorizado | `SUM(IF(discount_authorized = false, net_amount, 0))` |
| FML-DES-008 | Impacto descuento en margen | `SUM(discount_amount * gross_margin_pct_before_discount)` |
| FML-DES-009 | Variación descuento promedio | `VAR_PCT(discount_avg_pct, PERIOD_PREVIOUS(discount_avg_pct))` |
| FML-DES-010 | Descuento crítico ponderado | `discount_pct * product_criticality_weight * margin_gap_weight` |
---
10.4 Clientes / CRM
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-CLI-001 | Clientes activos | `COUNT(DISTINCT customer_id WHERE sales_in_period > 0)` |
| FML-CLI-002 | Clientes nuevos | `COUNT(customer_id WHERE first_purchase_date BETWEEN period_start AND period_end)` |
| FML-CLI-003 | Clientes inactivos | `COUNT(customer_id WHERE days_since_last_purchase > inactivity_threshold)` |
| FML-CLI-004 | Venta promedio por cliente | `SAFE_DIVIDE(venta_neta, clientes_activos)` |
| FML-CLI-005 | Margen promedio por cliente | `SAFE_DIVIDE(margen_total, clientes_activos)` |
| FML-CLI-006 | Rentabilidad por cliente | `SUM(customer.margin_amount - customer.service_cost - customer.logistics_cost)` |
| FML-CLI-007 | Concentración cliente principal | `SAFE_DIVIDE(sales_top_customer, venta_total)` |
| FML-CLI-008 | Frecuencia de compra | `SAFE_DIVIDE(COUNT(transactions), COUNT(DISTINCT customer_id))` |
| FML-CLI-009 | Recencia promedio | `AVG(DATEDIFF(period_end, customer.last_purchase_date))` |
| FML-CLI-010 | Riesgo cliente ponderado | `credit_risk_score * exposure_amount * overdue_weight` |
---
10.5 Cotizaciones / Conversión
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-COT-001 | Cotizaciones emitidas | `COUNT(quote_id)` |
| FML-COT-002 | Monto cotizado | `SUM(quote.total_amount)` |
| FML-COT-003 | Cotizaciones ganadas | `COUNT(quote_id WHERE status='WON')` |
| FML-COT-004 | Cotizaciones perdidas | `COUNT(quote_id WHERE status='LOST')` |
| FML-COT-005 | Tasa de conversión | `SAFE_DIVIDE(cotizaciones_ganadas, cotizaciones_emitidas)` |
| FML-COT-006 | Monto convertido | `SUM(quote.total_amount WHERE status='WON')` |
| FML-COT-007 | Conversión por vendedor | `SAFE_DIVIDE(won_quotes_seller, total_quotes_seller)` |
| FML-COT-008 | Cotizaciones vencidas | `COUNT(quote_id WHERE valid_until < today AND status='OPEN')` |
| FML-COT-009 | Tiempo promedio de cierre | `AVG(DATEDIFF(close_date, quote_date))` |
| FML-COT-010 | Margen esperado cotizado | `SAFE_DIVIDE(SUM(quote.expected_margin_amount), SUM(quote.total_amount))` |
---
10.6 Caja / Bancos
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-CAJ-001 | Caja disponible | `SUM(bank_accounts.available_balance) + SUM(cash_register.balance)` |
| FML-CAJ-002 | Ingresos del período | `SUM(cash_movements.amount WHERE movement_type='IN')` |
| FML-CAJ-003 | Egresos del período | `SUM(cash_movements.amount WHERE movement_type='OUT')` |
| FML-CAJ-004 | Flujo neto | `ingresos_periodo - egresos_periodo` |
| FML-CAJ-005 | Saldo proyectado | `caja_disponible + projected_collections - projected_payments` |
| FML-CAJ-006 | Cobertura de caja en días | `SAFE_DIVIDE(caja_disponible, avg_daily_outflows)` |
| FML-CAJ-007 | % ingresos conciliados | `SAFE_DIVIDE(reconciled_inflows, total_inflows)` |
| FML-CAJ-008 | % egresos conciliados | `SAFE_DIVIDE(reconciled_outflows, total_outflows)` |
| FML-CAJ-009 | Caja por sucursal | `SUM(cash_balance) GROUP BY branch_id` |
| FML-CAJ-010 | Variación caja vs período anterior | `VAR_PCT(caja_disponible, PERIOD_PREVIOUS(caja_disponible))` |
---
10.7 Cobranza / Cuentas por Cobrar
15 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-COB-001 | Cuentas por cobrar total | `SUM(receivables.open_amount)` |
| FML-COB-002 | Saldo vencido | `SUM(open_amount WHERE due_date < today)` |
| FML-COB-003 | Saldo no vencido | `SUM(open_amount WHERE due_date >= today)` |
| FML-COB-004 | % cartera vencida | `SAFE_DIVIDE(saldo_vencido, cuentas_por_cobrar_total)` |
| FML-COB-005 | Días promedio de mora | `AVG(DATEDIFF(today, due_date) WHERE due_date < today)` |
| FML-COB-006 | DSO | `SAFE_DIVIDE(accounts_receivable, avg_daily_credit_sales)` |
| FML-COB-007 | Cobranza del período | `SUM(collections.amount)` |
| FML-COB-008 | Efectividad de cobranza | `SAFE_DIVIDE(collections.amount, receivables_due_in_period)` |
| FML-COB-009 | Mora por cliente | `SUM(open_amount WHERE due_date < today) GROUP BY customer_id` |
| FML-COB-010 | Mora por vendedor | `SUM(overdue_amount) GROUP BY seller_id` |
| FML-COB-011 | Exposición crediticia cliente | `open_amount + uninvoiced_orders_amount` |
| FML-COB-012 | Uso de límite de crédito | `SAFE_DIVIDE(credit_exposure, credit_limit)` |
| FML-COB-013 | Clientes con crédito excedido | `COUNT(customer_id WHERE credit_exposure > credit_limit)` |
| FML-COB-014 | Promesas de pago incumplidas | `COUNT(promise_id WHERE promise_date < today AND paid=false)` |
| FML-COB-015 | Riesgo de cobranza ponderado | `overdue_amount * risk_score * days_overdue_weight` |
---
10.8 Pagos / Cuentas por Pagar
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-PAG-001 | Cuentas por pagar total | `SUM(payables.open_amount)` |
| FML-PAG-002 | Pagos vencidos | `SUM(open_amount WHERE due_date < today)` |
| FML-PAG-003 | Pagos próximos 7 días | `SUM(open_amount WHERE due_date BETWEEN today AND today+7)` |
| FML-PAG-004 | Pagos críticos | `SUM(open_amount WHERE supplier_criticality='HIGH')` |
| FML-PAG-005 | Días promedio pago proveedor | `AVG(DATEDIFF(payment_date, invoice_date))` |
| FML-PAG-006 | % pagos vencidos | `SAFE_DIVIDE(pagos_vencidos, cuentas_por_pagar_total)` |
| FML-PAG-007 | Concentración deuda proveedor | `SAFE_DIVIDE(payable_top_supplier, cuentas_por_pagar_total)` |
| FML-PAG-008 | Pagos sin comprobante | `SUM(payment.amount WHERE document_id IS NULL)` |
| FML-PAG-009 | Pagos fuera de política | `COUNT(payment_id WHERE approval_required=true AND approved=false)` |
| FML-PAG-010 | Presión de pagos sobre caja | `SAFE_DIVIDE(payments_due_7_days, caja_disponible)` |
---
10.9 Gastos / Administración
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-GAS-001 | Gasto total | `SUM(expenses.amount)` |
| FML-GAS-002 | Gasto por área | `SUM(expenses.amount) GROUP BY area_code` |
| FML-GAS-003 | Gasto por sucursal | `SUM(expenses.amount) GROUP BY branch_id` |
| FML-GAS-004 | Gasto por centro de costo | `SUM(expenses.amount) GROUP BY cost_center_id` |
| FML-GAS-005 | Gasto sobre ventas | `SAFE_DIVIDE(gasto_total, venta_neta)` |
| FML-GAS-006 | Gasto fijo total | `SUM(expenses.amount WHERE expense_type='FIXED')` |
| FML-GAS-007 | Gasto variable total | `SUM(expenses.amount WHERE expense_type='VARIABLE')` |
| FML-GAS-008 | Variación gasto vs período anterior | `VAR_PCT(gasto_total, PERIOD_PREVIOUS(gasto_total))` |
| FML-GAS-009 | Gasto sin comprobante | `SUM(expenses.amount WHERE document_id IS NULL)` |
| FML-GAS-010 | Desvío contra presupuesto | `gasto_real - gasto_presupuestado` |
---
10.10 Compras
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-CMP-001 | Compra total | `SUM(purchases.total_amount)` |
| FML-CMP-002 | Compras por proveedor | `SUM(purchases.total_amount) GROUP BY supplier_id` |
| FML-CMP-003 | Compras por producto | `SUM(purchases.total_amount) GROUP BY product_id` |
| FML-CMP-004 | Variación costo compra | `VAR_PCT(current_unit_cost, previous_unit_cost)` |
| FML-CMP-005 | Órdenes de compra emitidas | `COUNT(purchase_order_id)` |
| FML-CMP-006 | Órdenes pendientes | `COUNT(po_id WHERE status IN ('OPEN','PARTIAL'))` |
| FML-CMP-007 | Recepción completa % | `SAFE_DIVIDE(received_quantity, ordered_quantity)` |
| FML-CMP-008 | Compra urgente % | `SAFE_DIVIDE(urgent_purchase_amount, total_purchase_amount)` |
| FML-CMP-009 | Ahorro por negociación | `SUM(reference_price - actual_price) * quantity` |
| FML-CMP-010 | Sobrecosto por compra urgente | `SUM((urgent_price - standard_price) * quantity)` |
---
10.11 Proveedores
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-PRV-001 | Proveedores activos | `COUNT(DISTINCT supplier_id WHERE purchases_in_period > 0)` |
| FML-PRV-002 | Cumplimiento proveedor | `SAFE_DIVIDE(on_time_deliveries, total_deliveries)` |
| FML-PRV-003 | Lead time promedio proveedor | `AVG(DATEDIFF(receipt_date, purchase_order_date))` |
| FML-PRV-004 | Variación precio proveedor | `VAR_PCT(current_supplier_price, previous_supplier_price)` |
| FML-PRV-005 | Dependencia proveedor | `SAFE_DIVIDE(purchase_amount_supplier, total_purchase_amount)` |
| FML-PRV-006 | Proveedores críticos sin alternativa | `COUNT(supplier_id WHERE critical=true AND alternative_supplier=false)` |
| FML-PRV-007 | Calidad proveedor | `SAFE_DIVIDE(accepted_quantity, received_quantity)` |
| FML-PRV-008 | Reclamos a proveedor | `COUNT(supplier_claim_id)` |
| FML-PRV-009 | Condición promedio de pago proveedor | `AVG(payment_term_days)` |
| FML-PRV-010 | Score proveedor | `reliability*0.35 + price_score*0.25 + quality*0.25 + payment_terms*0.15` |
---
10.12 Stock / Inventario
15 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-STK-001 | Stock disponible | `SUM(stock.on_hand - stock.reserved)` |
| FML-STK-002 | Stock valorizado | `SUM(stock.quantity * product.unit_cost)` |
| FML-STK-003 | Stock por producto | `SUM(stock.quantity) GROUP BY product_id` |
| FML-STK-004 | Stock por sucursal | `SUM(stock.quantity) GROUP BY branch_id` |
| FML-STK-005 | Stock por depósito | `SUM(stock.quantity) GROUP BY warehouse_id` |
| FML-STK-006 | Productos bajo mínimo | `COUNT(product_id WHERE stock_available < min_stock)` |
| FML-STK-007 | Productos con stock crítico | `COUNT(product_id WHERE stock_status='CRITICAL')` |
| FML-STK-008 | Productos con sobrestock | `COUNT(product_id WHERE stock_available > max_stock)` |
| FML-STK-009 | Rotación de stock | `SAFE_DIVIDE(cost_of_goods_sold, avg_inventory_value)` |
| FML-STK-010 | Días de inventario | `SAFE_DIVIDE(avg_inventory_value, avg_daily_cogs)` |
| FML-STK-011 | Quiebre de stock | `COUNT(product_id WHERE stock_available <= 0 AND demand_recent > 0)` |
| FML-STK-012 | Stock inmovilizado | `SUM(stock_value WHERE days_without_sale > threshold)` |
| FML-STK-013 | % stock inmovilizado | `SAFE_DIVIDE(stock_inmovilizado, stock_valorizado)` |
| FML-STK-014 | Diferencia inventario | `physical_count - system_stock` |
| FML-STK-015 | Valor de stock crítico rentable | `SUM(stockout_risk_value WHERE margin_profile='HIGH')` |
---
10.13 Reposición / Abastecimiento
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-REP-001 | Punto de pedido sugerido | `avg_daily_sales * supplier_lead_time_days + safety_stock` |
| FML-REP-002 | Cantidad sugerida de reposición | `max_stock - stock_available` |
| FML-REP-003 | Cobertura de stock días | `SAFE_DIVIDE(stock_available, avg_daily_sales)` |
| FML-REP-004 | Riesgo de quiebre | `SCORE_BAND(stock_coverage_days, thresholds)` |
| FML-REP-005 | Prioridad de reposición | `margin_weight * rotation_weight * stockout_risk_weight * supplier_lead_time_weight` |
| FML-REP-006 | Necesidad de compra crítica | `SUM(IF(stock_status='CRITICAL', reorder_quantity, 0))` |
| FML-REP-007 | Compra sugerida valorizada | `SUM(reorder_quantity * unit_cost)` |
| FML-REP-008 | Reposición atrasada | `COUNT(product_id WHERE reorder_required=true AND purchase_order_open=false)` |
| FML-REP-009 | Demanda promedio diaria | `SAFE_DIVIDE(quantity_sold_last_n_days, n_days)` |
| FML-REP-010 | Stock de seguridad | `demand_std_dev * service_level_factor * SQRT(lead_time_days)` |
---
10.14 Logística / Entregas
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-LOG-001 | Entregas totales | `COUNT(delivery_id)` |
| FML-LOG-002 | Entregas a tiempo | `COUNT(delivery_id WHERE delivered_at <= promised_at)` |
| FML-LOG-003 | % entrega a tiempo | `SAFE_DIVIDE(entregas_a_tiempo, entregas_totales)` |
| FML-LOG-004 | Entregas fallidas | `COUNT(delivery_id WHERE status='FAILED')` |
| FML-LOG-005 | % entregas fallidas | `SAFE_DIVIDE(entregas_fallidas, entregas_totales)` |
| FML-LOG-006 | Costo logístico total | `SUM(delivery.logistics_cost)` |
| FML-LOG-007 | Costo logístico por entrega | `SAFE_DIVIDE(costo_logistico_total, entregas_totales)` |
| FML-LOG-008 | Costo logístico sobre ventas | `SAFE_DIVIDE(costo_logistico_total, venta_neta)` |
| FML-LOG-009 | Demora promedio entrega | `AVG(DATEDIFF(delivered_at, promised_at) WHERE delivered_at > promised_at)` |
| FML-LOG-010 | Entregas críticas demoradas | `COUNT(delivery_id WHERE criticality='HIGH' AND delivered_at > promised_at)` |
---
10.15 RRHH / Personas
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-RRHH-001 | Dotación total | `COUNT(employee_id WHERE status='ACTIVE')` |
| FML-RRHH-002 | Dotación por área | `COUNT(employee_id) GROUP BY area_code` |
| FML-RRHH-003 | Dotación por sucursal | `COUNT(employee_id) GROUP BY branch_id` |
| FML-RRHH-004 | Costo laboral total | `SUM(payroll.gross_salary + payroll.employer_contributions + payroll.variable_pay)` |
| FML-RRHH-005 | Costo laboral sobre ventas | `SAFE_DIVIDE(costo_laboral_total, venta_neta)` |
| FML-RRHH-006 | Venta por empleado | `SAFE_DIVIDE(venta_neta, dotacion_total)` |
| FML-RRHH-007 | Margen por empleado | `SAFE_DIVIDE(margen_bruto_monto, dotacion_total)` |
| FML-RRHH-008 | Ausentismo % | `SAFE_DIVIDE(absent_days, scheduled_work_days)` |
| FML-RRHH-009 | Rotación de personal | `SAFE_DIVIDE(employee_terminations, avg_headcount)` |
| FML-RRHH-010 | Productividad comercial por vendedor | `SAFE_DIVIDE(venta_vendedor, vendedor_active_days)` |
---
10.16 Comisiones
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-COMIS-001 | Comisión por venta bruta | `sales.gross_amount * commission_rate` |
| FML-COMIS-002 | Comisión por venta neta | `sales.net_amount * commission_rate` |
| FML-COMIS-003 | Comisión por margen | `margin_amount * commission_rate` |
| FML-COMIS-004 | Comisión por margen cobrado | `collected_margin_amount * commission_rate` |
| FML-COMIS-005 | Comisión bloqueada por mora | `IF(customer_overdue=true, 0, calculated_commission)` |
| FML-COMIS-006 | Comisión bloqueada por margen bajo | `IF(actual_margin_pct < minimum_margin_pct, 0, calculated_commission)` |
| FML-COMIS-007 | Comisión ajustada por descuento | `base_commission * (1 - discount_penalty_factor)` |
| FML-COMIS-008 | Comisión total vendedor | `SUM(commission_amount) GROUP BY seller_id` |
| FML-COMIS-009 | Comisión sobre margen generado | `SAFE_DIVIDE(commission_amount, margin_amount)` |
| FML-COMIS-010 | Comisión sana FARO | `collected_margin * rate * quality_factor * no_overdue_factor` |
---
10.17 Proyectos / Obras / Servicios
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-PROY-001 | Presupuesto proyecto | `SUM(project.budget_amount)` |
| FML-PROY-002 | Costo real proyecto | `SUM(project_costs.amount)` |
| FML-PROY-003 | Ingreso facturado proyecto | `SUM(project_invoices.amount)` |
| FML-PROY-004 | Margen proyecto monto | `ingreso_facturado_proyecto - costo_real_proyecto` |
| FML-PROY-005 | Margen proyecto % | `SAFE_DIVIDE(margen_proyecto_monto, ingreso_facturado_proyecto)` |
| FML-PROY-006 | Avance físico % | `SAFE_DIVIDE(completed_milestones_weight, total_milestones_weight)` |
| FML-PROY-007 | Avance financiero % | `SAFE_DIVIDE(invoiced_amount, contract_amount)` |
| FML-PROY-008 | Desvío de costo | `costo_real_proyecto - costo_presupuestado` |
| FML-PROY-009 | Desvío plazo | `DATEDIFF(actual_finish_date, planned_finish_date)` |
| FML-PROY-010 | Rentabilidad esperada vs real | `actual_project_margin_pct - expected_project_margin_pct` |
---
10.18 Workflow / Acciones
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-WF-001 | Acciones creadas | `COUNT(action_id)` |
| FML-WF-002 | Acciones abiertas | `COUNT(action_id WHERE status='OPEN')` |
| FML-WF-003 | Acciones cerradas | `COUNT(action_id WHERE status='CLOSED')` |
| FML-WF-004 | Acciones vencidas | `COUNT(action_id WHERE due_date < today AND status!='CLOSED')` |
| FML-WF-005 | % acciones vencidas | `SAFE_DIVIDE(acciones_vencidas, acciones_abiertas)` |
| FML-WF-006 | Cumplimiento de acciones | `SAFE_DIVIDE(acciones_cerradas_a_tiempo, acciones_vencidas_periodo + acciones_cerradas_periodo)` |
| FML-WF-007 | Acciones críticas vencidas | `COUNT(action_id WHERE priority='CRITICAL' AND due_date < today AND status!='CLOSED')` |
| FML-WF-008 | Acciones con evidencia | `SAFE_DIVIDE(actions_with_evidence, closed_actions)` |
| FML-WF-009 | Tiempo promedio de cierre | `AVG(DATEDIFF(closed_at, created_at))` |
| FML-WF-010 | Score de ejecución | `on_time_rate*0.40 + evidence_rate*0.30 + critical_resolution_rate*0.30` |
---
10.19 Calidad de Datos / Auditoría
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-DQ-001 | Completitud de datos | `SAFE_DIVIDE(required_fields_completed, required_fields_total)` |
| FML-DQ-002 | Consistencia de datos | `SAFE_DIVIDE(validation_rules_passed, validation_rules_total)` |
| FML-DQ-003 | Factor sin errores críticos | `100 - critical_error_penalty` |
| FML-DQ-004 | Score calidad de datos | `completeness*0.40 + consistency*0.35 + critical_error_factor*0.25` |
| FML-DQ-005 | % registros rechazados | `SAFE_DIVIDE(records_rejected, records_received)` |
| FML-DQ-006 | % registros observados | `SAFE_DIVIDE(records_observed, records_received)` |
| FML-DQ-007 | % cargas con RAW | `SAFE_DIVIDE(loads_with_raw, total_loads)` |
| FML-DQ-008 | % KPIs trazables | `SAFE_DIVIDE(kpis_with_lineage, total_kpis)` |
| FML-DQ-009 | Fuentes vencidas | `COUNT(source_id WHERE freshness_status='EXPIRED')` |
| FML-DQ-010 | Confianza auditada | `data_quality_score*0.50 + traceability_score*0.30 + freshness_score*0.20` |
---
10.20 FARO Score / Dirección
10 fórmulas MVP
| Código | KPI / Fórmula | Expresión |
|---|---|---|
| FML-SCORE-001 | Score comercial | `sales_score*0.30 + margin_score*0.35 + customer_score*0.15 + action_score*0.20` |
| FML-SCORE-002 | Score financiero | `cash_score*0.30 + collection_score*0.30 + payable_score*0.15 + debt_score*0.10 + action_score*0.15` |
| FML-SCORE-003 | Score stock | `stock_availability_score*0.30 + rotation_score*0.25 + overstock_score*0.20 + data_quality_score*0.10 + action_score*0.15` |
| FML-SCORE-004 | Score operaciones | `delivery_score*0.30 + quality_score*0.25 + capacity_score*0.20 + incident_score*0.10 + action_score*0.15` |
| FML-SCORE-005 | Score RRHH | `productivity_score*0.30 + cost_labor_score*0.25 + attendance_score*0.20 + structure_score*0.10 + action_score*0.15` |
| FML-SCORE-006 | Score calidad de datos | `data_quality_score*0.50 + traceability_score*0.30 + freshness_score*0.20` |
| FML-SCORE-007 | FARO Score empresa | `SUM(module_score * module_weight)` |
| FML-SCORE-008 | Confianza FARO Score | `SUM(module_data_confidence * module_weight)` |
| FML-SCORE-009 | Variación FARO Score | `faro_score_current - faro_score_previous` |
| FML-SCORE-010 | Score ajustado por ejecución | `faro_score_base + execution_delta - overdue_critical_penalty` |
---
11. Fórmulas compuestas críticas
Estas fórmulas son las que hacen que FARO deje de ser tablero.
---
11.1 Crecimiento no rentable
crecimiento_no_rentable_score =
sales_growth_score * 0.25
+ margin_decline_score * 0.35
+ discount_increase_score * 0.20
+ collection_risk_score * 0.10
+ stock_pressure_score * 0.10
Lectura
Si ventas suben, margen baja, descuentos suben, cobranza empeora y stock se presiona, FARO detecta tensión de crecimiento no rentable.
---
11.2 Venta sin caja
venta_sin_caja_score =
sales_growth_score * 0.25
+ accounts_receivable_growth_score * 0.25
+ dso_increase_score * 0.25
+ cash_decline_score * 0.25
---
11.3 Stock rentable en riesgo
stock_rentable_en_riesgo =
product_margin_score * 0.30
+ product_rotation_score * 0.30
+ stockout_risk_score * 0.30
+ supplier_lead_time_risk * 0.10
---
11.4 Cliente grande riesgoso
cliente_grande_riesgoso =
customer_sales_concentration_score * 0.25
+ overdue_score * 0.30
+ margin_low_score * 0.20
+ credit_exposure_score * 0.25
---
11.5 Comisión mal alineada
comision_mal_alineada =
commission_growth_score * 0.25
+ margin_decline_score * 0.30
+ discount_increase_score * 0.25
+ collection_delay_score * 0.20
---
11.6 Diagnóstico sin ejecución
diagnostico_sin_ejecucion =
critical_alerts_open_score * 0.25
+ overdue_actions_score * 0.30
+ repeated_tensions_score * 0.25
+ evidence_missing_score * 0.20
---
12. Reglas de ejecución por alcance
La misma fórmula debe poder ejecutarse por distintos alcances.
Ejemplo: margen bruto %
margen_bruto_pct =
SAFE_DIVIDE(SUM(net_amount - cost_amount), SUM(net_amount))
Puede calcularse por:
| Alcance | Resultado |
|---|---|
| Empresa | Margen total empresa |
| Sucursal | Margen por sucursal |
| Área | Margen comercial por área |
| Vendedor | Margen por vendedor |
| Cliente | Margen por cliente |
| Producto | Margen por producto |
| Rubro | Margen por rubro |
| Canal | Margen por canal |
| Período | Margen mensual, semanal, anual |
---
13. Reglas de calidad mínima
No toda fórmula puede ejecutarse con cualquier dato.
| Tipo de fórmula | Calidad mínima sugerida |
|---|---|
| KPI informativo | 60 |
| KPI operativo | 70 |
| KPI ejecutivo | 75 |
| Alerta crítica | 80 |
| Tensión | 80 |
| FARO Score | 85 |
| Recomendación automática | 85 |
| Simulación | 90 |
Regla
Si la calidad de datos es menor al mínimo requerido,
FARO debe calcular con advertencia o bloquear la fórmula.
---
14. Fórmulas por industria
Algunas fórmulas cambian según industria.
Retail
venta_por_m2 =
venta_neta / superficie_m2
rotacion_stock_retail =
costo_mercaderia_vendida / inventario_promedio
Construcción / obras
margen_por_obra =
(ingreso_certificado - costo_real_obra) / ingreso_certificado
avance_fisico_vs_financiero =
avance_fisico_pct - avance_financiero_pct
Salud
ocupacion_camas =
camas_ocupadas / camas_disponibles
ausentismo_turnos =
turnos_no_asistidos / turnos_programados
Hotelería
revpar =
ingreso_habitaciones / habitaciones_disponibles
adr =
ingreso_habitaciones / habitaciones_ocupadas
SaaS
mrr =
SUM(active_subscription_monthly_amount)
churn_rate =
customers_lost / customers_start_period
Logística
costo_por_km =
costo_total_flota / kilometros_recorridos
entrega_a_tiempo_pct =
entregas_a_tiempo / entregas_totales
---
15. Tabla SQL sugerida: biblioteca de fórmulas
CREATE TABLE faro_kpi_formulas (
formula_id UUID PRIMARY KEY,
formula_code VARCHAR(80) UNIQUE NOT NULL,
kpi_code VARCHAR(80) NOT NULL,
formula_name VARCHAR(240) NOT NULL,
formula_type VARCHAR(80) NOT NULL,
expression TEXT NOT NULL,
expression_language VARCHAR(40) DEFAULT 'FARO_DSL',
output_type VARCHAR(60),
aggregation_level VARCHAR(80),
allowed_dimensions JSONB,
required_tables JSONB,
required_fields JSONB,
required_data_quality_score NUMERIC(5,2),
frequency_code VARCHAR(40),
module_code VARCHAR(80),
area_code VARCHAR(80),
applies_to_industries JSONB,
applies_to_company_types JSONB,
threshold_rules JSONB,
alert_codes JSONB,
tension_codes JSONB,
action_codes JSONB,
score_impact_direction VARCHAR(40),
score_impact_weight NUMERIC(6,4),
formula_status VARCHAR(40) DEFAULT 'ACTIVE',
version VARCHAR(40) DEFAULT 'V1',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
---
16. Tabla SQL sugerida: ejecuciones de fórmulas
CREATE TABLE faro_formula_executions (
formula_execution_id UUID PRIMARY KEY,
company_id UUID NOT NULL,
formula_code VARCHAR(80) NOT NULL,
kpi_code VARCHAR(80),
period_id VARCHAR(80) NOT NULL,
execution_scope JSONB,
result_value NUMERIC(18,6),
result_text TEXT,
result_status VARCHAR(40),
data_quality_score NUMERIC(5,2),
confidence_score NUMERIC(5,2),
records_used INTEGER,
source_batches JSONB,
alerts_triggered JSONB,
tensions_triggered JSONB,
actions_suggested JSONB,
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
---
17. Tabla SQL sugerida: dependencias de fórmulas
CREATE TABLE faro_formula_dependencies (
dependency_id UUID PRIMARY KEY,
formula_code VARCHAR(80) NOT NULL,
depends_on_formula_code VARCHAR(80) NOT NULL,
dependency_type VARCHAR(60),
required BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
---
18. Reglas FARO para fórmulas
| Código | Regla |
|---|---|
| FML-R001 | Toda fórmula debe tener código único |
| FML-R002 | Toda fórmula debe estar vinculada a un KPI |
| FML-R003 | Toda fórmula debe declarar fuentes y campos requeridos |
| FML-R004 | Toda fórmula debe declarar dimensiones permitidas |
| FML-R005 | Toda fórmula ejecutiva debe tener calidad mínima de datos |
| FML-R006 | Toda fórmula debe ser versionada |
| FML-R007 | Toda fórmula compuesta debe declarar dependencias |
| FML-R008 | Toda fórmula que active alerta debe tener umbral |
| FML-R009 | Toda fórmula que active tensión debe conectarse al mapa causal |
| FML-R010 | Toda fórmula que impacte Score debe tener peso |
| FML-R011 | Toda fórmula debe poder auditar registros usados |
| FML-R012 | Toda fórmula específica por industria debe declarar industria |
| FML-R013 | Toda fórmula con división debe usar `SAFE_DIVIDE` |
| FML-R014 | Fórmulas con datos débiles deben mostrar confianza reducida |
| FML-R015 | Fórmulas críticas no deben ejecutarse sin RAW trazable |
---
19. Output esperado en FARO
FARO debe poder mostrar el resultado así:
KPI:
Margen bruto %
Resultado:
21%
Alcance:
Sucursal San Juan / Rubro Cemento / Mayo 2026
Fórmula:
SUM(venta_neta - costo) / SUM(venta_neta)
Datos usados:
1.248 líneas de venta
Fuente:
Excel ventas + maestro productos + costos ERP
Calidad del dato:
92%
Comparación:
Período anterior: 28%
Alerta:
Margen cayó 7 puntos.
Tensión:
Crecimiento no rentable.
Acción sugerida:
Revisar descuentos por vendedor y bloquear operaciones bajo margen mínimo.
---
20. Relación con alertas, tensiones y acciones
| Fórmula | Alerta | Tensión | Acción |
|---|---|---|---|
| Margen bruto % | Margen bajo | Crecimiento no rentable | Revisar descuentos |
| DSO | Cobranza lenta | Venta sin caja | Priorizar cobranza |
| Stock crítico | Quiebre | Producto rentable sin stock | Reponer |
| Gasto sobre ventas | Gasto alto | Rentabilidad invisible | Revisar gastos |
| Comisión sobre margen | Comisión alta | Incentivo roto | Ajustar comisión |
| Acciones vencidas | Ejecución débil | Diagnóstico sin ejecución | Escalar responsable |
---
21. Definición oficial del activo
Nombre
Fórmulas FARO por KPI
Objetivo
Definir una biblioteca gobernada de fórmulas ejecutables por empresa, sucursal, área, módulo, responsable, cliente, producto, proveedor, canal, rubro, industria y período, permitiendo calcular KPIs simples, compuestos, contextuales y ponderados para alimentar alertas, tensiones, acciones, reportes y FARO Score.
Volumen estimado V1
| Elemento | Cantidad |
|---|---|
| Fórmulas diseñadas | 1.000 |
| Familias de fórmulas | 25 |
| Fórmulas por familia | 40 |
| Fórmulas MVP | 180 |
| Fórmulas Business | 450 |
| Fórmulas Enterprise | 800 |
| Fórmulas Neural | 1.000+ |
| Tablas técnicas sugeridas | 3 |
| Reglas base | 15 |
---
22. Frase para explicar
FARO tiene una biblioteca de fórmulas por KPI. Cada fórmula puede ejecutarse por empresa, sucursal, área, responsable, cliente, producto, canal, rubro, industria y período. Así calcula indicadores simples y compuestos, detecta alertas, activa tensiones, recomienda acciones y actualiza FARO Score con trazabilidad.
---
23. Decisión recomendada
Para MVP:
Diseñar 1.000 fórmulas.
Activar 180 fórmulas críticas.
Priorizar ventas, margen, descuentos, cobranza, caja, stock, compras, gastos, RRHH, logística, acciones, calidad de datos y Score.
Para Business:
Activar 450 fórmulas.
Sumar comisiones avanzadas, clientes, proveedores, centros de costo, sucursales, flujo financiero, proyectos y calidad.
Para Enterprise:
Activar 800 fórmulas.
Sumar presupuesto, contratos, producción, mantenimiento, industria, benchmark, riesgo y auditoría avanzada.
Para Neural:
Usar 1.000+ fórmulas con pesos dinámicos por industria, contexto, confianza de datos, aprendizaje y simulación.
---
24. Cadena correcta dentro de FARO
Dato validado
→ maestro
→ contexto
→ fórmula KPI
→ resultado
→ umbral
→ alerta
→ relación causal
→ tensión
→ recomendación
→ acción
→ evidencia
→ impacto FARO Score
La fórmula es el puente entre el dato y la dirección. Si la fórmula está mal, todo lo demás queda elegante pero torcido.
¿Querés activar este activo en tu empresa?
Workshop de 90 min: analizamos tu caso, identificamos qué de este activo aplica a tu rubro y armamos el plan de implementación FARO.
📅 Programar workshop →