Задача
Отдел продаж из 12 человек работал в двух несвязанных системах: звонки шли через Mango Office, сделки вели в Megaplan. После каждого звонка менеджер вручную открывал CRM, находил клиента и создавал задачу. На это уходило 3–5 минут на звонок — и часть звонков просто не фиксировалась.
Нужно было: при входящем/исходящем звонке автоматически создавать задачу в Megaplan, показывать карточку клиента прямо во время разговора и дать руководителю дашборд по эффективности.
Что сделал
Приём вебхуков от Mango Office
Mango Office присылает события на вебхук-эндпоинт: звонок начался, завершён, пропущен. Написал Laravel-контроллер, который принимает эти события, проверяет подпись и кладёт в очередь RabbitMQ.
Очередь нужна была по двум причинам: Mango ждёт ответ за 2 секунды, а обращение к Megaplan API может занять до 5 секунд. И если Megaplan временно недоступен — событие не теряется, а повторяется.
Обработчик событий
Worker подхватывает событие из очереди и:
- По номеру телефона ищет клиента в Megaplan
- Если клиент найден — создаёт задачу «Перезвонить» или «Входящий: уточнить» с привязкой к сделке
- Если клиент не найден — создаёт лид с пометкой «Новый номер»
- Логирует результат в MySQL: звонок, итог, менеджер, длительность
Карточка клиента во время разговора
Написал небольшой Vue-виджет, который менеджеры открывали в браузере. Он подключался к серверу через SSE (Server-Sent Events) и показывал карточку клиента в момент, когда звонок поступает. Данные — из Megaplan по номеру телефона, ответ кэшировался в Redis на 10 минут.
Дашборд для руководителя
Отдельная страница: количество звонков по менеджерам, среднее время разговора, процент пропущенных, динамика по дням. Данные из MySQL, запросы с агрегацией, фильтр по периоду.
Сложности
Mango Office присылает один и тот же вебхук несколько раз при нестабильном соединении. Добавил idempotency key по call_id — повторные события просто игнорировались.
Megaplan API v2 нередко возвращает 500 без тела ответа. Поставил retry с exponential backoff — 3 попытки с паузой 2, 4, 8 секунд.
Результат
За первый месяц зафиксировали на 40% больше звонков, чем раньше — просто потому что перестали их терять. Руководитель получил данные для разбора полётов. Менеджеры перестали переключаться между вкладками вручную.