CRM systems
E-commerce management
Sales management
Personnel Management
UIS corporate blog
April 2017 13

Клиент-курьер взаимодействие и масштабирование сервиса

image

 

Когда пилишь небольшую доработку под определенную задачу конкретного клиента, редко получается так, что впоследствии она (доработка, а не задача) может превратиться во что-то масштабное. И все же такое случается: мы сделали простенькую надстройку для контроля разговоров между клиентами и привлеченными курьерами, а она взяла и переросла в инструмент по управлению сценарием звонка из внешней системы.


Проблема: отсутствие контроля


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


Магазин привлек внешних курьеров и готовился почивать на лаврах: экономия по сравнению с наймом людей в штат выходила ощутимой. Но совершенно неожиданно процент отказов при доставке вырос до неприличия.


Выяснилось, что с заказами, доставленными собственными курьерами, все хорошо. А вот с привлеченными что-то не так. Клиенты недовольны, заказы не принимают, да еще пишут негативные отзывы на Яндекс.Маркете.


Все, что говорит курьер, может быть использовано...


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


И тогда магазин изменил схему взаимодействия с привлеченными курьерами. Их номера завели в CRM в отдельную категорию, настроили сценарий и теперь они звонили не клиентам, а в магазин:


  • Виртуальная АТС с помощью http-запроса передавала в CRM номер звонящего в магазин;
  • в CRM определялось, что номер принадлежит привлеченному курьеру;
  • обратно в Виртуальную АТС передавалась инструкция для запуска ожидания цифрового ввода с голосовой подсказкой для курьера;
  • курьер набирал четырехзначный номер заказа (вместо номера клиента из 11 цифр);
  • Виртуальная АТС отправляла номер заказа в CRM;
  • та в свою очередь сопоставляла номер заказа с номером телефона клиента и отправляла Виртуальной АТС инструкцию дозвониться на этот номер (или сразу на все, указанные клиентом);
  • Виртуальная АТС дозванивалась на номер клиента (при этом отображался номер магазина) и происходило его соединение с курьером.

От прототипа к готовому продукту


Мы воспользовались сервисом getsandbox.com, который подходит для макетирования серверной системы. Учетная запись в этом сервисе дает возможность создавать свои поддомены и регистрировать на них обработчики http-запросов.


image


Для написания обработчиков используется JavaScript. Бонус сервиса: есть системный объект state, в котором можно сохранять данные между запросами. Это позволяет моделировать многоходовые сценарии. Более того, можно учитывать сбои и неправильные ответы.


http-обработчик регистрируется очень просто
// '/crm_integration' — имя обработчика
// req — входящий http-запрос
// res — ответ системы
Sandbox.define ('/crm_integration', 'GET', function(req, res)
{
// ставим код ответа, можем передать ошибку
res.status(200);
// обозначаем тип контента
res.type('application/json');
// цепляем контент
/* DispatchIncomingDeal — это самописная функция, где мы задали, как именно реагировать на номера звонящих: завели карту курьеров и для их номеров создали специальную обработку, о которой веду речь в статье */
res.json(DispatchIncomingDeal(req));
// Заглушка на случай, если нужно отключить обработку и просто выдать «гвоздями приколоченный» ответ
// res.json("{ \«phones\»: [\«79175968108\»] }");
});

Чтобы получить доступ к содержимому переменных запроса клиента, воспользуемся объектом req, у которого прямо по имени обратимся к значению.


Все, что нужно было сделать — просто зарисовать карту курьеров и при обращении Виртуальной АТС искать в ней передаваемый в параметре numa номер звонящего.


Ищем номер звонящего
// numa — параметр, передаваемый в запросе от Виртуальной АТС
var numa = req.query.numa;
function FindByNuma(numa)
{
return _.findIndex(state.carriers, function(obj){ return (obj.numa === numa); });
}

Если номер находится в карте курьеров, то просим Виртуальную АТС передать курьеру подсказку и дождаться цифрового ввода от него.


В результате магазин реализовал схему, при которой:


  • контролируются переговоры курьеров с клиентами (звонок идет через Виртуальную АТС и разговоры записываются);
  • клиенты видят не мобильный номер, а номер магазина;
  • вероятность ошибки курьера при наборе уменьшается (4 цифры заказа вместо 11 цифр номера клиента);
  • получатель заказа и курьер не знают номеров друг друга, а значит, прямая связь между ними невозможна, то есть стороны не могут созвониться или написать SMS для выяснения отношений.

Увидев, что схема рабочая, мы доработали надстройку Виртуальной АТС в полноценный инструмент, который назвали Интерактивная обработка вызова. С его помощью можно реализовать управление сценарием звонка из любой внешней системы, поддерживающей интеграцию через http.


Передача инструкции осуществляется путем обращения на определенный URI с параметрами вызова, вида uis_test.getsandbox.com/crm_integration?cdr_id=123&start_time=1200&input_result=None&numa=74952345678&numb=74951234567, где:


  • uis_test.getsandbox.com/crm_integration — URI обработчика запросов от Виртуальной АТС;
  • cdr_id — идентификатор звонка;
  • start_time — время начала звонка;
  • input_result — введенные звонящим коды DTMF;
  • numa — номер звонящего;
  • numb — номер, на который звонят.

Внешняя система должна прислать http-ответ, в котором будет JSON-инструкция для Виртуальной АТС. На случай ошибок клиент-серверного взаимодействия в самой Виртуальной АТС мы предусмотрели возможность указывать запасной сценарий действий.


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

+7
1.8k 21
Comments 10