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-инструкция для Виртуальной АТС. На случай ошибок клиент-серверного взаимодействия в самой Виртуальной АТС мы предусмотрели возможность указывать запасной сценарий действий.


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

Поделиться с друзьями
-->

Комментарии (10)


  1. DanikoBas
    13.04.2017 15:25

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


    1. StephanDeshevikh
      13.04.2017 15:32
      +1

      После того как дозвонились до клиента происходит соединение плеча курьера и плеча абонента, начинается разговор. За счёт того, что звонок идёт через сервис телефонии интернет-магазина, все разговоры пишутся.
      Соответственно, когда возникают проблемы, можно просто посмотреть историю звонков, найти запись разговора, послушать и разобраться, кто что сказал и что не так сделал. Более того, в системе регистрируются и неуспешные звонки, так что отговорка курьера, что «я звонил и клиенту не дозвонился» уже не прокатывает: все ходы записаны. :)


      1. DanikoBas
        13.04.2017 17:52

        Теперь возникает проблема. Если это крупный город то курьеры просто начинают ёрничать. В регионах такая система вызовет резкое сопротивление. Увеличится текучка, ухудшится качество. Даже мотивированные курьеры будут сопротивляться. А не предупреждать их вы не можете, это незаконно.
        Такая же судьба у систем слежения за маршрутами и прочим


        1. StephanDeshevikh
          13.04.2017 18:20

          Простите, мысль не уловил. Резкое сопротивление чему?


          1. DanikoBas
            13.04.2017 18:39

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


            1. StephanDeshevikh
              13.04.2017 20:06

              Да, соглашусь, бывает острая реакция на контроль. Но в целом наш клиент исходил из мысли, что добросовестному сотруднику бояться нечего. Это с одной стороны, а с другой, если все переговоры пишутся, то почему курьеры (хотя бы и привлеченные) исключены их этой схемы? Запись — это оружие обоюдоострое, то есть может служить не только для того, чтобы кого-то «прижать», но может и защищать. И ещё раз повторю, что добросовестному сотруднику прозрачность — всегда на пользу, а не во вред.


              1. Fess
                14.04.2017 10:30

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


                1. StephanDeshevikh
                  14.04.2017 10:43

                  > Я тоже хочу знать кому и когда я звонил
                  А для чего?


                  1. Fess
                    14.04.2017 10:49

                    Предположим, у меня куча событий произошла в один день. Замотался. Куча заказов от вашего магазина, плюс личные звонки и вообще выдался тяжёлый день… Звонят из магазина, говорят клиент не доволен, который был в 13:00, а там в записи телефона только вы. Как бы посмотреть, кому я звонил в этот период? Не номер телефона, хотя бы номер заказа. Спрашивать у вас не стану, вы мне звоните уже с обвинениями.
                    И ещё вопрос. Клиент может связаться с курьером?


                    1. StephanDeshevikh
                      14.04.2017 10:53

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