Saltearse al contenido

Presentación 8: Colas en Asterisk 22 - Fundamentos y Estrategias

Arquitectura de app_queue, estrategias de distribución, configuración avanzada, eventos AMI y mejores prácticas para call centers profesionales


Una cola (queue) es un mecanismo de Asterisk que:

  • ✅ Recibe llamadas entrantes
  • ✅ Las coloca en espera (con música)
  • ✅ Las distribuye automáticamente entre agentes disponibles
  • ✅ Gestiona prioridades, tiempos de espera y abandonos
  • ✅ Genera métricas y eventos para monitoreo
EscenarioSin ColaCon Cola
Soporte técnicoLlamadas perdidas si todos ocupadosLlamadas en espera con música
VentasCliente cuelga y llama a competenciaCliente espera, escucha posición
Mesa de ayudaNo hay métricas de atenciónSLA, tiempos, abandonos medidos
Call centerDistribución manual ineficienteDistribución automática optimizada

1. Cola (Queue)

  • Contenedor lógico con nombre único
  • Configurada en queues.conf
  • Tiene estrategia, timeouts, música, etc.

2. Miembros (Members)

  • Agentes que pueden atender llamadas
  • Pueden ser estáticos (en queues.conf) o dinámicos (login/logout)
  • Tienen estados: Idle, InUse, Paused, Unavailable

3. Estrategia (Strategy)

  • Algoritmo que decide a qué agente llamar
  • Ejemplos: ringall, rrmemory, fewestcalls

4. Estados de Miembro

  • Idle (Not in use): Disponible para recibir llamadas
  • InUse: Atendiendo una llamada
  • Paused: Logueado pero no recibe llamadas (break, wrapup)
  • Unavailable: Deslogueado o dispositivo no registrado

EstrategiaComportamientoCaso de Uso Ideal
ringallLlama a TODOS los agentes disponibles simultáneamenteUrgencias, pocas llamadas, prioridad en velocidad
rrmemoryRound-robin con memoria (recuerda dónde quedó)Call center balanceado, distribución equitativa
linearLlama en orden fijo (primero 1001, luego 1002, etc.)Jerarquías (supervisor primero, luego agentes)
fewestcallsLlama al agente con menos llamadas atendidasBalanceo por carga de trabajo
leastrecentLlama al agente que hace más tiempo no atiendeRotación justa, evitar “favoritos”
randomLlama a un agente aleatorioTesting, distribución sin patrón
wrandomAleatorio ponderado por penaltyPriorizar agentes senior (penalty bajo)

ringall - Todos suenan

Llamada → [Agente 1001] ← Suena
[Agente 1002] ← Suena
[Agente 1003] ← Suena
El primero que contesta gana

rrmemory - Round Robin con Memoria

Llamada 1 → Agente 1001 ✓
Llamada 2 → Agente 1002 ✓
Llamada 3 → Agente 1003 ✓
Llamada 4 → Agente 1001 ✓ (vuelve al inicio)

linear - Orden Fijo

Llamada → Intenta 1001 (ocupado)
→ Intenta 1002 (ocupado)
→ Intenta 1003 ✓ (disponible)

fewestcalls - Menos Llamadas Atendidas

Agente 1001: 5 llamadas atendidas
Agente 1002: 3 llamadas atendidas ← Seleccionado
Agente 1003: 7 llamadas atendidas

; /etc/asterisk/queues.conf
[general]
; === CONFIGURACIÓN GLOBAL ===
; Guardar miembros dinámicos en AstDB (persisten al reiniciar)
persistentmembers = yes
; Distribuir llamadas en paralelo (no serial)
autofill = yes
; Tipo de grabación
monitor-type = MixMonitor
; Compartir lastcall entre colas (para wrapuptime)
shared_lastcall = yes
; === PLANTILLA REUTILIZABLE ===
[plantilla-cola](!)
musicclass = default
strategy = rrmemory
timeout = 20
retry = 5
wrapuptime = 10
autopause = yes
ringinuse = no
joinempty = yes
leavewhenempty = no
announce-frequency = 30
announce-holdtime = yes
announce-position = yes
; === COLAS ESPECÍFICAS ===
[cola-ventas](plantilla-cola)
strategy = rrmemory
maxlen = 20
[cola-soporte](plantilla-cola)
strategy = fewestcalls
maxlen = 15
wrapuptime = 15
[cola-urgencias](plantilla-cola)
strategy = ringall
timeout = 10
maxlen = 5

timeout

timeout = 20
  • Tiempo (segundos) que suena el teléfono del agente
  • Si no contesta en 20s, pasa al siguiente agente
  • Recomendado: 15-20 segundos

retry

retry = 5
  • Tiempo (segundos) de espera antes de intentar con otro agente
  • Evita bombardear agentes inmediatamente
  • Recomendado: 3-5 segundos

wrapuptime

wrapuptime = 10
  • Tiempo (segundos) que el agente NO recibe llamadas después de colgar
  • Le da tiempo para completar notas, CRM, etc.
  • Crítico: Sin esto, el agente recibe llamadas inmediatamente
  • Recomendado: 10-30 segundos según tipo de negocio

autopause

autopause = yes
  • Pausa automáticamente al agente si NO contesta una llamada
  • Valores: no, yes (solo en esta cola), all (en todas las colas)
  • Recomendado: yes para evitar agentes “fantasma”

ringinuse

ringinuse = no
  • ¿Llamar a agentes que ya están en llamada?
  • no: Solo llama a agentes Idle (RECOMENDADO)
  • yes: Llama incluso si están ocupados (para call waiting)

joinempty / leavewhenempty

joinempty = yes
leavewhenempty = no
  • joinempty=yes: Permite entrar a cola aunque no haya agentes
  • leavewhenempty=no: No saca al llamante si todos se desloguean
  • Uso típico: Permitir entrar, no sacar (para que esperen)

maxlen

maxlen = 20
  • Máximo de llamadas en espera
  • Si se llena, nuevas llamadas son rechazadas
  • 0 = ilimitado (peligroso en producción)

announce-frequency / announce-holdtime / announce-position

announce-frequency = 30
announce-holdtime = yes
announce-position = yes
  • Cada 30 segundos, anuncia al llamante:
    • Su posición en la cola
    • Tiempo estimado de espera
  • Mejora experiencia del cliente

Estáticos (en queues.conf)

[cola-ventas]
member => PJSIP/1001
member => PJSIP/1002,2 ; penalty 2
member => PJSIP/1003,1,Juan Perez ; penalty 1, nombre

✅ Ventajas: Configuración permanente, no requiere login
❌ Desventajas: No flexible, requiere reload para cambios

Dinámicos (login/logout desde dialplan o AMI)

; Desde CLI
queue add member PJSIP/1001 to cola-ventas
; Desde dialplan
exten => *71,1,AddQueueMember(cola-ventas,PJSIP/${CHANNEL(endpoint)})
exten => *72,1,RemoveQueueMember(cola-ventas,PJSIP/${CHANNEL(endpoint)})

✅ Ventajas: Agentes se loguean/desloguean, flexible
❌ Desventajas: Se pierden al reiniciar (usar persistentmembers=yes)

member => PJSIP/1001,0 ; Penalty 0 (máxima prioridad)
member => PJSIP/1002,1 ; Penalty 1
member => PJSIP/1003,2 ; Penalty 2 (mínima prioridad)

Cómo funciona:

  1. La cola intenta primero con agentes de penalty 0
  2. Si todos están ocupados/pausados, intenta con penalty 1
  3. Y así sucesivamente

Caso de uso:

  • Penalty 0: Agentes senior
  • Penalty 1: Agentes regulares
  • Penalty 2: Agentes en entrenamiento

QueueMemberStatus

Event: QueueMemberStatus
Queue: cola-ventas
MemberName: Juan Perez
Interface: PJSIP/1001
Status: 1 ; 1=Idle, 2=InUse, 5=Unavailable
Paused: 0 ; 0=No pausado, 1=Pausado
CallsTaken: 15
LastCall: 1710876543
Penalty: 0
  • Se dispara cuando cambia el estado de un miembro
  • Uso: Actualizar dashboard de agentes en tiempo real

QueueCallerJoin

Event: QueueCallerJoin
Queue: cola-ventas
Position: 3
CallerIDNum: 987654321
  • Se dispara cuando una llamada entra a la cola
  • Uso: Contador de llamadas en espera

AgentCalled

Event: AgentCalled
Queue: cola-ventas
Interface: PJSIP/1001
CallerIDNum: 987654321
  • Se dispara cuando se intenta llamar a un agente
  • Uso: Ver qué agente está siendo contactado

AgentConnect

Event: AgentConnect
Queue: cola-ventas
Interface: PJSIP/1001
HoldTime: 45 ; Segundos que esperó el llamante
  • Se dispara cuando el agente contesta
  • Uso: Métricas de tiempo de espera

AgentComplete

Event: AgentComplete
Queue: cola-ventas
Interface: PJSIP/1001
TalkTime: 120 ; Duración de la llamada en segundos
Reason: agent ; agent, caller, transfer
  • Se dispara cuando termina la llamada
  • Uso: Métricas de duración, razón de finalización

QueueCallerAbandon

Event: QueueCallerAbandon
Queue: cola-ventas
Position: 2
HoldTime: 60
  • Se dispara cuando el llamante cuelga antes de ser atendido
  • Uso: Métrica crítica de abandono

Métricas que Asterisk Calcula Automáticamente

Sección titulada «Métricas que Asterisk Calcula Automáticamente»

Holdtime (Tiempo de Espera)

  • Tiempo promedio que los llamantes esperan antes de ser atendidos
  • Visible en: queue show cola-ventas
  • Meta típica: < 30 segundos

Talktime (Tiempo de Conversación)

  • Tiempo promedio de duración de llamadas
  • Uso: Calcular staffing necesario

Service Level (SL)

  • Porcentaje de llamadas atendidas dentro de un umbral
  • Configuración: servicelevel = 60 (60 segundos)
  • Cálculo: (llamadas atendidas en <60s / total atendidas) * 100
  • Meta típica: SL80/20 (80% atendidas en 20 segundos)

Abandonment Rate (Tasa de Abandono)

  • Porcentaje de llamantes que cuelgan antes de ser atendidos
  • Meta típica: < 5%
Terminal window
# Ver estado completo de una cola
asterisk -rx "queue show cola-ventas"
# Salida:
cola-ventas has 2 calls (max unlimited) in 'rrmemory' strategy (25s holdtime, 180s talktime), W:0, C:15, A:2, SL:86.7% within 60s
Members:
PJSIP/1001 (dynamic) (Not in use) has taken 5 calls (last was 120 secs ago)
PJSIP/1002 (dynamic) (In use) has taken 7 calls (last was 5 secs ago)
PJSIP/1003 (dynamic) (paused) (Not in use) has taken 3 calls (last was 300 secs ago)
Callers:
1. SIP/trunk-00000001 (wait: 0:15, prio: 0)
2. SIP/trunk-00000002 (wait: 0:08, prio: 0)

Interpretación:

  • holdtime: 25s - Promedio de espera
  • talktime: 180s - Promedio de duración
  • C:15 - 15 llamadas completadas
  • A:2 - 2 llamadas abandonadas
  • SL:86.7% - 86.7% atendidas en < 60s

[cola-produccion]
timeout = 20 ; Tiempo que suena el agente
retry = 5 ; Pausa antes de siguiente agente
timeoutpriority = conf ; Priorizar timeout de config sobre dialplan

¿Por qué timeoutpriority=conf?

  • Asegura que cada agente reciba el tiempo completo (20s)
  • Evita que se corte el ring prematuramente
wrapuptime = 15
  • Crítico: Sin esto, agentes reciben llamadas inmediatamente
  • Les da tiempo para notas, actualizar CRM, respirar
  • Recomendado: 10-30s según complejidad de atención
autopause = yes
autopausedelay = 60
  • Pausa agentes que no contestan
  • Evita “agentes fantasma” que saturan la cola
  • autopausedelay: Espera 60s antes de pausar (por si están en baño)
ringinuse = no
  • Nunca llames a agentes que ya están en llamada
  • Evita confusión y llamadas perdidas
  • Solo usa yes si tienes call waiting configurado
[general]
persistentmembers = yes
  • Guarda miembros dinámicos en AstDB
  • Sobreviven a reinicios de Asterisk
  • Esencial para producción
maxlen = 50
  • Limita llamadas en espera
  • Evita saturación y tiempos de espera infinitos
  • Cálculo: maxlen = (agentes * 3) + buffer
announce-frequency = 30
announce-holdtime = yes
announce-position = yes
periodic-announce = custom/espere-por-favor
periodic-announce-frequency = 60
  • Mantiene al llamante informado
  • Reduce abandonos
  • Mejora experiencia del cliente

Verificar:

Terminal window
# 1. ¿Está el agente logueado?
asterisk -rx "queue show cola-ventas"
# 2. ¿Está pausado?
# Buscar "(paused)" en la salida
# 3. ¿Está el dispositivo registrado?
asterisk -rx "pjsip show endpoints"
# 4. ¿Hay hints configurados?
asterisk -rx "core show hints"

Solución común:

Terminal window
# Despausar agente
asterisk -rx "queue unpause member PJSIP/1001 queue cola-ventas"

Verificar dialplan:

Terminal window
asterisk -rx "dialplan show ruta-entrante"

Verificar que la cola existe:

Terminal window
asterisk -rx "queue show cola-ventas"

Verificar MOH:

Terminal window
asterisk -rx "moh show classes"

En queues.conf:

musicclass = default ; Debe coincidir con moh.conf

  • Cola: Mecanismo para distribuir llamadas entre agentes
  • Estrategia: Algoritmo de distribución (rrmemory recomendado)
  • Miembros: Agentes estáticos o dinámicos
  • Estados: Idle, InUse, Paused, Unavailable
  • Eventos AMI: QueueMemberStatus, AgentCalled, AgentComplete, etc.
  • Métricas: Holdtime, Talktime, SL, Abandonment Rate
[general]
persistentmembers = yes
autofill = yes
[cola-basica]
strategy = rrmemory
timeout = 20
retry = 5
wrapuptime = 10
autopause = yes
ringinuse = no
musicclass = default

En el Taller 10 construiremos una central completa con:

  • IVR multinivel
  • Horarios de atención
  • Dos colas (ventas y soporte)
  • Miembros dinámicos
  • Grabación de llamadas
  • Integración con CDR/CEL

🛠️ Taller 10 - Central Telefónica Completa

¿Listos para construir una central profesional? En el próximo taller, implementaremos un sistema completo con IVR, horarios, colas y grabación. Verás las colas en acción con casos de uso reales.

👉 Ir al Taller 10: Central con IVR y Colas