Как получить максимум от данных CRM-системы в облаке: пошаговая инструкция

Команда дата-аналитиков из Valiotti Analytics выстроила аналитику данных CRM-системы с кастомными дашбордами. Николай Валиотти рассказывает, как сделать эффективное решение за 4228 рубля в месяц.

Школа английского языка JustSchool обратилась в компанию Valiotti Analytics для построения аналитики данных, полученных из CRM-системы.

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

Сначала нужно определиться с инфраструктурой для построения аналитической системы. Опыт Valiotti Analytics показывает, что эту задачу удобнее решать с помощью облачных платформ, предоставляющих возможности бессерверных вычислений, и сервисов визуализации.

На создание собственной физической инфраструктуры нужно много времени: она требует настройки и обслуживания железа, ОС, БД, BI-инструментов и интеграций между компонентами. Работа с облачными виртуальными машинами позволяет частично решить проблемы обслуживания – провайдер берет на себя работу с железом и ОС. Но только при использовании Serverless-решений и управляемых сервисов можно сосредоточиться на реализации и не тратить время специалистов на инфраструктурные вопросы.

JustSchool используют AmoCRM – удобную систему с интуитивно понятным интерфейсом. Она позволяет фиксировать заявки из различных источников и отслеживать их, предлагает интеграцию не только с корпоративной электронной почтой, но и с провайдерами телефонии. В AmoCRM есть встроенная аналитика, но она не настраиваемая. Например, нельзя создавать собственные дашборды, а кроме того, отчеты долго грузятся. Компания хотела получать более глубокую аналитику по данным.

Мы предложили решение на основе serverless-архитектуры.

AmoCRM имеет богатую функциональность API, с помощью которой удалось организовать выгрузку информации о сделках и контрактах в нужном формате. Эти данные автоматически выгружаются в облако с помощью функций Cloud Functions. Они помещают промежуточные данные в очередь данных в Message Queue. Как только данные попадают в очередь, запускается соответствующая функция их обработки, которая записывает результат в базу в Managed Service for ClickHouse. На основе этих данных мы создали два датасета, которые используются для отображения финального дашборда в сервисе Yandex DataLens.

Созданная нами инфраструктура достаточно универсальна. Решение с использованием Cloud Functions и Yandex DataLens позволяет построить аналитику данных CRM-систем для компаний любого сектора бизнеса. При этом наша аналитика доступна для бизнеса любого масштаба. Так, в случае JustSchool она обходится всего в 4228 руб. в месяц. Использование Cloud Functions стоит 276 рублей, Managed Service for ClickHouse – 3946 рублей, Message Queue – всего 6 рублей, а сервис Yandex DataLens, о котором мы расскажем дальше, бесплатен.

Рассмотрим весь процесс построения аналитической системы, от создания и настройки инфраструктуры, до обработки и визуализации данных.

Для работы нам потребуется аккаунт в Yandex.Cloud.

Шаг 1: Проектирование кластера данных и создание сервисного аккаунта

Создадим в Yandex.Cloud кластер Managed Service for ClickHouse, в котором будем хранить и обрабатывать данные, полученные из AmoCRM.

Данные, полученные из AmoCRM, делятся на:

  • пользователей;
  • контакты и email;
  • заявки.

Создадим для этих данных отдельные таблицы в базе в сервисе.

Теперь создадим сервисный аккаунт AmoCRM. Он позволяет гибко управлять ресурсами Yandex.Cloud, назначая необходимые для работы сервиса роли.

Шаг 2: Создание пайплайна обработки данных

Мы будем получать данные в формате json, преобразовывать в DataFrame и сохранять их в базу. В целом пайплайн обработки данных системой выглядит так:

С каждой подгруппой данных будем работать отдельно. Для этого создадим в сервисе Yandex Cloud Functions 7 функций сбора и обработки данных. Cloud Functions позволяет размещать код в безопасном и масштабируемом окружении в облаке без создания и обслуживания виртуальных машин. Функции могут выполняться независимо друг от друга, с помощью внешних запросов или при срабатывании триггера.

Как видно из схемы для хранения промежуточных данных мы использовали еще одну бессерверную технологию – сервис очередей Message Queue. Создадим очереди для каждого отдельного потока данных.

Запускаться функции сбора и обработки данных в нашем случае будут автоматически, с помощью триггеров.

Шаг 3: Автоматическая выгрузка из AmoCRM

Рассмотрим получение информации на примере обработки заявок. В AmoCRM данные разбиты на страницы, каждая из которых содержит до 250 лидов, соответственно мы будем работать со страницами.

Для того чтобы инициировать выгрузку, создадим таймер, который каждый день в 23:15 будет запускать функцию firstpage.

Эта функция помещает в очередь amo_leads_pages цифру 1 – индекс первой страницы из исходной БД лидов, то есть той страницы, с которой нужно начать выгружать данные.

client = boto3.client( service_name='sqs', endpoint_url='https://message-queue.api.cloud.yandex.net', region_name='ru-central1' ) queue_pages_url='https://message-queue.api.cloud.yandex.net/путь_до_очереди' client.send_message( QueueUrl=queue_pages_url, MessageBody='1' )

Как только индекс первой страницы появился в очереди amo_leads_pages, срабатывает триггер amo-leads-pages. Он запускает функцию amoleadsqueue.

Она, в свою очередь, берет из amo_leads_pages индекс первой страницы и выгружает из AmoCRM данные порциями, по одной странице. Прочитав json с 250 лидами, функция помещает его в очередь amo_leds.

Так как в Cloud Functions есть ограничения по времени выполнения функции, то amo-leads-pages работает в течение приблизительно 9 минут, а затем записывает номер страницы, на которой остановилась, обратно в очередь amo_leads_pages и завершается. Код, реализующий эту функциональность, выглядит так:

while True: try: with requests.Session() as s: auth_url = "https://{}.amocrm.ru/private/api/auth.php".format(subdomain) get_url=f'https://{subdomain}.amocrm.ru/api/v4/contacts?with=catalog_elements,leads,customers&page={page}&limit=100' auth_data = {'USER_LOGIN': user_login, 'USER_HASH': user_hash} s.post(auth_url, data=auth_data) response = s.get(get_url) # Если данные закончились, заносим в очередь флаг END if response.status_code == 204: print(page, 'No Content code 204') client.send_message( QueueUrl=queue_pages_url, MessageBody='end' ) break contacts_list = json.loads(response.text)['_embedded']['contacts'] client.send_message( QueueUrl=queue_url, MessageBody=json.dumps(contacts_list) ) page += 1 # В Yandex.Cloud есть ограничение по времени выполнения функции, поэтому останавливаем сбор данных через 9 минут if time.time()-start_time > 500: break except Exception as e: return { 'statusCode': 100, 'body': e } # Кладем в очередь номер, страницы на которой остановились сlient.send_message( QueueUrl=queue_pages_url, MessageBody=str(page) )

Соответственно, когда новый номер страницы попадает в amo_leads_pages, срабатывает триггер, опять вызывается функция amoleadsqueue и работа продолжается до тех пор, пока не закончатся данные.

Шаг 4: Обработка данных и сохранение в ClickHouse

Попадание данных в очередь amo_leads заставляет сработать триггер amo-leads-to-db, вызывающий функцию amoleads.

Она обрабатывает данные и записывает их в соответствующую таблицу в базе ClickHouse.

Кстати, процесс выполнения функции всегда можно отслеживать с помощью мониторинга.

Шаг 5: Создание датасетов и дашборда в DataLens

Для того чтобы наглядно отображать данные по воронке продаж для детской школы мы соберем дашборд в DataLens. Нам понадобятся два датасета.

Первый датасет создаем на основе таблицы с лидами – justkids.amocrm_leads_static. Часть полей возьмем из источника, преобразовав поля для отображения дат в timestamps:

Также понадобятся и расчетные поля, например для отображения статуса заявки в виде понятном человеку:

Второй набор данных нужен для подсчета конверсии на каждом этапе. Его мы создадим, используя SQL-подзапрос.

Теперь, когда у нас есть все необходимые наборы данных, сделаем чарты и соберем дашборд. Создадим столбчатую диаграмму для отображения закрытых заявок. Для ее построения будем использовать дату закрытия заявки – поместим ее в секцию X, и расчетное количество закрытых заявок – поместим их в секцию Y. Отобразим заявки со статусами «закрыта успешно» и «закрыта неуспешно» из рассчитанного ранее поля, с помощью двух цветов.

На дашборде разместим продуктовые показатели, такие как количество заявок и выручка, показатели динамики заявок и данные по воронке продаж. Для этого сделаем чарты с динамикой открытых и закрытых заявок, конверсией по этапам, на которых они находятся, с количеством, выручкой и средним чеком.

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

Результаты

Мы создали удобную аналитическую систему с наглядным дашбордом. Serverless-архитектура позволила нам сосредоточиться на решении клиентских задач, а не на построении и обслуживании инфраструктуры. Кластер ClickHouse настраивается в несколько кликов, а вопросы по работе и обслуживанию серверов, обеспечение отказоустойчивости, масштабирования, резервное копирование, берет на себя Yandex.Cloud. Сервис также предоставляет удобные инструменты мониторинга как для базы данных, так и для функций. А благодаря хорошему взаимодействию сервисов экосистемы Yandex.Cloud мы легко смогли использовать результирующие данные для построения дашборда в сервисе Yandex DataLens. Наша расширенная аналитика может применяться в широком круге компаний, так как облачная инфраструктура системы универсальна и доступна по цене не только крупному, но и малому бизнесу.

Были и некоторые ограничения, с которыми мы столкнулись в процессе разработки. Во-первых, нам нужно обрабатывать порядка 4000 страниц с данными, но функция выполняется не дольше 500 секунд, и успевает за это время обработать не более 200 страниц. Эту проблему мы решили с помощью помещения номера страницы в очередь и повторного вызова функции по триггеру. Второе ограничение связано с характером получаемых данных: мы получаем по 150–250 записей на одной странице, функция их обрабатывает и сразу же помещает в базу. Но при частой записи данных небольшими объемами ClickHouse показывает производительность ниже, чем при записи больших объемов. Обойти это ограничение нам пока не удалось.

Анализ данных популярная и динамично развивающаяся область. Несмотря на обилие современных инструментов, в ней существует масса вопросов и интересных проблем. Наиболее эффективно работать над ними не в одиночку, а совместно с сообществом дата-аналитиков. У меня есть канал в Telegram со статьями, мануалами, алгоритмами, новостями аналитики и технологий.

Подписывайтесь на блог Yandex.Cloud, чтобы узнавать еще больше новостей и историй об IT и бизнесе.

Другие истории, которые активно читают наши подписчики:

0
Комментарии
-3 комментариев
Раскрывать всегда