ANEXO 21
Alertas FARO
Este anexo corresponde a la Fase 6 — Inteligencia, etapa “Alertas FARO”. Es la capa donde FARO Connect transforma reglas activadas en avisos concretos, priorizados y accionables.
1. Objetivo del anexo
El objetivo del Anexo 21 — Alertas FARO es definir cuándo, cómo, a quién y con qué prioridad FARO debe avisar que algo requiere atención.
La pregunta central es:
¿Qué evento merece ser comunicado como alerta y qué debe hacer la empresa con esa alerta?
Ejemplo simple:
KPI:
Margen bruto = 18%
Señal:
Margen bajo.
Regla:
Si margen < 20% y descuento > 10%, activar alerta.
Alerta FARO:
Margen crítico por descuento alto.
Responsable:
Gerente Comercial.
Acción sugerida:
Auditar ventas con descuento mayor al 8%.
Vencimiento sugerido:
72 horas.
La alerta no debe ser solo un cartel rojo. Debe ser un disparador de gestión.
2. Tesis del Anexo 21
La tesis es:
Una alerta FARO no es una notificación. Es una unidad de dirección.
Una alerta debe decir:
Qué pasó.
Por qué importa.
Qué KPI afecta.
Qué regla la disparó.
Qué tensión puede generar.
Qué área responde.
Qué responsable debe actuar.
Qué acción se sugiere.
Qué prioridad tiene.
Qué vencimiento corresponde.
Qué impacto puede tener en FARO Score.
Si una alerta no deriva en decisión, acción o seguimiento, es ruido. Y el ruido en dirección es veneno con buena interfaz.
3. Diferencia entre señal, regla, alerta, tensión y acción
| Concepto | Qué hace | Ejemplo |
|---|---|---|
| Señal | Detecta un movimiento relevante. | Margen cayó 7 puntos. |
| Regla | Evalúa si ese movimiento cumple una condición. | Margen < 20% y descuento > 10%. |
| Alerta | Comunica formalmente el riesgo. | Margen crítico por descuento alto. |
| Tensión | Interpreta contradicción entre variables. | Ventas suben, margen baja y cobranza empeora. |
| Acción | Define qué hacer. | Auditar descuentos mayores al 8%. |
La alerta es el punto donde FARO le dice a la organización:
“Esto ya merece gestión.”
4. Qué es una alerta FARO
Una alerta FARO es un aviso estructurado generado cuando una regla se activa y el evento tiene suficiente relevancia para ser comunicado.
Ejemplo:
{
"alert_code": "margin_discount_alert",
"title": "Margen crítico con descuento alto",
"area": "Comercial",
"severity": "alta",
"kpi": "margen_bruto",
"rule": "RULE_MARGIN_DISCOUNT_001",
"responsible": "Gerente Comercial",
"suggested_action": "auditar_descuentos_altos",
"due_hours": 72,
"possible_tension": "crecimiento_no_rentable",
"score_impact": -4
}
Una alerta bien diseñada debe ser:
clara
concreta
priorizada
explicable
trazable
asignable
accionable
medible
5. Lo que una alerta NO debe ser
Una alerta FARO no debe ser:
un mensaje genérico,
un semáforo sin explicación,
un pop-up molesto,
una alarma sin responsable,
una lista infinita de problemas,
una notificación que nadie cierra,
un “revisar” sin contexto,
un ruido repetido todos los días.
Ejemplo malo:
Alerta: margen bajo.
Ejemplo FARO:
Alerta: margen crítico por descuento alto.
El margen bruto de la sucursal San Juan cayó a 18%, por debajo del umbral rojo del 20%. El descuento promedio subió a 12%. Esto puede indicar deterioro comercial por política de descuentos.
Responsable: Gerente Comercial.
Acción sugerida: auditar ventas con descuento mayor al 8%.
Vencimiento sugerido: 72 horas.
6. Tipos de alertas FARO
FARO debería manejar distintas familias de alertas.
| Tipo de alerta | Qué detecta | Ejemplo |
|---|---|---|
| Alerta de KPI | Un indicador está fuera de umbral. | Margen bruto en rojo. |
| Alerta de señal | Una variación relevante se detectó. | Margen cayó 7 puntos. |
| Alerta de regla | Una condición lógica se cumplió. | Margen bajo + descuento alto. |
| Alerta de tensión probable | Varias señales indican contradicción. | Crecimiento no rentable probable. |
| Alerta de ejecución | Acción, tarea o decisión no avanza. | Acción crítica vencida. |
| Alerta de calidad de datos | El dato no es confiable. | Costos faltantes en 25% de ventas. |
| Alerta preventiva | Riesgo futuro antes de que explote. | Stock aún positivo, pero cobertura menor al plazo proveedor. |
| Alerta crítica | Riesgo alto inmediato. | Caja debajo del mínimo operativo. |
| Alerta recurrente | Problema repetido. | Mismo reclamo aparece 4 semanas seguidas. |
| Alerta de score | FARO Score cae o cambia fuerte. | Score baja 8 puntos por margen y stock. |
7. Biblioteca inicial de alertas FARO
Una base inicial seria debería tener:
150 a 300 alertas iniciales
Escalable a:
1.000+ alertas por industria, módulo, KPI, tensión, acción y responsable.
Distribución sugerida:
| Familia de alertas | Cantidad inicial |
|---|---|
| Comerciales | 30-50 |
| Financieras | 30-50 |
| Stock / Compras | 30-60 |
| RRHH | 20-40 |
| Operaciones | 30-50 |
| Dirección / Workflow | 30-60 |
| Calidad de datos | 20-40 |
| Clientes | 20-40 |
| Proveedores | 20-40 |
| Industria específica | 50-150 |
Arranque recomendable para MVP:
30 a 50 alertas críticas bien diseñadas.
Más vale pocas alertas que se atienden que 300 alarmas que todos aprenden a ignorar.
8. Estructura estándar de una alerta FARO
Cada alerta debe tener una ficha estructurada.
{
"alert_code": "ALERT_COMMERCIAL_001",
"title": "Margen crítico con descuento alto",
"description": "El margen bruto cayó por debajo del umbral definido y el descuento promedio superó el máximo permitido.",
"module": "Comercial",
"area": "Comercial",
"severity": "alta",
"priority": "alta",
"kpi_code": "gross_margin_rate",
"signal_code": "gross_margin_drop",
"rule_code": "RULE_MARGIN_DISCOUNT_001",
"possible_tension": "crecimiento_no_rentable",
"responsible_role": "Gerente Comercial",
"approver_role": "Dirección",
"consulted_roles": ["Finanzas", "Compras"],
"suggested_action": "auditar_descuentos_altos",
"due_hours": 72,
"score_impact": -4,
"confidence": 0.84,
"status": "open",
"channels": ["FARO Connect", "email", "WhatsApp ejecutivo"]
}
9. Campos obligatorios por alerta
| Campo | Para qué sirve |
|---|---|
| alert_code | Identificador único. |
| title | Título claro para el usuario. |
| description | Explicación ejecutiva. |
| module | Módulo FARO donde vive. |
| area | Área responsable. |
| severity | Gravedad. |
| priority | Orden de atención. |
| kpi_code | KPI afectado. |
| rule_code | Regla que la disparó. |
| responsible_role | Responsable de actuar. |
| suggested_action | Acción sugerida. |
| due_hours / due_date | Plazo recomendado. |
| confidence | Confianza de la alerta. |
| status | Estado de gestión. |
| score_impact | Impacto posible en FARO Score. |
10. Severidad de alertas
La severidad indica gravedad del evento.
| Severidad | Lectura | Ejemplo |
|---|---|---|
| Baja | Requiere monitoreo. | Leve aumento de gastos. |
| Media | Requiere revisión. | Descuento promedio en amarillo. |
| Alta | Requiere acción concreta. | Margen en rojo con descuento alto. |
| Crítica | Requiere prioridad inmediata y escalamiento. | Caja por debajo del mínimo operativo. |
11. Fórmula de severidad de alerta
Severidad alerta =
impacto económico × 30%
+ urgencia × 20%
+ desviación contra umbral × 20%
+ recurrencia × 15%
+ cantidad de áreas afectadas × 10%
+ confianza del dato × 5%
Código ejemplo:
def calcular_severidad_alerta(
impacto,
urgencia,
desvio,
recurrencia,
areas_afectadas,
confianza
):
score = (
impacto * 0.30 +
urgencia * 0.20 +
desvio * 0.20 +
recurrencia * 0.15 +
areas_afectadas * 0.10 +
confianza * 0.05
)
if score >= 85:
return "critica"
elif score >= 65:
return "alta"
elif score >= 45:
return "media"
return "baja"
12. Prioridad de alerta
La severidad no siempre es igual a prioridad.
Ejemplo:
Una alerta financiera media puede tener prioridad alta si afecta caja de esta semana.
Una alerta comercial alta puede esperar si no tiene impacto inmediato.
Fórmula sugerida:
Prioridad =
severidad × 30%
+ impacto en caja × 25%
+ vencimiento cercano × 15%
+ tensión relacionada × 15%
+ responsable disponible × 5%
+ recurrencia × 10%
Código:
def calcular_prioridad_alerta(
severidad_score,
impacto_caja,
vencimiento_cercano,
tension_relacionada,
responsable_disponible,
recurrencia
):
return round(
severidad_score * 0.30 +
impacto_caja * 0.25 +
vencimiento_cercano * 0.15 +
tension_relacionada * 0.15 +
responsable_disponible * 0.05 +
recurrencia * 0.10,
2
)
13. Estados de una alerta
| Estado | Significado |
|---|---|
| Open | Alerta abierta. |
| Acknowledged | Responsable la vio. |
| Assigned | Ya tiene responsable formal. |
| In progress | Se está trabajando. |
| Waiting validation | Requiere validar dato o causa. |
| Converted to action | Generó acción formal. |
| Escalated | Fue escalada a un superior. |
| Resolved | Se resolvió la condición. |
| Dismissed | Se descartó por no aplicar. |
| False positive | Alerta incorrecta. |
| Recurring | Reaparece en varios períodos. |
| Closed | Cerrada con evidencia. |
Regla sana:
Una alerta no debería cerrarse solo porque alguien la vio. Se cierra porque se resolvió, se justificó o se convirtió en acción.
14. Ciclo de vida de una alerta FARO
Regla activada
→ alerta generada
→ responsable notificado
→ responsable confirma lectura
→ FARO sugiere acción
→ se crea acción o se justifica descarte
→ se hace seguimiento
→ se mide resultado
→ se cierra alerta
→ se actualiza FARO Score
→ se aprende para futuras reglas
15. Alertas comerciales
15.1 Alertas base
| Alerta | Condición | Responsable |
|---|---|---|
| Margen crítico | margen < umbral rojo | Gerente Comercial |
| Descuento alto | descuento > máximo permitido | Gerente Comercial |
| Venta no rentable | margen bajo + descuento alto | Comercial / Finanzas |
| Vendedor con margen bajo | margen por vendedor bajo | Gerente Comercial |
| Cliente grande poco rentable | venta alta + margen bajo | Comercial / Finanzas |
| Comisión desalineada | comisión sube + margen baja | Comercial / RRHH |
| Mix comercial débil | venta sube en productos bajo margen | Comercial |
| Canal no rentable | canal con margen bajo recurrente | Comercial |
15.2 Código: alerta de margen crítico
def alerta_margen_critico(margen, descuento, confianza):
if margen < 0.20 and confianza >= 0.75:
return {
"alert_code": "margin_critical",
"title": "Margen crítico",
"severity": "alta",
"area": "Comercial",
"responsible": "Gerente Comercial",
"suggested_action": "auditar_operaciones_bajo_margen",
"confidence": confianza
}
if margen < 0.20 and confianza < 0.75:
return {
"alert_code": "margin_critical_low_confidence",
"title": "Margen crítico con baja confianza",
"severity": "media",
"area": "Comercial",
"requires_validation": True,
"confidence": confianza
}
return None
16. Alertas financieras
16.1 Alertas base
| Alerta | Condición | Responsable |
|---|---|---|
| Caja bajo mínimo | caja < caja mínima | Finanzas |
| Cobranza lenta | días cobranza > objetivo | Finanzas |
| Mora crítica | mora > umbral | Finanzas |
| Cliente grande moroso | concentración alta + mora | Finanzas / Comercial |
| Gasto desalineado | gastos crecen más que ventas | Finanzas |
| Pago vencido crítico | obligación vencida | Finanzas |
| Flujo operativo negativo | egresos > ingresos | Finanzas |
| Rentabilidad operativa baja | rentabilidad < umbral | Dirección / Finanzas |
16.2 Código: alerta caja bajo mínimo
def alerta_caja_bajo_minimo(caja_actual, caja_minima):
if caja_actual < caja_minima:
brecha = caja_minima - caja_actual
return {
"alert_code": "cash_below_minimum",
"title": "Caja por debajo del mínimo operativo",
"severity": "critica",
"area": "Finanzas",
"responsible": "Responsable de Finanzas",
"suggested_action": "priorizar_cobranza_y_revisar_pagos",
"brecha": brecha,
"score_impact": -7
}
return None
17. Alertas de stock
17.1 Alertas base
| Alerta | Condición | Responsable |
|---|---|---|
| Stock bajo mínimo | stock actual < stock mínimo | Stock |
| Cobertura insuficiente | días cobertura < plazo proveedor | Compras / Stock |
| Stock inmovilizado | producto sin movimiento > umbral | Stock / Finanzas |
| Quiebre de producto clave | producto crítico sin stock | Stock / Comercial |
| Diferencia físico-sistema | diferencia > tolerancia | Stock |
| Stock mal compuesto | stock alto + rotación baja + quiebres | Stock / Compras |
| Producto crítico sin proveedor alternativo | alta dependencia | Compras |
| Sobrestock por sucursal | stock alto y baja venta local | Stock / Sucursal |
17.2 Código: alerta cobertura insuficiente
def alerta_cobertura_insuficiente(stock_actual, venta_promedio_diaria, plazo_proveedor):
if venta_promedio_diaria == 0:
return None
dias_cobertura = stock_actual / venta_promedio_diaria
if dias_cobertura < plazo_proveedor:
return {
"alert_code": "coverage_below_supplier_lead_time",
"title": "Cobertura menor al plazo de reposición",
"severity": "alta",
"area": "Stock / Compras",
"responsible": "Responsable de Compras",
"consulted": ["Stock", "Comercial"],
"suggested_action": "anticipar_reposicion_o_buscar_alternativa",
"dias_cobertura": round(dias_cobertura, 2),
"plazo_proveedor": plazo_proveedor
}
return None
18. Alertas de compras y proveedores
| Alerta | Condición | Responsable |
|---|---|---|
| Proveedor incumplidor | cumplimiento < umbral | Compras |
| Proveedor crítico | dependencia alta + bajo cumplimiento | Compras / Dirección |
| Costo de compra sube | variación costo > tolerancia | Compras / Finanzas |
| Compra urgente recurrente | compras urgentes > umbral | Compras |
| Orden crítica pendiente | orden vencida de producto clave | Compras |
| Proveedor sin alternativa | dependencia alta sin suplente | Dirección / Compras |
| Recepción con diferencia | diferencia cantidad/precio | Compras / Stock |
Código ejemplo:
def alerta_proveedor_critico(cumplimiento, dependencia):
if cumplimiento < 0.75 and dependencia > 0.40:
return {
"alert_code": "critical_supplier",
"title": "Proveedor crítico",
"severity": "alta",
"area": "Compras",
"responsible": "Responsable de Compras",
"consulted": ["Stock", "Finanzas"],
"suggested_action": "buscar_proveedor_alternativo_y_revisar_plan_de_reposicion",
"possible_tension": "proveedor_critico"
}
return None
19. Alertas de RRHH
| Alerta | Condición | Responsable |
|---|---|---|
| Costo laboral alto | costo laboral / ventas > umbral | RRHH / Finanzas |
| Comisión desalineada | comisión sube + margen baja | Comercial / RRHH |
| Ausentismo alto | ausentismo > umbral | RRHH |
| Productividad baja | productividad < objetivo | RRHH / Área |
| Dependencia de persona clave | proceso crítico concentrado | Dirección / RRHH |
| Tareas vencidas por responsable | vencimientos recurrentes | Responsable superior |
| Rotación elevada | bajas > umbral | RRHH |
Código ejemplo:
def alerta_comision_desalineada(comision_sobre_margen, umbral=0.25):
if comision_sobre_margen > umbral:
return {
"alert_code": "commission_margin_misaligned",
"title": "Comisión elevada sobre margen",
"severity": "alta",
"area": "Comercial / RRHH",
"responsible": "Gerente Comercial",
"consulted": ["RRHH", "Finanzas"],
"suggested_action": "revisar_formula_de_comision_por_margen_y_cobranza"
}
return None
20. Alertas de operaciones y workflow
| Alerta | Condición | Responsable |
|---|---|---|
| Acción crítica vencida | acción crítica vencida | Responsable + Gerencia |
| Acciones vencidas altas | tasa vencidas > umbral | Gerencia General |
| Decisión sin acción | decisión no bajada a tarea | Dirección |
| Acción sin responsable | tarea huérfana | Gerencia / FARO Admin |
| Reclamo reincidente | reclamo repetido | Operaciones |
| SLA incumplido | cumplimiento < umbral | Operaciones |
| Cuello de botella | acumulación por etapa | Responsable de proceso |
| Cierre sin medición | acción cerrada sin KPI | Dirección |
Código:
def alerta_accion_critica_vencida(accion):
if accion["prioridad"] == "critica" and accion["estado"] != "cerrada" and accion["dias_vencida"] >= 1:
return {
"alert_code": "critical_action_overdue",
"title": "Acción crítica vencida",
"severity": "critica",
"area": accion["area"],
"responsible": accion["responsable"],
"escalate_to": "Gerencia General",
"suggested_action": "exigir_cierre_o_reasignar_responsable",
"score_impact": -6
}
return None
21. Alertas de calidad de datos
Estas alertas son fundamentales. Si los datos son malos, FARO debe avisarlo antes de actuar.
| Alerta | Condición | Impacto |
|---|---|---|
| Costo unitario incompleto | faltan costos en ventas | margen no confiable |
| Clientes duplicados | duplicación alta | rentabilidad/mora distorsionada |
| Stock desactualizado | última carga vieja | stock no confiable |
| Falta trazabilidad | registros sin origen | baja auditoría |
| Campos críticos vacíos | datos mínimos faltantes | bloquea KPIs |
| Inconsistencia entre fuentes | ERP ≠ banco / stock físico ≠ sistema | requiere conciliación |
| Carga atrasada | fuente no actualiza | score desactualizado |
Código:
def alerta_calidad_datos(score_calidad, modulo):
if score_calidad < 0.50:
return {
"alert_code": "data_quality_critical",
"title": f"Calidad de datos crítica en {modulo}",
"severity": "critica",
"area": "Data / Sistemas",
"responsible": "Data Owner",
"suggested_action": "bloquear_decisiones_criticas_y_corregir_datos",
"score_impact": -5
}
if score_calidad < 0.70:
return {
"alert_code": "data_quality_weak",
"title": f"Calidad de datos débil en {modulo}",
"severity": "media",
"area": "Data / Sistemas",
"responsible": "Data Owner",
"suggested_action": "revisar_completitud_y_trazabilidad",
"score_impact": -2
}
return None
22. Alertas preventivas
Las alertas preventivas son una de las capas más valiosas de FARO.
No esperan el rojo. Detectan el riesgo temprano.
Ejemplo:
Stock actual todavía está por encima del mínimo,
pero los días de cobertura son menores al plazo de reposición.
Alerta:
Riesgo de stock crítico futuro.
Código:
def alerta_preventiva_stock(stock_actual, stock_minimo, venta_promedio_diaria, plazo_proveedor):
if venta_promedio_diaria == 0:
return None
dias_cobertura = stock_actual / venta_promedio_diaria
if stock_actual >= stock_minimo and dias_cobertura < plazo_proveedor:
return {
"alert_code": "future_stock_risk",
"title": "Riesgo futuro de stock crítico",
"severity": "media_alta",
"area": "Stock / Compras",
"responsible": "Responsable de Compras",
"suggested_action": "anticipar_reposicion",
"preventive": True
}
return None
Esto es lo que diferencia a FARO de un tablero que llega tarde con cara de serio.
23. Alertas recurrentes
Una alerta recurrente indica que la empresa no está resolviendo la causa.
Ejemplo:
Margen crítico en la misma familia de productos durante 4 semanas.
O:
Acciones vencidas del mismo responsable durante 3 períodos.
Código:
def alerta_recurrente(alertas_previas, alert_code, limite=3):
ocurrencias = [a for a in alertas_previas if a["alert_code"] == alert_code]
if len(ocurrencias) >= limite:
return {
"alert_code": f"{alert_code}_recurring",
"title": "Alerta recurrente",
"severity": "alta",
"message": "La alerta se repite y puede indicar causa raíz no resuelta.",
"suggested_action": "analizar_causa_raiz_y_escalar"
}
return None
24. Alertas agrupadas
Para evitar ruido, FARO debe agrupar alertas relacionadas.
Ejemplo:
Alertas separadas:
Margen bajo.
Descuento alto.
Cobranza lenta.
Comisión elevada.
Agrupación FARO:
Paquete de alerta:
Crecimiento comercial riesgoso.
Esto puede derivar en tensión:
Crecimiento no rentable.
Código conceptual:
def agrupar_alertas(alertas):
codigos = set(a["alert_code"] for a in alertas)
if {"margin_critical", "discount_high", "collection_slow"}.issubset(codigos):
return {
"alert_group": "commercial_growth_risk",
"title": "Crecimiento comercial riesgoso",
"possible_tension": "crecimiento_no_rentable",
"severity": "alta"
}
return None
25. Supresión de ruido
FARO debe evitar alertar por lo mismo cada cinco minutos.
Reglas de supresión:
No repetir la misma alerta si ya está abierta.
No notificar todos los días si no cambió la severidad.
Agrupar alertas similares.
Escalar solo si hay vencimiento o agravamiento.
Cerrar automáticamente solo si la condición se normalizó y fue validada.
Código ejemplo:
def debe_notificar(alerta_nueva, alertas_abiertas):
for alerta in alertas_abiertas:
misma_alerta = alerta["alert_code"] == alerta_nueva["alert_code"]
mismo_responsable = alerta["responsible"] == alerta_nueva["responsible"]
if misma_alerta and mismo_responsable and alerta["status"] in ["open", "in_progress"]:
return False
return True
26. Canales de alerta
FARO puede enviar alertas por distintos canales.
| Canal | Uso recomendado |
|---|---|
| FARO Connect | Canal principal y trazable. |
| Alertas formales o reportes. | |
| WhatsApp ejecutivo | Alertas críticas o urgentes. |
| Slack / Teams | Equipos operativos o técnicos. |
| Dashboard | Visibilidad general. |
| Reporte semanal | Alertas consolidadas. |
| Comité de dirección | Alertas estratégicas y recurrentes. |
Regla sana:
WhatsApp solo para lo crítico. Si todo va por WhatsApp, nada es crítico.
27. Matriz canal según severidad
| Severidad | Canal |
|---|---|
| Baja | FARO Connect |
| Media | FARO Connect + resumen diario/semanal |
| Alta | FARO Connect + email al responsable |
| Crítica | FARO Connect + email + WhatsApp ejecutivo + escalamiento |
28. Alertas y responsables
Cada alerta debe tener RACI.
Ejemplo:
| Alerta | R | A | C | I |
|---|---|---|---|---|
| Margen crítico | Gerente Comercial | Dirección | Finanzas / Compras | Administración |
| Stock crítico | Responsable Stock | Dirección | Compras / Comercial | Sucursal |
| Caja bajo mínimo | Finanzas | Dirección | Comercial | Administración |
| Acción crítica vencida | Responsable acción | Gerencia General | Área involucrada | Dirección |
| Calidad datos baja | Data Owner | Dirección | Área dueña del dato | Sistemas |
Código:
def raci_alerta(alert_code):
mapa = {
"margin_critical": {
"R": "Gerente Comercial",
"A": "Dirección",
"C": ["Finanzas", "Compras"],
"I": ["Administración"]
},
"stock_critical": {
"R": "Responsable de Stock",
"A": "Dirección",
"C": ["Compras", "Comercial"],
"I": ["Sucursal"]
},
"cash_below_minimum": {
"R": "Finanzas",
"A": "Dirección",
"C": ["Comercial"],
"I": ["Administración"]
}
}
return mapa.get(alert_code)
29. Alertas y vencimientos
Una alerta debe tener plazo sugerido según severidad.
| Severidad | Vencimiento sugerido |
|---|---|
| Baja | 7 a 14 días |
| Media | 3 a 7 días |
| Alta | 48 a 72 horas |
| Crítica | 24 horas o menos |
Código:
def vencimiento_por_severidad(severidad):
if severidad == "critica":
return 24
if severidad == "alta":
return 72
if severidad == "media":
return 7 * 24
return 14 * 24
30. Alertas y acciones
Una alerta puede:
quedar en observación,
generar acción sugerida,
generar acción obligatoria,
escalar a Dirección,
agruparse en tensión,
afectar FARO Score.
Ejemplo:
def convertir_alerta_en_accion(alerta):
if alerta["severity"] in ["alta", "critica"]:
return {
"title": alerta["suggested_action"],
"area": alerta["area"],
"responsible": alerta["responsible"],
"due_hours": vencimiento_por_severidad(alerta["severity"]),
"related_alert": alerta["alert_code"],
"priority": alerta["severity"],
"status": "pendiente"
}
return None
31. Alertas y tensiones
Una alerta aislada puede no ser tensión.
Ejemplo:
Margen bajo = alerta.
Pero:
Margen bajo
+ ventas altas
+ descuento alto
+ cobranza lenta
= tensión de crecimiento no rentable.
Tabla:
| Alertas combinadas | Tensión probable |
|---|---|
| Margen bajo + descuento alto + ventas altas | Crecimiento no rentable |
| Caja baja + cobranza lenta + ventas altas | Caja débil con ventas altas |
| Stock crítico + proveedor incumplidor | Riesgo de abastecimiento |
| Comisión alta + margen bajo | Comisión desalineada |
| Acciones vencidas + reincidencia | Dirección sin ejecución |
| Gasto sube + ventas planas | Estructura sobredimensionada |
32. Alertas y FARO Score
Las alertas deben impactar el FARO Score según severidad, recurrencia y estado.
Fórmula simple
def impacto_alerta_score(severidad, recurrente=False, cerrada_en_tiempo=False):
if cerrada_en_tiempo:
return 2
impacto = {
"baja": -1,
"media": -2,
"alta": -4,
"critica": -7
}.get(severidad, 0)
if recurrente:
impacto *= 1.5
return impacto
Ejemplo:
Alerta crítica abierta: -7 puntos.
Alerta crítica recurrente: -10,5 puntos.
Alerta alta cerrada en tiempo: +2 puntos.
33. Alertas por industria
33.1 Construcción / insumos
Margen crítico por producto.
Descuento alto por vendedor.
Stock crítico en cemento / hierro / productos clave.
Cliente de obra con mora.
Canje sin evaluación financiera.
Referido sin trazabilidad.
Comisión externa elevada.
Proveedor crítico de producto esencial.
Compra urgente por falta de planificación.
33.2 Retail
Promoción destructiva.
Quiebre de producto estrella.
Sucursal con margen bajo.
Merma alta.
Stock alto con baja rotación.
Ticket promedio en caída.
33.3 Salud
Ocupación alta con demora.
Turnos perdidos.
Profesional saturado.
Costo por prestación elevado.
Reclamos crecientes.
Insumo crítico bajo mínimo.
33.4 Logística
SLA incumplido.
Costo por kilómetro elevado.
Combustible desalineado.
Ruta no rentable.
Flota ociosa.
Mantenimiento reactivo.
33.5 Hotelería
Ocupación alta con tarifa baja.
RevPAR bajo.
Canal caro dominante.
Reclamos altos.
Costo por habitación ocupada elevado.
Cancelaciones crecientes.
33.6 Shopping / real estate
Locatario clave moroso.
Vacancia crítica por zona.
Tráfico alto con baja conversión.
Costos comunes desalineados.
Mix comercial débil.
Renta por m² deteriorada.
34. Ejemplo completo: alerta comercial
Datos
Ventas: +18%
Margen actual: 18%
Descuento promedio: 12%
Confianza: 0.86
Regla activada
Si margen < 20%
y descuento > 10%
y confianza >= 0.75,
activar alerta de margen crítico por descuento.
Alerta FARO
{
"alert_code": "margin_discount_critical",
"title": "Margen crítico por descuento alto",
"severity": "alta",
"priority": "alta",
"area": "Comercial",
"responsible": "Gerente Comercial",
"consulted": ["Finanzas", "Compras"],
"suggested_action": "auditar_ventas_con_descuento_mayor_al_8",
"due_hours": 72,
"possible_tension": "crecimiento_no_rentable",
"score_impact": -4
}
Lectura ejecutiva
La empresa está vendiendo con margen crítico y alto descuento. Puede estar comprando volumen a costa de rentabilidad.
35. Ejemplo completo: alerta financiera
Datos
Caja mínima requerida: $20M
Caja actual: $13M
Días de cobranza: 48
Ventas: +12%
Alerta FARO
{
"alert_code": "cash_below_minimum",
"title": "Caja por debajo del mínimo operativo",
"severity": "critica",
"area": "Finanzas",
"responsible": "Finanzas",
"consulted": ["Comercial", "Dirección"],
"suggested_action": "priorizar_cobranza_y_reprogramar_pagos_no_criticos",
"due_hours": 24,
"possible_tension": "caja_debil_con_ventas_altas",
"score_impact": -7
}
Lectura ejecutiva
La empresa vende, pero no está convirtiendo ventas en caja con la velocidad necesaria. Riesgo financiero inmediato.
36. Ejemplo completo: alerta de stock
Datos
Stock actual: 180 unidades
Stock mínimo: 150 unidades
Venta promedio diaria: 45 unidades
Plazo proveedor: 7 días
Cálculo
Días de cobertura = 4 días
Alerta FARO
{
"alert_code": "future_stock_risk",
"title": "Riesgo futuro de stock crítico",
"severity": "alta",
"area": "Stock / Compras",
"responsible": "Compras",
"consulted": ["Stock", "Comercial"],
"suggested_action": "anticipar_reposicion_o_buscar_proveedor_alternativo",
"due_hours": 48,
"possible_tension": "stock_critico_comercial"
}
Lectura ejecutiva
Aunque el stock todavía supera el mínimo, la cobertura no alcanza para esperar el plazo del proveedor. Si no se actúa, habrá quiebre.
37. Tabla SQL de alertas
CREATE TABLE alert_events (
alert_id TEXT PRIMARY KEY,
alert_code TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
company_id TEXT,
branch_id TEXT,
area_id TEXT,
module TEXT,
kpi_code TEXT,
signal_id TEXT,
rule_code TEXT,
tension_code TEXT,
severity TEXT,
priority TEXT,
confidence NUMERIC,
responsible_id TEXT,
responsible_role TEXT,
approver_id TEXT,
suggested_action TEXT,
due_date TIMESTAMP,
status TEXT DEFAULT 'open',
score_impact NUMERIC,
source_snapshot JSONB,
created_at TIMESTAMP DEFAULT now(),
acknowledged_at TIMESTAMP,
resolved_at TIMESTAMP,
closed_at TIMESTAMP
);
38. Tabla SQL de biblioteca de alertas
CREATE TABLE alert_library (
alert_code TEXT PRIMARY KEY,
title TEXT NOT NULL,
description TEXT,
module TEXT,
area_id TEXT,
default_severity TEXT,
default_priority TEXT,
related_kpis JSONB,
related_rules JSONB,
related_tensions JSONB,
suggested_actions JSONB,
responsible_role TEXT,
consulted_roles JSONB,
default_due_hours INTEGER,
score_impact NUMERIC,
industry_scope JSONB,
channels JSONB,
active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now()
);
39. Tabla SQL de historial de estados
CREATE TABLE alert_status_history (
id TEXT PRIMARY KEY,
alert_id TEXT NOT NULL,
previous_status TEXT,
new_status TEXT,
changed_by TEXT,
change_reason TEXT,
changed_at TIMESTAMP DEFAULT now()
);
Esto permite auditar:
quién vio la alerta,
quién la asignó,
quién la cerró,
por qué se descartó,
cuándo se escaló,
qué acción generó.
40. Motor de alertas FARO
Flujo recomendado:
Regla activada
→ validar confianza mínima
→ revisar si ya existe alerta abierta
→ calcular severidad
→ calcular prioridad
→ asignar responsable
→ definir vencimiento
→ seleccionar canal
→ registrar alerta
→ notificar
→ crear acción si corresponde
→ impactar score
Código conceptual:
def motor_alertas(rule_result, alertas_abiertas):
if not rule_result:
return None
alerta = construir_alerta_desde_regla(rule_result)
if not debe_notificar(alerta, alertas_abiertas):
return {
"status": "suppressed",
"reason": "alerta_similar_abierta"
}
alerta["due_hours"] = vencimiento_por_severidad(alerta["severity"])
alerta["channels"] = canales_por_severidad(alerta["severity"])
return alerta
def canales_por_severidad(severidad):
if severidad == "critica":
return ["FARO Connect", "email", "WhatsApp ejecutivo"]
if severidad == "alta":
return ["FARO Connect", "email"]
if severidad == "media":
return ["FARO Connect", "resumen diario"]
return ["FARO Connect"]
41. Alertas y validación humana
No todas las alertas deben generar decisión automática.
| Alerta | Requiere validación humana |
|---|---|
| Stock bajo mínimo | No siempre. Puede crear acción automática. |
| Acción vencida | No. Puede escalar automáticamente. |
| Margen bajo | Sí, antes de cambiar política. |
| Cliente moroso | Sí, antes de bloquear crédito. |
| Comisión desalineada | Sí, antes de modificar fórmula. |
| Canje mal evaluado | Sí, siempre. |
| RRHH sensible | Sí, siempre. |
| Calidad de datos crítica | Sí, requiere data owner. |
Regla conservadora:
FARO puede automatizar seguimiento. Las decisiones sensibles deben quedar bajo aprobación humana.
42. Testing de alertas
Cada alerta debe probarse.
Ejemplo test:
def test_alerta_margen_critico():
alerta = alerta_margen_critico(
margen=0.18,
descuento=0.12,
confianza=0.90
)
assert alerta is not None
assert alerta["alert_code"] == "margin_critical"
assert alerta["severity"] == "alta"
Test con baja confianza:
def test_alerta_margen_baja_confianza():
alerta = alerta_margen_critico(
margen=0.18,
descuento=0.12,
confianza=0.60
)
assert alerta is not None
assert alerta["requires_validation"] is True
Sin testing, una alerta es apenas una sospecha con pretensiones.
43. Riesgos si no existe una buena capa de alertas
| Riesgo | Consecuencia |
|---|---|
| Demasiadas alertas | El usuario las ignora. |
| Alertas sin responsable | Nadie actúa. |
| Alertas sin explicación | Baja confianza. |
| Alertas sin vencimiento | No hay presión de cierre. |
| Alertas sin trazabilidad | No se puede auditar. |
| Alertas sin acción | Se informa, pero no se gestiona. |
| Alertas repetidas | Ruido operativo. |
| Alertas con datos débiles | Decisiones equivocadas. |
| Alertas sin relación con score | FARO Score pierde explicación. |
44. Output final del Anexo 21
Al finalizar este anexo, FARO debe tener definido:
1. Biblioteca inicial de alertas FARO.
2. Tipos de alertas.
3. Estructura estándar de alerta.
4. Severidad de alertas.
5. Prioridad de alertas.
6. Estados de alerta.
7. Ciclo de vida de una alerta.
8. Alertas por área.
9. Alertas por industria.
10. Alertas preventivas.
11. Alertas recurrentes.
12. Alertas agrupadas.
13. Reglas de supresión de ruido.
14. Canales de notificación.
15. RACI por alerta.
16. Vencimientos sugeridos.
17. Conversión alerta → acción.
18. Conversión alerta → tensión.
19. Impacto en FARO Score.
20. Tablas SQL de alertas.
21. Motor de alertas.
22. Validación humana.
23. Testing de alertas.
24. Gobernanza de alertas.
45. Conexión con otros anexos
| Próximo anexo | Qué recibe desde Anexo 21 |
|---|---|
| Anexo 17 — Biblioteca de KPIs | KPIs que pueden disparar alertas. |
| Anexo 18 — Objetivos y umbrales | Límites que definen estados de alerta. |
| Anexo 19 — Señales FARO | Señales que pueden convertirse en alertas. |
| Anexo 20 — Reglas de negocio | Reglas que disparan alertas. |
| Anexo 22 — Biblioteca de tensiones | Alertas combinadas que forman tensiones. |
| Anexo 23 — Diagnóstico ejecutivo | Alertas explicadas en lenguaje directivo. |
| Anexo 24 — Confianza del diagnóstico | Confianza mínima para alertar o escalar. |
| Anexo 25 — Priorización ejecutiva | Alertas ordenadas por impacto y urgencia. |
| Anexo 26 — Recomendaciones FARO | Recomendaciones derivadas de alertas. |
| Anexo 29 — Biblioteca de acciones | Acciones sugeridas por alerta. |
| Anexo 31 — Workflow y escalamiento | Alertas convertidas en tareas y escalamiento. |
| Anexo 35 — FARO Score | Impacto de alertas abiertas, críticas o resueltas. |
| Anexo 36 — Aprendizaje | Historial de alertas para mejorar reglas futuras. |
Las Alertas FARO son avisos ejecutivos accionables. Se generan cuando una regla detecta un desvío, riesgo o evento relevante, y deben incluir severidad, prioridad, responsable, vencimiento, explicación, acción sugerida, trazabilidad e impacto en FARO Score. No son notificaciones sueltas: son disparadores de gestión.