Найти в Дзене
makeROI - amoCRM Интегратор

Кейс amoCRM - Система долгосрочного хранения звонков

Клиент занимается продажей квартир (первичка) в Москве и области. В офисе работает 5 сотрудников, которые используют amoCRM для управления продажами и клиентскими процессами. Когда мы начали работу с клиентом, у него уже была настроена amoCRM и телефония с возможностью хранения звонков. Однако телефония хранила звонки только 1 год, после чего удаляла их. Клиент использовал amoCRM для простой работы: вёл сделки и управлял клиентскими процессами. Клиент сталкивался с конфликтными ситуациями, когда нужно было обратиться к звонку 4-5 летней давности для решения конфликта. По требованиям клиента нужно было хранить звонки долго, чтобы иметь возможность возвращаться к диалогу с клиентом и просматривать его. Также клиенту была важна возможность видеть статистику по хранимым звонкам (сколько места занимают, сколько минут суммарно, количество файлов). Особенно важно было хранить все звонки по закрытым сделкам. Стандартные решения не подходили, потому что: Мы разработали систему долгосрочного хра
Оглавление

Клиент и контекст

Клиент занимается продажей квартир (первичка) в Москве и области. В офисе работает 5 сотрудников, которые используют amoCRM для управления продажами и клиентскими процессами.

Когда мы начали работу с клиентом, у него уже была настроена amoCRM и телефония с возможностью хранения звонков. Однако телефония хранила звонки только 1 год, после чего удаляла их. Клиент использовал amoCRM для простой работы: вёл сделки и управлял клиентскими процессами.

Проблема / задача

Клиент сталкивался с конфликтными ситуациями, когда нужно было обратиться к звонку 4-5 летней давности для решения конфликта. По требованиям клиента нужно было хранить звонки долго, чтобы иметь возможность возвращаться к диалогу с клиентом и просматривать его.

Также клиенту была важна возможность видеть статистику по хранимым звонкам (сколько места занимают, сколько минут суммарно, количество файлов). Особенно важно было хранить все звонки по закрытым сделкам.

Стандартные решения не подходили, потому что:

  • Телефонии не хранили звонки такое продолжительное время (4-5 лет)
  • Клиент хотел не зависеть от телефонии и хранить звонки на своих серверах

Решение

Мы разработали систему долгосрочного хранения звонков. Интеграция автоматически выгружает звонки в S3 (специальное хранилище для данных) и фиксирует информацию в базе данных: ID контакта, ссылка на файл в S3, краткая информация о звонке (входящий/исходящий).

Решение делает следующее:

  • Автоматически обрабатывает новые звонки каждые 5 минут
  • Скачивает записи звонков с сервера телефонии
  • Сохраняет их в S3 на сервере клиента
  • Заменяет ссылку в стандартном примечании amoCRM на новую ссылку в S3
  • Звонок проигрывается в amoCRM, но хранится на сервере клиента, а не на сервере телефонии
  • Переносит старые звонки, которые клиент скачивал вручную на Google Диск, в S3 и связывает их с контактами

Использовали MySQL, Laravel и Redis в качестве менеджера очередей (на наш взгляд он оптимален по нагрузке и потребляемым ресурсам для задач такого порядка с очередями Laravel).

Сроки выполнения: реализация заняла около недели. Началась обработка текущих звонков, а также запустили скрипт для подгрузки старых звонков. Миграция старых звонков из amoCRM заняла около 48 часов (делали экономные запросы, чтобы не забить API — у клиента были ещё интеграции), из Google Диска — около 10 часов.

Как это работает

Простыми словами: мы автоматизировали процесс сохранения звонков на сервере клиента вместо хранения на сервере телефонии. Каждый новый звонок автоматически скачивается, сохраняется в S3 и ссылка в amoCRM обновляется на новую.

По шагам:

  1. Обработка новых звонков:Телефония добавляет в контакт примечание о звонке, содержащее ссылку на запись (хранящуюся на сервере телефонии)
    Каждые 5 минут система проверяет появление новых таких примечаний
    Если примечание появилось, скачиваем запись звонка
    Сохраняем в S3
    Добавляем запись в базу данных (ID контакта, ссылка на файл в S3, тип звонка - входящий/исходящий)
    Обновляем ссылку в примечании: заменяем старую (на сервере телефонии) на новую - на нашем S3
  2. Перенос старых звонков:Старые звонки, выкачанные вручную на Google Диск, привязали к контактам
    Загрузили их в S3
    Обновили ссылки в amoCRM (нашли старые примечания с удалённым звонком и добавили туда новое)

Сложности и как мы их обошли

При работе со старыми звонками из Google Диска возникли проблемы по связыванию звонков с контактами:

  • Часть звонков удалось связать по названию: в мёртвой ссылке была строка-хэш, которая стала именем файла
  • Часть звонков хранилась в папках по контактам, но были ошибки в структуре

Как решили:

  • Написали скрипт, который прошёл через Google Диск и автоматически связал звонки, где это было возможно
  • Из около 3 тысяч звонков за последние несколько лет автоматически не удалось связать около 150 звонков
  • Звонки, которые не смогли связать автоматически, выгрузили в таблицу и попросили помощь в сопоставлении у клиента

Также была техническая проблема: при смене ссылки при стандартных настройках звонок переставал корректно воспроизводиться в amoCRM, были ошибки при ускоренном воспроизведении. Решили ее путём настройки передачи файлов и HTTP заголовков, связанных с хранимыми файлами, это решили. Настроили корректные заголовки для потоковой передачи аудио, что позволило amoCRM корректно воспроизводить звонки, включая ускоренное воспроизведение

Обработка ошибок:

  • Ошибок было крайне мало, но для надёжности реализовали систему повторных попыток: задачи пробуют обработаться повторно через 5, 10 и 45 минут
  • К проекту подключён мониторинг (Sentry), поэтому мы узнавали о критичных ошибках заранее

Больших объёмов данных не было, и очередь их решила.

Результаты

Было:

  • Телефония хранила звонки только 1 год, после чего удаляла их
  • Клиент сталкивался с конфликтными ситуациями, когда нужно было обратиться к звонку 4-5 летней давности
  • Не было возможности хранить звонки долго
  • Не было независимости от телефонии - звонки хранились на серверах телефонии
  • Часть звонков хранилась вручную на Google Диске, но это было неудобно
  • Не было аналитики по звонкам

Стало:

  • Разработка заняла около недели
  • Выгружено примерно 3,7 тысячи звонков при средней длительности звонка 7 минут
  • Создана система автоматической обработки новых звонков
  • Перенесены старые звонки с Google Диска в S3 (около 3 тысяч звонков за последние несколько лет)
  • Сделана система выгрузки звонков + панель админ-навигации с фильтрацией по клиенту, менеджеру, поиском и возможностью прослушивания (по сути это дублировало интерфейс amoCRM, но клиент попросил сделать отдельно)
  • Настроено хранилище S3 на 100 ГБ с возможностью докупить при необходимости

Что не удалось решить:

  • Часть старых звонков не была выгружена, обычно по закрытым клиентам
  • Телефония утеряла ссылки примерно на 0,2% новых звонков. Их выгрузили, пометив, что записи нет

В итоге клиент получил:

  • Независимость от телефонии - звонки хранятся на своих серверах в S3 (100 ГБ с возможностью расширения)
  • Долгосрочное хранение звонков без ограничений по времени
  • Возможность обращения к старым звонкам (4-5 летней давности) для решения конфликтных ситуаций. Например, когда клиент предъявляет претензии по условиям договора, который обсуждался несколько лет назад, можно найти и прослушать конкретный звонок, чтобы восстановить контекст разговора
  • Автоматическую обработку новых звонков каждые 5 минут
  • Админ-панель для навигации и фильтрации звонков (по клиенту, менеджеру, поиск)
  • Отчёты в панели: сколько места занимают звонки, сколько минут суммарно и сколько файлов
  • Перенос старых звонков с Google Диска в централизованное хранилище
  • Надёжную систему с автоматическими повторами при ошибках и мониторингом

Цитата / обратная связь клиента

Клиенту решение устроило, он был рад, что смогли сделать независимую панель просмотра звонков.

Вывод / чему научил кейс

Этот кейс показывает, что можно создать независимую систему хранения звонков, которая не зависит от ограничений телефонии и позволяет хранить данные неограниченное время на серверах клиента.

Польза для других клиентов:

  • Если клиенту нужно долгосрочное хранение звонков (больше, чем предоставляет телефония)
  • Если клиент хочет независимость от телефонии и хранение на своих серверах
  • Если нужно перенести старые звонки из различных источников (Google Диск, другие хранилища) в централизованную систему
  • Если нужна отдельная панель для работы со звонками с расширенной фильтрацией (по клиенту, менеджеру, поиск)
  • Если нужны отчёты по использованию хранилища (объём данных, количество файлов, суммарная длительность)

Что отработали как команда:

  • Углубились в работу со звонками, научились редактировать чужие примечания в amoCRM
  • Наработали экспертизу при работе с S3
  • Научились изменять ссылки на звонки в уже существующих примечаниях
  • Решили проблему с корректным воспроизведением звонков в amoCRM через настройку передачи файлов и HTTP заголовков для потоковой передачи аудио
  • Создали систему автоматической обработки и переноса больших объёмов звонков (3,7 тысячи звонков)
  • Разработали админ-панель для работы со звонками с фильтрацией и поиском
  • Настроили систему обработки ошибок с автоматическими повторами и мониторингом через Sentry
  • Оптимизировали миграцию данных с учётом ограничений API (экономные запросы, чтобы не забить API при наличии других интеграций)

Это усилило нашу экспертизу в работе с интеграциями amoCRM, обработке медиа-файлов и создании независимых систем хранения данных.