Yclients

Интеграция с системой онлайн-записи и автоматизации сферы услуг

Интеграция с сервисом yclients работает как в Whatsapp (работает сразу после установки адреса для вебхуков), так и в Telegram, Viber (понадобятся дополнительные настройки, работают они с записями, сделанными через них).

С Ватсап работает интеграция без ограничений, а с кнопочными мессенджерами с ограничениями.Число категорий и услуг в категории должно быть на один меньше, чем лимит строк для инлайн кнопок в данном мессенджере. Для ВКонтакте лимит 6 кнопок, значит не более 5 категорий и услуг в данной категории. Разработку большего функционала или изменения вы можете заказать у нас через саппорт в индивидуальном порядке на платной основе.

Она позволяет настраивать реакцию на следующие события внутри сервиса yclients:

  • создание записи на прием;

  • редактирование времени записи на прием;

  • удаление записи на прием;

  • клиент пришел на прием;

  • клиент не пришел на прием;

  • клиенту добавили дату дня рождения (дата переносится в бот для установки напоминания)

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

  • полная запись на прием (Ватсап, Вайбер, Телеграм и пр. мессенджеры) с выбором услуги, мастера, даты и воемени;

  • автоматическая запись на ту же услугу и к тому же мастеру, что в прошлый раз на ближайший сеанс;

  • отправить СМС с кодом подтверждения для регистрации клиента перед оформлением заказа;

  • вывести полное описание выбранной клиентом услуги;

  • получить список всех категорий и услуг;

  • получить основные сведения о клиенте из базы yclients (если он уже зарегистрирован в системе, но впервые в боте);

  • вычислить дату отправки сообщения со спецпредложением ко Дню Рождения;

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

Установка webhook

После настройки бота установите адрес для отправки вебхуков в сервисе yclients. Пройдите в Настройки – WebHook. Выставьте «Отправлять» и адрес для уведомлений: https://chatter.salebot.pro/yclients_webhook/<api-ключ>

api-ключ необходимо взять из настроек проекта.

Поставьте галочку в поле «Событие по записям». Если хотите, чтобы бот получал даты дней рождения, то выставьте галочку и для поля «Событие по клиентам».

Рисунок 1

Внимание! Подключайте вебхуки только после настройки бота!

Настройка визитов

В Уклаентс есть Визиты и есть записи. Несколько записей могут объединяться в визиты. Интервал этого объединения задается в настройках. Для работы чат-бота необходимо, чтобы записи в визиты не объединялись. Иначе будет приходить несколько вебхуков за раз и бот будет работать некорректно. Настройки производятся в Yclients Настройки - Журнал записи. Здесь в поле Интервал между уникальными визитами выставьте Каждая запись - Отдельный визит.

Настройка реакций на события.

Обратите внимание, что необходимо заполнять не только поле Условие, но и поле Строки, на которые не надо отвечать. Если это поле не заполнено, то клиенту будут приходить по нескольку сообщений.

Все блоки типа Первостепенная проверка условий.

Создана новая запись

На фото 2 представлены настройки для ветки с ответом на создание записи клиентом.

Условие: record create

Рисунок 2

В нашем примере клиенту отправляются разные сообщения в зависимости от того записался клиент через сайт или через бота, поэтому была сделана такая «вилка» (рисунок 3-4). Больше про заполнение блоков в вилке на рис. 29-30:

Рисунок 3
Рисунок 4

Клиент пришел на прием

Условие: record update attendance_success_visit

Риунок 5

В нашем случае это сообщение должно прийти через полчаса после визита, поэтому сначала идет пустое сообщение, а через 30 мин - сообщение с соответствующим текстом.

Рисунок 6

Клиент не пришел на прием

Условие: record update attendance_fail_visit

Рисунок 7

Клиент изменил время записи на прием

Условие: record update date

Рисунок 8

Клиент удалил запись на прием

Условие: record delete

Рисунок 9

Клиенту добавлена дата дня рождения

Условие: record update Строки, на которые не надо отвечать: record update attendance_fail_visit;record update attendance_success_visit;record update date;record delete;record update

Получаемые переменные

Из вебхуков бот получает следующие переменные (их все можно увидеть в разделе Клиенты при нажатии Подробно возле ссылки на клиента Рисунок 10):

name - в Ватсапе заполняется Именем из Yclients yclients_birth_day - и yclients_birth_month день и месяц даты рождения. Нужна для спецпредложений ко Дню рождения yclients_client_id - id клиента в Yclients yclients_email – email клиента в Yclients yclients_date – дата записи на прием yclients_time – время записи на прием yclients_service_name – название услуги, на которую записан (для показа клиенту) yclients_service_id – id услуги, на которую записан (для апи вызовов) yclients_staff_name – имя сотрудника, к которому записан (для показа клиенту) yclients_staff_id - id сотрудника, к которому записан (для апи вызовов) yclients_record_id – id записи в Yclients (нужна для формирования ссылки на редактирование) yclients_attendance – пришел ли клиент на прием yclients_sms_before – за сколько часов до приема клиент попросил ему напомнить yclients_raw - массив актуальных записей клиента. Он обновляется с каждым вебхуком. yclients_activity_id - id группового события

Запись на прием

Рисунок 11

Запись на прием состоит из последовательных апи вызовов. Если клиент записывается впервые или хочет записаться на услугу, отличную из предыдущей, то начинать запись надо с первого этапа. Если он хочет повторить запись (известны yclients_service_id и yclients_staff_id), то можно начать запись с этапа выбора даты.

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

Данная функция предлагает вам уже готовые варианты для инлайн кнопок (#{buttons}), для цифрового меню в Ватсап (#{category_str} – цифра, название и небольшое описание, #{ buttons_str_*} – только цифра и название) и для условия перехода, чтобы минимизировать возможность ошибки при записи клиента (#{condition}). Также выводится #{answer}, в котором размещается ответ самого Yclients (в нем выводится почему произошла ошибка в апи вызове, поэтому лучше его показывать клиенту).

В качестве параметра {"company_id": " id вашего филиала Yclients"} надо подставлять идентификатор вашего филиала (или филиала вашего заказчика), он находится в разделе Обзор - Сводка в YCLIENTS (Рисунок 12)

Рисунок 12

Выбор категории

Рисунок 13

Ответ: Выберите категорию: #{category_str}#{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: buttons-> buttons; buttons_str-> buttons_str_cat; category_str-> category_str; answer-> answer; condition-> condition JSON POST-параметров: {"secret":"ваш секретный ключ Yclients", "company_id": " id вашего филиала Yclients", "client": "#{client_type}", "command": "category"} Расширенные настройки кнопок: #{buttons}

В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_cat

Выбор категории можно не запрашивать, перейдя сразу к выбору услуги, тогда в качестве параметра input_cat при запросе услуг надо использовать “0”: {"input_cat": "0"}

Рисунок 14

Выбор услуги

Рисунок 15

Ответ: Выберите название услуги: #{services_str}#{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: services-> services; services_str-> services_str; buttons-> buttons; buttons_str->buttons_str_serv; answer-> answer; condition-> condition JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "services", "input_cat": "#{input_cat}", "buttons_str": "#{buttons_str_cat}"} Расширенные настройки кнопок: #{buttons}

Если ввести пустое значение "input_cat": "", то выведется полный список услуг, а не список услуг в определенной категории.

Рисунок 16

В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_service

Выбор мастера

Рисунок 17

Ответ: Выберите мастера: #{staff_str}#{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: r-> staff; staff_str-> staff_str; buttons-> buttons; buttons_str->buttons_str_staff; answer-> answer; service_id->service_id; service_title-> service_title; condition-> condition JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "staff", "input_service": "#{input_service}", "buttons_str": "#{buttons_str_serv}"} Расширенные настройки кнопок: #{buttons}

Рисунок 18

В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_staff

Выбор даты

Рисунок 19

Ответ: Услуга: #{service_title} Мастер: #{staff_title}#{staff_title_y} Выберите дату: #{buttons_str1}#{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: buttons-> buttons; answer-> answer; buttons_str-> buttons_str_date; buttons_str1-> buttons_str1; buttons_str2-> buttons_str2; buttons_str3-> buttons_str3; staff_id-> staff_id; staff_title-> staff_title; condition-> condition; condition1-> condition1; condition2-> condition2; condition3-> condition3; condition_buttons-> condition_buttons JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "date", "input_staff": "#{input_staff}", "service_id": "#{service_id}", "buttons_str": "#{buttons_str_staff}", "last_hour": "", "current_hour": "#{current_time}"} } Расширенные настройки кнопок: #{buttons}

Рисунок 20

В настройках стрелки указываем: Условие: #{condition1};#{condition_buttons} Активировать “Пользователь вводит данные” Вводимые данные: input_date

Если список дат больше 10, то есть возможность в Ватсапа показать все даты в одном списке (buttons_str_date) или выводить по 10 дат в сообщении (первое сообщение buttons_str1, второе buttons_str2, третье buttons_str3). И в зависимости от этого выбора надо использовать нужную переменную для условия (condition – если все даты в одном списке, condition1, condition2, condition3 – соответственно выводимому списку дат).

Рисунок 21

Выбор времени

Рисунок 22

Ответ: Выберите время: #{buttons_str_time}#{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: buttons-> buttons; answer-> answer; buttons_str-> buttons_str_time; appoint_date->appoint_date; date_title-> date_title; condition-> condition JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "time", "staff_id": "#{staff_id}", "service_id": "#{service_id}", "input_date": "#{input_date}", "buttons_str": "#{buttons_str_date}", "year": "2020"} Расширенные настройки кнопок: #{buttons}

Рисунок 23

В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_time

Преобразуем время из цифры во время

Рисунок 24

Ответ: За сколько часов вам напомнить о записи? Введите цифру! Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: appoint_time-> appoint_time JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "front_time", "buttons_str": "#{buttons_str_time}", "input_time": "#{input_time}"}

Рисунок 25

В настройках стрелки указываем: Условие: ^[1-9]+[0-9]*$ Тип сравнения: Регулярное выражение Активировать “Пользователь вводит данные” Вводимые данные: notify_by_sms

Спрашиваем комментарий к записи

Рисунок 26

Уточняем все ли верно заполнено

Рисунок 27

Ответ: Вы подтверждаете свою запись? Услуга: #{service_title} Мастер: #{staff_title}#{staff_title_y} Дата: #{date_title} Время: #{appoint_time} Напомнить за #{notify_by_sms} часов Назначение переменных при переходе: yclients_appointments_id = if("#{yclients_appointments_id}" == "", 0, yclients_appointments_id) yclients_appointments_id = yclients_appointments_id + 1 тип_записи = bot

Где yclients_appointments_id – генерируем некое число, которое надо для отправки запроса на запись (не принципиально какое), а тип_записи – переменная, которая является ключевой в вилке сообщений-реакций при записи на услугу. Попросту отмечаем, что только что сделали запись через бота.

Отправляем запрос

Рисунок 28

Ответ: #{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: answer-> answer; yclients_record_id_mobile->yclients_record_id_mobile JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "appoint", "staff_id": "#{staff_id}", "service_id": "#{service_id}", "appoint_date": "#{appoint_date}", "appoint_time": "#{appoint_time}", "yclients_appointments_id": "#{yclients_appointments_id}", "phone": "+79780529771", "client_name": "#{yclients_name}", "email": "#{yclients_email}", "comment": "#{comment}", "notify_by_sms": "#{notify_by_sms}", "order_id": "#{order_id}"}

Удаление записи

Ответ: #{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: status-> status JSON POST-параметров: {"command": "delete", "client": "#{client_type}", "secret": "ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients", "user_token": "Токен пользователя (получение описано в разделе Получаем дату дня рождения из Yclients", "record_id": "yclients_record_id_mobile"}

Редактирование записи

Ответ: #{answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из JSON-ответа: answer-> answer; yclients_record_id_mobile->yclients_record_id_mobile JSON POST-параметров: {"secret":"ваш секретный ключ Yclients ", "user_token": "Токен пользователя (получение описано в разделе Получаем дату дня рождения из Yclients", "company_id": "id вашего филиала Yclients", "client": "6", "command": "change_appoint", "appoint_date": "#{appoint_date}", "appoint_time": "#{appoint_time}", "comment": "", "phone": "#{vk_id}", "record_id": "#{yclients_record_id}"}

Вилка сообщений при создании записи

Чтобы клиент мог без проблем записаться на услугу, на которую перед этим записался через бот или через сайт, настроим блоки реакции (схема вилки на рис.3 -4).

В сообщении, которое приходит при записи через бот указываем в блоке Назначение переменных при переходе:

30_дней_тишины = addDays(yclients_date,30) our_client = 1 тип_записи = yclients_staff_id = #{staff_id} yclients_service_id = #{service_id} yclients_sms_before = #{notify_by_sms} yclients_staff_name = #{staff_title}

Рисунок 29

our_client мы будем делать дальше при переходе в бот по ссылке и на втором этапе реакции на создание записи.

тип_записи Эту переменную очищаем, чтобы если клиент запишется в следующий раз через сайт, то он получил сообщение-реакцию на запись с сайта, а не из бота.

yclients_staff_name, yclients_staff_id и yclients_service_id нам понадобится, если клиент захочет записаться на ту же услугу не сначала, а с этапа выбора даты.

yclients_sms_before – нужна для подсчета времени напоминания о записи.

В сообщении, которое приходит при записи через сайт оставляем первый блок пустым. А из него делаем вилку (Рисунок 30).

Рисунок 30

В обоих блоках развилки указываем в блоке Назначение переменных при переходе: 30_дней_тишины = addDays(yclients_date,30) our_client = 1 напоминание_прием_время = addMinutes(yclients_time, -yclients_sms_before * 60) напоминание_прием_дата =if(напоминание_прием_время < yclients_time, yclients_date, addDays(yclients_date, -1)) service_title = #{yclients_service_name} staff_title_y = #{yclients_staff_name} input_staff = #{yclients_staff_id} staff_id = #{yclients_staff_id} service_id = #{yclients_service_id} yclients_name = #{name} phone = #{vk_id}

Рисунок 31

Но в блоке, гдепеременная our_client отсутствует,

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

Получаем дату дня рождения из Yclients.

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

В любом случае нам надо сделать следующий АПИ запрос где-то прямо на входе клиента в бот.

Для начала создадим дополнительное поле в Yclients. Для этого перейдите в сеть (нажмите на название филиала, слева над календарем), в разделе Настройки - Дополнительные поля – Доп. Данные клиента. Созданные дополнительные поля можно настроить в филиалах, отражаются они в карточке визита, во вкладке Детали записи - Все параметры. Настройки указаны на рисунках 32 -35.

Рисунок 32
Рисунок 33
Рисунок 34
Рисунок 35

Важно! Ключ-значение для API должен называться именно client_id!

Далее необходимо авторизовать пользователя в системе и получить секретный токен (в вызовах АПИ его надо подставлять в параметр «user_token»..

Пользователи - это сотрудники, указанные в Yclients в Настройки – Пользователи. Для получения токена необходимо сделать АПИ вызов, в котором указать логин и пароль нужного пользователя (Рисунок 36):

Рисунок 36

Ответ :#{custom_answer} Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из ответа: token-> token JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": "id вашего филиала Yclients ", "client": "#{client_type}", "command": "get_auth", "login": "#{Логин_польз}", "password": "#{Пароль_польз}"}

Когда клиент впервые заходит в ваш бот, то необходимо передать "#{order_id} в созданное доп.поле, как метку, чтобы когда менеджер добавит дату рождения в его профиль, она пришла в бот вместе с колбэком. Если дата рождения уже заполнена в профиле, то в ответе вызова придет дата рождения.

Для этого надо сделать два запроса – одним запросом мы получим дату рождения клиента из yclients и отправим ему нашу метку по номеру телефона а другим запросом вычислим дату напоминания (Рисунок 36). В первом запросе:

Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из ответа: id-> id; name-> yclients_name; email-> email; birth_date-> birth_date

JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": " id вашего филиала Yclients ", "client": "#{client_type}", "command": "send_value", "user_token": "Токен пользователя", "phone": "#{vk_id}", "order_id": "#{order_id}", "id": "#{yclients_client_id}"}

Во втором запросе (Рис. 37):

Рисунок 37

Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients_birth_day Сохраняемые значения из ответа: remind_birth_date-> напоминание_ДР JSON POST-параметров: {"birth_date":"#{birth_date}", "remind_term": "7", "day": "#{yclients_birth_day}", "month": "#{yclients_birth_month}"}

Вы можете передать при запросе либо birth_date (в формате 2020-05-20) или day и month. remind_term – количество дней, за которые надо отправить напоминание.

remind_term – количество дней, за которые надо отправить напоминание.

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

Работаем с Yclients не из Whatsapp (Telegram, Viber, ВК и тд.)

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

Рисунок 38

Важно! Ключ-значение для API должно называться именно order_id_field !

Рисунок 39

Схема описана в разделе «Получаем дату дня рождения из Yclients» и на рисунках 32, 38, 39

Сам запрос мы с вами уже рассматривали в разделе «Запись на прием» и на Рисунке 11.

Автозапись на ближайший сеанс

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

Делается это за два запроса: один запрос позволяет получить дату и время ближайшего сеанса, а второй запрос – уже описанный в разделе запись запрос «Отправляем запрос».

Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из ответа: staff_id-> yclients_staff_id; service_id_list-> service_id_list; service_title_list-> service_title_list; staff_name-> yclients_staff_name; front_date-> front_date; nearest_date-> nearest_date; time-> time; name-> name; email-> email; client_id-> client_id; birth_date-> birth_date JSON POST-параметров: {"secret":"ваш секретный ключ Yclients", "company_id": " id вашего филиала Yclients ", "client": "#{client_type}", "command": "nearest_appoint", "user_token": "Токен пользователя", "current_date": "#{current_date}", "current_time": "#{current_time}", "break_time": "1", "end_time": "18:30", "phone": "#{vk_id}", "timez": "0"}

break_time – позволяет указать за сколько часов минимум записывать на сеанс end_time – время записи на последний сеанс timez - позволяет работать в часовых поясах, отличных от Москвы. В Москве он равен "0". В Оренбурге - "2".

Рисунок 40

Смена времени записи

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

Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из ответа: answer-> answer; yclients_record_id_mobile->yclients_record_id_mobile JSON POST-параметров: {"secret":"ваш секретный ключ Yclients", "user_token": "Токен пользователя", "company_id": "id вашего филиала Yclients", "client": "6", "command": "change_appoint", "appoint_date": "#{appoint_date}", "appoint_time": "#{appoint_time}", "comment": "", "phone": "#{vk_id}", "record_id": "#{yclients_record_id}"}

yclients_record_id - id уже существующей записи клиента, которую он хочет отредактировать

Получить весь список услуг и категорий

Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из ответа: resp-> resp JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": " id вашего филиала Yclients ", "client": "#{client_type}", "command": " service_list"}

Получить описание услуги

Тип запроса: POST-json URL-запроса: https://store.salebot.pro/function/yclients Сохраняемые значения из ответа: title_serv-> title_serv; price_min-> price_min; price_max-> price_max; comment->comment; images-> images; id_serv->id_serv JSON POST-параметров: {"secret":" ваш секретный ключ Yclients ", "company_id": " id вашего филиала Yclients ", "client": "#{client_type}", "command": "service_discr", "input_service": "#{input_service}", "buttons_str": "#{buttons_str_serv}", "user_token": " Токен пользователя "}

user_token – получение токена описано в разделе Получение даты Дня рождения

Рисунок 41

Быстрый старт

Для быстрого создания бота вы можете просто установить шаблок рпоекта и поменять данные интеграции на свои.

Видеоверсия