·22 мин·2 просмотров

Полное руководство по оптимизации колл-центра на Asterisk

От системного тюнинга до настройки очередей, управления операторами, маршрутизации звонков и мониторинга. Всё, что нужно, чтобы выжать максимум производительности из колл-центра на Asterisk.

A
Astervis
Команда инженеров и продактов

Работа колл-центра на Asterisk похожа на настройку гоночного автомобиля. Двигатель (Asterisk) невероятно мощный, но без грамотной оптимизации вы теряете и производительность, и деньги.

Большинство руководств по колл-центрам на Asterisk описывают либо базовую установку, либо узкий технический тюнинг. Это руководство другое. Мы разберём всё: от тюнинга производительности Asterisk на системном уровне до конфигурации очередей, управления операторами, оптимизации маршрутизации звонков, стратегий мониторинга и операционных практик, которые напрямую влияют на прибыль.

Неважно, работает у вас 10 операторов или 200 — это руководство поможет выжать из колл-центра на Asterisk максимум производительности.

Зачем оптимизировать колл-центр на Asterisk

Прежде чем переходить к «как», оцифруем «зачем»:

Направление оптимизацииТипичный эффектВлияние на выручку
Сокращение времени ожидания в очередиСнижение на 30–50%На 15–25% меньше сорванных звонков
Рост утилизации операторовУвеличение на 15–20%Тот же объём меньшим числом операторов
Рост решения с первого звонкаУлучшение на 10–15%На 20–30% меньше повторных обращений
Тюнинг производительности системыЁмкость по одновременным звонкам в 2–3 раза вышеОтложенный апгрейд железа
Оптимизация маршрутизацииРешение вопроса на 20–30% быстрееВыше CSAT, ниже отток

Для колл-центра на 50 операторов, который обрабатывает 500 звонков в день, даже 10% прироста эффективности означает $50 000–$150 000 экономии в год.

Часть 1. Тюнинг производительности Asterisk на системном уровне

1.1 Оптимизация железа и ОС

Прежде чем трогать конфигурацию Asterisk, убедитесь, что фундамент надёжен:

Что учитывать по CPU:

  • Обработка звонков в Asterisk в основном однопоточная, но для PJSIP и Stasis используется несколько потоков
  • Кодеки G.711 (ulaw/alaw) почти не нагружают CPU; транскодинг G.729 — ресурсоёмкая операция
  • Ориентир: одно современное ядро CPU тянет около 200 одновременных звонков в G.711
  • Если в колл-центре включена запись разговоров, добавьте 30% запаса по CPU

Память:

  • Базовый Asterisk: ~50–100 МБ
  • На каждый одновременный звонок: ~2–4 МБ (с записью: ~8–10 МБ)
  • Обработка CDR/CEL: буфер ~50–100 МБ
  • Рекомендация: минимум 4 ГБ на 50 операторов, 8 ГБ на 100+

Хранилище:

  • Записи разговоров: закладывайте 1 ГБ на час записи (G.711)
  • База CDR: ~1 КБ на запись о звонке
  • Под базу CDR и активные записи используйте SSD
  • Старые записи переносите на HDD или в облако

Тюнинг ядра Linux:

# /etc/sysctl.conf - базовый тюнинг для колл-центров на Asterisk # Увеличиваем лимиты файловых дескрипторов fs.file-max = 655350 # Оптимизация сетевых буферов net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.rmem_default = 65536 net.core.wmem_default = 65536 # Увеличиваем conntrack для SIP net.netfilter.nf_conntrack_max = 131072 # Сокращаем количество сокетов в TIME_WAIT net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 # Снижаем склонность к свопу (держим Asterisk в RAM) vm.swappiness = 10
# /etc/security/limits.conf asterisk soft nofile 65536 asterisk hard nofile 65536 asterisk soft nproc 8192 asterisk hard nproc 8192

1.2 Оптимизация пула потоков PJSIP

Пул потоков PJSIP напрямую определяет, насколько быстро Asterisk обрабатывает SIP-транзакции:

; pjsip.conf - секция [system] [system] type=system ; Для колл-центра от 50 операторов threadpool_initial_size=20 threadpool_auto_increment=5 threadpool_idle_timeout=120 threadpool_max_size=100 ; Уменьшаем SIP-таймер для более быстрого обнаружения сбоев timer_t1=100 timer_b=6400

Подбор размера по масштабу колл-центра:

ОператоровInitial SizeMax SizeAuto Increment
10–2510505
25–50201005
50–1003015010
100–2005020010
200+8030015

1.3 Тюнинг шины сообщений Stasis

Шина Stasis обслуживает события AMI, обработку CDR и ARI — всё это критично для мониторинга колл-центра:

; stasis.conf [threadpool] initial_size = 10 idle_timeout_sec = 120 max_size = 60

Совет: если AMI вам не нужен (например, вы используете отдельный аналитический инструмент), отключение res_manager снижает нагрузку на CPU на 5–10% на загруженных системах.

1.4 Порядок идентификации endpoint'ов

Небольшая, но заметная оптимизация — сначала обрабатывать зарегистрированные телефоны:

; pjsip.conf - секция [global] [global] type=global ; Телефоны регистрируются (username), транки работают по IP endpoint_identifier_order=username,ip,anonymous

Так Asterisk не перебирает правила на основе IP для каждого зарегистрированного телефона, экономя миллисекунды на транзакции — а на масштабе это складывается в заметную величину.

Часть 2. Оптимизация конфигурации очередей

Именно в настройке очередей у большинства колл-центров скрыт самый большой потенциал оптимизации. Неправильно настроенная очередь съедает 20–30% рабочего времени операторов.

2.1 Выбор стратегии очереди

Правильно выбранная стратегия обзвона резко меняет и утилизацию операторов, и время ожидания абонентов:

; queues.conf [sales] strategy = rrmemory ; Круговой обзвон с памятью timeout = 15 ; Звоним оператору 15 секунд retry = 1 ; Повтор сразу после таймаута wrapuptime = 10 ; 10 секунд постобработки между звонками maxlen = 50 ; Максимум 50 абонентов в очереди [support] strategy = fewestcalls ; Отдаём оператору с наименьшим числом звонков timeout = 20 ; Для поддержки звоним чуть дольше retry = 1 wrapuptime = 30 ; Больше времени на постобработку сложных звонков maxlen = 30

Сравнение стратегий для колл-центров:

СтратегияДля чего подходитПлюсыМинусы
ringallНебольшие команды (<5)Самый быстрый ответНеравномерная нагрузка
rrmemoryУниверсальные очередиРавномерное распределениеНе учитывает навыки
fewestcallsОчереди поддержкиСбалансированная нагрузкаНовичков заваливает звонками
leastrecentПродажи с большим объёмомГарантирует паузу между звонкамиСильные операторы могут простаивать
randomОчереди переливаНевозможно «подкрутить» под себяНепредсказуемая нагрузка
wrandomМаршрутизация по навыкамУправление через весаСложно настраивать

2.2 Оптимизация таймаутов и повторов

Взаимодействие параметров timeout, retry и wrapuptime критично:

Полный цикл = timeout + retry + wrapuptime

Для очереди с timeout=15, retry=1, wrapuptime=10:

  • Одна попытка дозвона до оператора занимает максимум 26 секунд
  • Абонент, которого пробуют соединить с 3 свободными операторами, ждёт в худшем случае ~78 секунд

Целевые значения по типам очередей:

Тип очередиTimeoutRetryWrapupОбоснование
Продажи (входящие)12 с1 с5 сРешает скорость
Техподдержка20 с1 с30 сОператору нужно время на документацию
Биллинг15 с1 с15 сСредняя сложность
VIP/приоритет10 с0 с5 сОтветить как можно быстрее
Перелив25 с1 с0 сМаксимизируем шанс ответа

2.3 Вес и приоритет очереди

В средах с несколькими очередями веса гарантируют, что приоритетные очереди обслуживаются первыми:

; queues.conf [vip-support] weight = 10 ; Наивысший приоритет strategy = ringall [standard-support] weight = 5 strategy = rrmemory [overflow-support] weight = 1 ; Самый низкий приоритет strategy = leastrecent

Если оператор состоит в нескольких очередях, звонки первыми приходят из очередей с бо́льшим весом. Это обязательное условие для управления SLA.

2.4 Динамическое членство в очередях

Статическое членство в очереди тратит ёмкость впустую. Динамическое даёт возможность оптимизировать состав в реальном времени:

; queues.conf [support] member => PJSIP/agent101,0,Agent 101,SIP/agent101 ; Статический (резерв) ; Динамические участники добавляются через: ; CLI: queue add member PJSIP/agent102 to support ; AMI: действие QueueAdd ; Диалплан: AddQueueMember()

Диалплан для входа и выхода оператора:

; extensions.conf [agent-controls] ; *51 = Вход в очередь exten => *51,1,Answer() same => n,AddQueueMember(support,PJSIP/${CALLERID(num)}) same => n,Playback(agent-loginok) same => n,Hangup() ; *52 = Выход из очереди exten => *52,1,Answer() same => n,RemoveQueueMember(support,PJSIP/${CALLERID(num)}) same => n,Playback(agent-loggedoff) same => n,Hangup() ; *53 = Пауза (перерыв) exten => *53,1,Answer() same => n,PauseQueueMember(support,PJSIP/${CALLERID(num)},,Break) same => n,Playback(beep) same => n,Hangup() ; *54 = Снять паузу (вернулся с перерыва) exten => *54,1,Answer() same => n,UnpauseQueueMember(support,PJSIP/${CALLERID(num)}) same => n,Playback(beep) same => n,Hangup()

2.5 Оптимизация объявлений в очереди

Плохо настроенные объявления крадут время операторов и раздражают абонентов:

[support] ; Объявления о позиции и времени ожидания announce-frequency = 60 ; Каждые 60 секунд announce-holdtime = once ; Сообщить расчётное время ожидания один раз announce-position = yes ; «Вы номер X в очереди» min-announce-frequency = 30 ; Не чаще одного объявления в 30 секунд ; Периодические объявления periodic-announce = custom/thank-you-for-waiting periodic-announce-frequency = 45 ; Музыка на удержании musicclass = support-moh ; Отдельный MOH для этой очереди ; Объявления оператору при подключении announce-to-first-user = yes

Антипаттерн, которого стоит избегать: announce-frequency=15 при длительности объявления 10 секунд. Получается цикл, где абонент слышит объявления практически без пауз — это увеличивает долю сорванных звонков на 20–40%.

Часть 3. Оптимизация маршрутизации звонков

3.1 Оптимизация IVR: меньше уровней — больше решённых обращений

Каждый уровень IVR стоит вам части звонивших. Отраслевые данные показывают:

Глубина IVRДоля дошедших до конца
1 уровень95%
2 уровня80%
3 уровня60%
4+ уровня<40%

Оптимизированная структура IVR:

; extensions.conf [ivr-main] exten => s,1,Answer() same => n,Set(TIMEOUT(response)=5) same => n,Background(custom/welcome-short) ; Не длиннее 8 секунд same => n,WaitExten(3) ; Сразу в отдел - ОДИН уровень вложенности exten => 1,1,Goto(queue-sales,s,1) ; Продажи exten => 2,1,Goto(queue-support,s,1) ; Поддержка exten => 3,1,Goto(queue-billing,s,1) ; Биллинг exten => 0,1,Goto(queue-reception,s,1) ; Оператор ; Таймаут/неверный ввод → в общую очередь (без зацикливания!) exten => t,1,Goto(queue-support,s,1) exten => i,1,Goto(queue-support,s,1)

Ключевые правила оптимизации IVR:

  1. Максимум 2 уровня IVR
  2. Приветствие короче 8 секунд
  3. Всегда оставляйте вариант «нажмите 0, чтобы связаться с оператором»
  4. По таймауту — в очередь, а не на повтор меню
  5. Отслеживайте долю прохождения IVR: если она ниже 80%, упрощайте

3.2 Маршрутизация по навыкам

Направляйте звонки операторам с нужными компетенциями — так меньше переводов и короче время обработки:

; queues.conf [support-english] strategy = wrandom ; Маршрутизация по навыкам через penalty: ; penalty 0 = основной навык, penalty 5 = вторичный, penalty 10 = резерв member => PJSIP/agent101,0 ; Носитель английского member => PJSIP/agent102,0 ; Носитель английского member => PJSIP/agent103,5 ; Средний уровень английского member => PJSIP/agent104,10 ; Базовый английский (крайний случай) [support-spanish] strategy = wrandom member => PJSIP/agent103,0 ; Носитель испанского member => PJSIP/agent104,0 ; Носитель испанского member => PJSIP/agent101,10 ; Базовый испанский (резерв)

Диалплан с эскалацией по penalty (прогрессивная маршрутизация):

[queue-support] exten => s,1,Answer() same => n,Set(QUEUE_MAX_PENALTY=0) ; Сначала пробуем основных операторов same => n,Queue(support,,,,30) ; Ждём 30 с основных same => n,Set(QUEUE_MAX_PENALTY=5) ; Эскалация на вторичных same => n,Queue(support,,,,30) ; Ждём ещё 30 с same => n,Set(QUEUE_MAX_PENALTY=10) ; Подключаем всех операторов same => n,Queue(support,,,,60) ; Последняя попытка same => n,VoiceMail(support@default,u) ; Откат на голосовую почту same => n,Hangup()

3.3 Маршрутизация по времени

Направляйте звонки с учётом рабочих часов, праздников и укомплектованности смен:

[inbound-handler] exten => s,1,Answer() same => n,GotoIfTime(09:00-18:00,mon-fri,,?business-hours,s,1) same => n,GotoIfTime(09:00-13:00,sat,,?saturday-hours,s,1) same => n,Goto(after-hours,s,1) [business-hours] exten => s,1,Goto(ivr-main,s,1) [saturday-hours] exten => s,1,Set(QUEUE_MAX_PENALTY=0) ; По субботам только основные операторы same => n,Queue(support,,,,60) same => n,VoiceMail(support@default,u) same => n,Hangup() [after-hours] exten => s,1,Playback(custom/after-hours-message) same => n,VoiceMail(support@default,u) same => n,Hangup()

3.4 Приоритетная маршрутизация по Caller ID

Распознавайте повторно звонящих и VIP-клиентов:

[inbound-handler] exten => s,1,Answer() ; Проверяем, VIP ли это клиент (по базе или файлу) same => n,Set(VIP=${DB(vip/${CALLERID(num)})}) same => n,GotoIf($["${VIP}" = "yes"]?vip-queue,s,1) ; Проверяем, звонил ли абонент за последние 24 часа same => n,Set(RECENT=${DB(recent/${CALLERID(num)})}) same => n,GotoIf($["${RECENT}" != ""]?priority-queue,s,1) ; Обычная маршрутизация same => n,Goto(ivr-main,s,1) [vip-queue] exten => s,1,Queue(vip-support,,,,120) ; VIP-очередь с увеличенным таймаутом same => n,Hangup()

Часть 4. Оптимизация работы операторов

4.1 Управление статусами операторов

Корректный учёт статусов не даёт появляться «мёртвым душам» — операторам, которые залогинены, но на самом деле недоступны:

; Настройка мониторинга состояния устройства в pjsip.conf [agent101] type=endpoint device_state_busy_at=1 ; Помечать занятым после 1 активного звонка

Ключевые статусы операторов, которые нужно отслеживать:

СтатусОписаниеЧто оптимизировать
ДоступенГотов принимать звонкиСледить за равномерным распределением
На линииИдёт разговорКонтролировать время разговора
ПостобработкаРабота после звонкаОграничивать по времени
Пауза (перерыв)Плановый перерывКонтролировать соблюдение графика
Пауза (обучение)На обученииСтавить на часы низкой нагрузки
НедоступенНе отвечаетАвтовыход после 3 пропущенных звонков

4.2 Автовыход неотвечающих операторов

Оператор, который не берёт трубку, крадёт время у каждого абонента в очереди:

; queues.conf [support] autopause = yes ; Автопауза после пропущенного звонка autopausedelay = 0 ; Немедленно autopausebusy = no ; Не ставить на паузу при «занято» (может говорить по другой очереди) autopauseunavail = yes ; Ставить на паузу при недоступности

Продвинутый вариант: автовыход после N пропущенных звонков (диалплан + AGI):

; Считаем пропущенные звонки по каждому оператору [queue-support] exten => s,1,Queue(support,,,,30) same => n,ExecIf($["${QUEUESTATUS}" = "TIMEOUT"]?Set(DB(missed/${MEMBERINTERFACE})=$[${DB(missed/${MEMBERINTERFACE})} + 1])) same => n,ExecIf($[${DB(missed/${MEMBERINTERFACE})} >= 3]?PauseQueueMember(support,${MEMBERINTERFACE},,AutoPaused-3-missed))

4.3 Оптимизация времени постобработки

Время постобработки — убийца ёмкости №1, которого обычно не замечают. Слишком много — теряете ёмкость. Слишком мало — страдает качество данных.

Ориентиры по типам звонков:

Тип звонкаРекомендуемая постобработкаПримечания
Простой вопрос5–10 сАвтоматическая простановка результата
Звонок по продаже10–15 сНужно обновить CRM
Техподдержка20–30 сСоздание тикета
Сложная эскалация45–60 сКритична подробная документация

Реализация с кодами результата:

[post-call] exten => s,1,Set(WRAPUP_START=${EPOCH}) same => n,Read(DISPOSITION,,1,,,5) ; 5 секунд на ввод кода результата same => n,Set(CDR(disposition)=${DISPOSITION}) same => n,Set(WRAPUP_TIME=$[${EPOCH} - ${WRAPUP_START}]) same => n,UserEvent(WrapupComplete,Agent: ${CALLERID(num)},Duration: ${WRAPUP_TIME},Disposition: ${DISPOSITION}) same => n,Hangup()

Часть 5. Оптимизация качества связи и записи разговоров

Устали угадывать, что происходит в очередях?

Astervis даёт 30+ реалтайм-графиков, KPI операторов и CRM-интеграцию для вашего Asterisk PBX. On-premise. Установка за 5 минут. От $119/мес flat без ограничения на операторов.

Попробовать бесплатно

5.1 Подбор кодеков для колл-центра

; pjsip.conf - шаблон endpoint для операторов колл-центра [agent-template](!) type=endpoint allow=!all,ulaw,alaw ; Только G.711 - минимум CPU, лучшее качество в LAN dtls_auto_generate_cert=yes

Гид по выбору кодека:

КодекПолосаCPUКачествоГде применять
G.711 ulaw87 кбит/сМинимумОтличноеОператоры в LAN, локальные транки
G.711 alaw87 кбит/сМинимумОтличноеСтандарт для ЕС
G.72287 кбит/сНизкийHD-звукПремиальные очереди
G.72931 кбит/сВысокийХорошееУдалённые операторы, WAN
OpusПеременнаяСреднийОтличноеWebRTC-операторы

Для колл-центров: внутри LAN (операторы) используйте G.711, а с транками договаривайтесь по их предпочтениям. По возможности избегайте транскодинга — он добавляет задержку и нагрузку на CPU.

5.2 Практики записи разговоров

; Записываем все звонки в очереди поддержки [queue-support] exten => s,1,Set(MONITOR_FILENAME=/var/spool/asterisk/monitor/${STRFTIME(${EPOCH},,%Y/%m/%d)}/${UNIQUEID}) same => n,MixMonitor(${MONITOR_FILENAME}.wav,b) same => n,Queue(support) same => n,StopMixMonitor()

Как оптимизировать запись:

  1. Пишите в WAV (низкая нагрузка на CPU), а ночью по cron конвертируйте в MP3
  2. Раскладывайте по датам (/YYYY/MM/DD/) — так проще архивировать
  3. Настройте права доступа к записям, чтобы оператор не мог слушать чужие разговоры
  4. Введите политику хранения: 90 дней в оперативном доступе, год в архиве, затем удаление
  5. Следите за местом на диске — оповещение при заполнении на 80%
# Ночная задача cron для конвертации # /etc/cron.d/asterisk-recording-convert 0 2 * * * asterisk find /var/spool/asterisk/monitor/$(date -d yesterday +\%Y/\%m/\%d) -name "*.wav" -exec sox {} {}.mp3 \; -delete

5.3 Настройка jitter buffer

Для удалённых операторов и SIP-транков с нестабильной задержкой:

; pjsip.conf [remote-agent-template](!) type=endpoint allow=!all,g729,ulaw ; Фиксированный jitter buffer для стабильного качества связи jbimpl=fixed jbmaxsize=200 ; Буфер максимум 200 мс jbtargetextra=40 ; Дополнительная буферизация jblog=no ; В продакшене логирование отключаем

Часть 6. Мониторинг и аналитика — множитель для всей оптимизации

Без данных все описанные выше оптимизации остаются догадками. Мониторинг превращает догадки в науку.

6.1 Обязательные метрики колл-центра

Эти показатели нужно отслеживать и в реальном времени, и в исторической динамике:

Метрики для дашборда в реальном времени:

МетрикаЦельПорог оповещенияДействие
Звонков в очереди<10>15Подключить операторов из перелива
Максимальное ожидание<60 с>120 сНемедленная эскалация
Свободных операторов>20% от общего числа<10%Отменить перерывы
Service Level>80% за 20 с<60%Экстренно выводить людей на линию
Доля сорванных звонков<5%>8%Включить обратные звонки

Метрики для исторического анализа:

МетрикаЗачем нужнаКак часто смотреть
Среднее время обработки (AHT)Эффективность оператораЕжедневно
Решение с первого звонка (FCR)Индикатор качестваЕженедельно
Утилизация операторовПланирование ёмкостиЕженедельно
Стоимость звонкаФинансовое здоровьеЕжемесячно
Удовлетворённость клиентов (CSAT)Качество клиентского опытаЕжемесячно

6.2 Мониторинг в реальном времени через AMI

Asterisk Manager Interface (AMI) отдаёт поток событий в реальном времени:

; manager.conf [monitoring] secret = strong_password_here permit = 127.0.0.1/255.255.255.255 read = call,agent,reporting write = command eventfilter = Event: QueueMember* eventfilter = Event: QueueCaller* eventfilter = Event: AgentConnect eventfilter = Event: AgentComplete

Ключевые события AMI для мониторинга колл-центра:

СобытиеКакие данные даётДля чего использовать
QueueCallerJoinОчередь, позиция, caller IDГлубина очереди в реальном времени
QueueCallerLeaveПричина (ответили, сорвался, таймаут)Учёт сорванных звонков
AgentConnectВремя ожидания, операторРасчёт service level
AgentCompleteВремя разговора, время удержанияАнализ AHT
QueueMemberPauseПричина, длительностьСоблюдение графика перерывов
QueueMemberStatusСостояние устройстваДоступность оператора

6.3 Анализ CDR и CEL

CDR (Call Detail Records) и CEL (Channel Event Logging) — сырьё для всей исторической отчётности:

; cdr.conf [general] enable=yes unanswered=yes ; Учитываем и неотвеченные звонки congestion=yes ; Учитываем события перегрузки endbeforehexten=no ; Завершать CDR до расширения h ; cdr_adaptive_odbc.conf (для хранения в базе) [asterisk-cdr] connection=asterisk table=cdr alias start => calldate alias clid => clid alias src => src alias dst => dst alias dcontext => dcontext alias channel => channel alias dstchannel => dstchannel alias lastapp => lastapp alias lastdata => lastdata alias duration => duration alias billsec => billsec alias disposition => disposition alias uniqueid => uniqueid

Примеры запросов для анализа CDR:

-- Почасовой профиль нагрузки (для планирования смен) SELECT EXTRACT(HOUR FROM calldate) AS hour, COUNT(*) AS total_calls, COUNT(CASE WHEN disposition = 'ANSWERED' THEN 1 END) AS answered, COUNT(CASE WHEN disposition = 'NO ANSWER' THEN 1 END) AS abandoned, ROUND(AVG(CASE WHEN disposition = 'ANSWERED' THEN billsec END), 1) AS avg_talk_time, ROUND(AVG(duration - billsec), 1) AS avg_wait_time FROM cdr WHERE calldate >= CURRENT_DATE - INTERVAL '7 days' AND dcontext LIKE 'queue-%' GROUP BY EXTRACT(HOUR FROM calldate) ORDER BY hour; -- Рейтинг операторов по результативности SELECT dstchannel AS agent, COUNT(*) AS calls_handled, ROUND(AVG(billsec), 1) AS avg_talk_time, ROUND(AVG(duration - billsec), 1) AS avg_wait_before_answer, MAX(billsec) AS longest_call, SUM(billsec) / 3600.0 AS total_hours FROM cdr WHERE disposition = 'ANSWERED' AND dcontext LIKE 'queue-%' AND calldate >= CURRENT_DATE - INTERVAL '7 days' GROUP BY dstchannel ORDER BY calls_handled DESC; -- Расчёт service level (% отвеченных за 20 секунд) SELECT DATE(calldate) AS day, COUNT(*) AS total_calls, COUNT(CASE WHEN disposition = 'ANSWERED' AND (duration - billsec) <= 20 THEN 1 END) AS within_sla, ROUND( 100.0 * COUNT(CASE WHEN disposition = 'ANSWERED' AND (duration - billsec) <= 20 THEN 1 END) / NULLIF(COUNT(*), 0), 1 ) AS service_level_pct FROM cdr WHERE calldate >= CURRENT_DATE - INTERVAL '30 days' AND dcontext LIKE 'queue-%' GROUP BY DATE(calldate) ORDER BY day;

6.4 Почему готовая аналитика выигрывает у самописной

Строить дашборды на сырых CDR можно, но на настройку и поддержку уйдёт 40–80 часов. Вам придётся:

  1. Писать и поддерживать SQL-запросы (обновляя их при смене версий Asterisk)
  2. Собирать дашборды для визуализации (Grafana, самописные веб-приложения)
  3. Настраивать правила оповещений
  4. Заниматься хранением и архивацией данных
  5. Делать отчёты по работе операторов
  6. Создавать вол-борды реального времени

Поэтому команды переходят на специализированные инструменты аналитики для Asterisk — например, Astervis. Одна команда установки, и вы получаете:

  • 30+ готовых графиков: тепловые карты, рейтинги операторов, аналитика по транкам
  • Дашборды в реальном времени: глубина очереди, время ожидания, статусы операторов — вживую
  • Управление операторами: KPI, оценка результативности, графики работы
  • Интеграция с CRM: Bitrix24, AmoCRM — звонки привязаны к сделкам
  • Прослушивание записей: поиск и фильтры прямо в дашборде
  • Установка за 15 минут: curl -sSL https://api.astervis.io/api/releases/install.sh | bash

Никаких SQL-запросов. Никакой поддержки дашбордов Grafana. Никакого самописного кода.

Часть 7. Операционные практики

7.1 Как планировать ёмкость

Используйте исторические данные, чтобы прогнозировать потребность в персонале:

Входные данные для формулы Erlang C:

  • Среднее число звонков в час (из CDR)
  • Среднее время обработки (разговор + постобработка)
  • Целевой service level (например, 80% за 20 секунд)

Быстрая таблица по численности (SLA 80/20):

Звонков/часAHT (мин)Нужно операторовЗанятость
504567%
1004974%
20041778%
30042580%
50044083%

Внимание: занятость операторов выше 85% ведёт к выгоранию. Планируйте максимум 75–80% устойчивой занятости.

7.2 Стратегия перелива очередей

Не заставляйте абонентов ждать бесконечно. Внедрите прогрессивный перелив:

0-30 с: Основная очередь (операторы с нужными навыками) 30-60 с: Вторичная очередь (тот же отдел, ниже уровень навыка) 60-90 с: Очередь перелива (любой свободный оператор) 90-120 с: Предложение обратного звонка 120 с+: Голосовая почта с обещанием перезвонить
; extensions.conf - прогрессивный перелив [queue-support-overflow] exten => s,1,Set(QUEUE_MAX_PENALTY=0) same => n,Queue(support,,,,30) ; 30 с: основные операторы same => n,Set(QUEUE_MAX_PENALTY=5) same => n,Queue(support,,,,30) ; 60 с: вторичные операторы same => n,Set(QUEUE_MAX_PENALTY=10) same => n,Queue(support,,,,30) ; 90 с: все операторы same => n,Goto(callback-offer,s,1) ; Предлагаем обратный звонок

7.3 Управление SLA

Определите и контролируйте SLA по каждой очереди:

ОчередьЦелевой SLAКак измеряем
VIP-поддержка95% за 10 сПромахи недопустимы
Продажи80% за 20 сПрямое влияние на выручку
Общая поддержка80% за 30 сОтраслевой стандарт
Биллинг70% за 45 сНиже срочность
Email/обратный звонокОтвет в течение 24 часовДругой тип SLA

7.4 Цикл непрерывных улучшений

Оптимизация — не разовый проект. Запустите еженедельный цикл разбора:

Еженедельный разбор оптимизации (30 минут):

  1. Service Level (5 мин): выполнили ли целевые SLA? Какие очереди провалились?
  2. Работа операторов (10 мин): лучшие и худшие. Кому нужен коучинг?
  3. Анализ профиля звонков (5 мин): были ли новые всплески объёма? Есть ли сезонность?
  4. Конфигурация очередей (5 мин): актуальны ли текущие timeout и wrapup?
  5. Здоровье системы (5 мин): динамика CPU, памяти, диска. Есть ли риски по ёмкости?

Часть 8. Типичные ошибки оптимизации

Ошибка 1: чрезмерная погоня за AHT

Когда операторов давят сокращением времени обработки, обычно растёт число повторных звонков. Смотрите вместо этого на решение с первого звонка.

Ошибка 2: слишком много объявлений в очереди

Объявления о позиции каждые 15 секунд бесят абонентов. Ставьте announce-frequency минимум на 45–60 секунд.

Ошибка 3: нет стратегии перелива

Абонент, который ждёт больше 2 минут без альтернатив, бросит трубку — и уже не перезвонит. Всегда держите запасной вариант: обратный звонок или голосовую почту.

Ошибка 4: жёсткая привязка операторов

Держать операторов в фиксированных очередях — значит терять ёмкость при колебаниях нагрузки. Используйте динамическое членство в очередях вместе с маршрутизацией по навыкам.

Ошибка 5: игнорирование звонков в нерабочее время

Многие компании теряют 15–20% потенциальной выручки, просто не обрабатывая звонки вне рабочего времени. Внедрите voicemail-to-email, запись на обратный звонок или маршрутизацию на удалённых операторов в других часовых поясах.

Ошибка 6: отсутствие мониторинга

Работать вслепую — самая большая ошибка. Нельзя оптимизировать то, что не измеряешь. Как минимум ежедневно отслеживайте service level, долю сорванных звонков и утилизацию операторов.

Чек-лист оптимизации

Используйте этот чек-лист, чтобы провести аудит колл-центра на Asterisk:

Системный уровень:

  • Ядро Linux настроено (файловые дескрипторы, сетевые буферы, swap)
  • Пул потоков PJSIP рассчитан на ваше число операторов
  • Пул потоков Stasis настроен
  • Порядок идентификации endpoint'ов оптимизирован
  • Ненужные модули отключены

Конфигурация очередей:

  • Стратегия обзвона соответствует назначению очереди
  • Timeout/retry/wrapup подобраны под каждую очередь
  • Веса очередей настроены под приоритеты
  • Включено динамическое членство
  • Объявления звучат не слишком часто

Маршрутизация звонков:

  • В IVR максимум 2 уровня
  • Внедрена маршрутизация по навыкам
  • Настроена маршрутизация по времени
  • Есть стратегия перелива
  • Доступен вариант обратного звонка

Управление операторами:

  • Включена автопауза при пропущенных звонках
  • Время постобработки адекватно каждой очереди
  • Статусы операторов корректно отслеживаются
  • Метрики результативности видны супервайзерам

Мониторинг:

  • Работает дашборд реального времени
  • Настроена историческая отчётность
  • Заданы правила оповещений о нарушениях SLA
  • Запланирован еженедельный разбор оптимизации
  • Работают запись разговоров и контроль качества

Главное

  1. Начинайте с измерений. Поставьте мониторинг до изменений, чтобы улучшения можно было оцифровать.
  2. Системный тюнинг имеет значение. Пул потоков PJSIP и настройки ядра способны увеличить ёмкость по одновременным звонкам в 2–3 раза.
  3. Конфигурация очередей даёт максимальный ROI. Стратегия, таймауты и веса напрямую влияют на опыт каждого абонента.
  4. Маршрутизация по навыкам сокращает переводы на 30–40%, повышая и эффективность, и удовлетворённость клиентов.
  5. Оптимальная утилизация операторов — 75–80%. Выше — выгорание, ниже — переплата по фонду оплаты труда.
  6. Прогрессивный перелив спасает от сорванных звонков. Никогда не оставляйте абонента ждать без альтернатив.
  7. Постепенные улучшения работают лучше разовой большой перестройки. Еженедельные 30-минутные разборы дают накопительный эффект.

Начните оптимизацию сегодня

Не нужно внедрять всё сразу. Начните с того, что даёт максимальный эффект:

  1. Поставьте мониторинг, чтобы зафиксировать точку отсчёта
  2. Оптимизируйте таймауты и стратегии очередей
  3. Внедрите маршрутизацию по навыкам
  4. Настройте перелив и обработку обратных звонков
  5. Запланируйте еженедельные разборы оптимизации

Чтобы мгновенно увидеть, что происходит в вашем колл-центре на Asterisk, попробуйте Astervis — 30+ графиков в реальном времени, контроль работы операторов и интеграция с CRM. Установка за 15 минут, без настройки.

Начните бесплатный 14-дневный период →

Хватит гадать. Начни видеть.

Реальная картина вашего Asterisk колл-центра: время ожидания, активность операторов, нагрузка на транки и 30+ графиков. On-premise на вашем сервере. Установка за 5 минут. Без карты.

От $119/мес flat. Без ограничения на операторов. Триал 14 дней.

Поделиться