Передаем негативных клиентов в google sheets с помощью Chatrex и MoreKit


Передаем негативных клиентов в google sheets с помощью Chatrex и MoreKit

В данной статье рассмотрим следующий кейс: необходимо передать данные из CRM в google sheets (id сделки, имя клиента, имя ответственного), если клиент проявил негатив в общении с менеджером

Для данной реализации будет задан соответствующий промпт в ИИ бота на стороне Chatrex

Настройка бота

Настраиваем боту соответствующий промпт, при котором бот отправит webhook на адрес MoreKit с соответствующими данными, если клиент написал негативное сообщение по заданным условиям промпта.

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

В вкладке “Условия срабатывания” — мы можем указать параметры при которых текущий бот будет работать, дни недели, время (с указанием часового пояса) и условия запуска.

Для начала необходимо выбрать каналы общения, для этого — нажмите на шестеренку, и выберите необходимые каналы в которых будет общаться чат-бот. После чего нажмите кнопку “сохранить”

Далее необходимо выбрать условия запуска бота. Например, при интеграции с каналом amoCRM, можно выбрать в каких воронках и в каких статусах сделки будет работать бот. Условия можно комбинировать, например чат-бот будет работать в воронке “Продажи”, на всех этапах, но только с теми сделками, в которых наше кастомное поле “Статус клиента” равно значению ‘VIP’

Раздел “Свои переменные” — необходим для того, чтобы бот записывал данные от клиента, которые получает во время диалога. Для этого укажите название самой переменной (обязательно на английском) и понятное пояснение для бота что это за переменная. Например нам необходимо чтобы в рамках диалога бот выяснял номер клиента и указывал его в карточке контакта amoCRM.

Создание таблицы google sheets

На данном шаге необходимо создать google таблицу, развернув на ней скрипт обработчик. Копируем скрипт и выполняем новое развертывание по данной документации

Скрипт-обработчик для appscript будет следующий

function doPost(request) {
  var data = JSON.parse(request.postData.contents),
    sheet = SpreadsheetApp.getActive().getActiveSheet(),
    table_headers = get_table_headers(sheet),
    search_by = request.parameter.search_by;
  if (table_headers.length == 0) {
    table_headers = Object.keys(data);
    fill_headers(sheet, table_headers);
  }
  if (!search_by) {
    return ContentService.createTextOutput(JSON.stringify({
      'error': 'search_by not found'
    }));
  }
  if (is_object(data)) {
    var fill_func = fill_object;
    if (is_array(data)) fill_func = fill_array;
    fill_func(data, table_headers, sheet, search_by);
  } else {
    return ContentService.createTextOutput(JSON.stringify({
      'error': 'Unknown data format'
    }));
  }
  return ContentService.createTextOutput(JSON.stringify({
    'result': 'ok'
  }));
}

function is_array(data) {
  return typeof(data) === 'object' && data.length;
}

function is_object(data) {
  return typeof(data) === 'object';
}

function fill_array(data, table_headers, sheet, search_by) {
  data.forEach((v) => {
    fill_object(v, table_headers, sheet, search_by)
  });
}

function fill_object(data, table_headers, sheet, search_by) {
  var column_id = table_headers.indexOf(search_by);
  if (column_id < 0) return;
  var row = get_row_id_by_lead_id(data[search_by], column_id + 1, sheet),
    data = object_to_list(data, table_headers);
  sheet.getRange(row, 1, 1, data.length).setValues([data]);
}

function fill_headers(sheet, headers) {
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
}

function get_table_headers(sheet) {
  var cols = sheet.getLastColumn();
  if (cols > 0)
    return sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  else
    return [];
}

function object_to_list(data, table_headers){
    var result = [];
    for (var i in table_headers){
        var is_null = data[table_headers[i]] === undefined || data[table_headers[i]] === null;
        result.push(is_null ? '' : data[table_headers[i]]);
    }
    return result;
}

function get_row_id_by_lead_id(lead_id, column, sheet) {
  var last_row = sheet.getLastRow();
  if (last_row > 1) {
    var data = sheet.getRange(2, column, last_row, 1).getValues();
    for (i in data) {
      if (data[i] && data[i][0] == lead_id) return parseInt(i) + 2;
    }
  }
  return parseInt(last_row) + 1;
}

После вставки скрипта и его развертки на таблицу — отправленные на таблицу данные будут заполняться в таблицу

Настройка процесса в MoreKit

Теперь необходимо создать процесс в MoreKit, выбираем нужный тип, в нашем случае тип процесса будет «Другое»

Выстраиваем схему следующим образом

Описание блоков схемы

#1 Регулярные выражения — используется для очистки номера телефона от лишних символов (пробелов, скобок, операторов)

#2 Найти контакты — ищем контакт по очищенному номеру телефона

#3 — ищем контакт по email адресу, если не нашли по телефону

#5 Создать контакт — создаем новый контакт, если не сработал поиск по email и номеру телефона

#6 Создать переменную — записываем найденный/созданный контакт в переменную для удобства обращения к данным контакта

#7 Найти сделки — ищем активную сделку из контакта. В данном блоке используем фильтр по статусу, отсекая поиск сделок в закрытых статусах, чтобы результатом поиска была активная сделка

#8 Создать сделку — Создаем новую сделку, если не нашли активную сделку из контакта, заполняем название сделки, статус, прикрепляем контакт

#9 Создать переменную — записываем найденную/созданную сделку в переменную

#10 HTTP запрос — отправляем HTTP запрос в нашу google таблицу. В данном блоке URL — генерируемый url после разворачивания скрипта. Добавляем один GET параметр search_by, чтобы не было дублей строк в таблице, при отправке автоматически найдется строка с ID сделки, который будет передаваться. Если сделка в таблице не найдется — создастся новая строка. POST параметры — параметры, необходимые для заполнения в таблицу: Имя, Номер, Email, Сообщение, ID сделки

Проверяем результат

Ждем сообщения от бота. Как только поступит негативное сообщение — произойдет отправка webhook со стороны Chatrex в Morekit. В процессе данные обработаются и отправятся в таблицу.

Подводим итоги

В данной статье разобрали, как передать информацию о клиенте, который оставил негативное сообщение с помощью отправки запроса из Chatrex в MoreKit. MoreKit собрал данные внутри процесса и успешно передал их в google таблицу