Интеграция с сервисом yclients работает как в Whatsapp (работает сразу после установки адреса для вебхуков), так и в Telegram, Viber (понадобятся дополнительные настройки, работают они с записями, сделанными через них).
С Ватсап работает интеграция без ограничений, а с кнопочными мессенджерами с ограничениями.Число категорий и услуг в категории должно быть на один меньше, чем лимит строк для инлайн кнопок в данном мессенджере. Для ВКонтакте лимит 6 кнопок, значит не более 5 категорий и услуг в данной категории.
Разработку большего функционала или изменения вы можете заказать у нас через саппорт в индивидуальном порядке на платной основе.
Она позволяет настраивать реакцию на следующие события внутри сервиса yclients:
создание записи на прием;
редактирование времени записи на прием;
удаление записи на прием;
клиент пришел на прием;
клиент не пришел на прием;
клиенту добавили дату дня рождения (дата переносится в бот для установки напоминания)
Также, клиент может записаться на прием прямо из бота (на ту же услугу что и в прошлый раз или на новую услугу). Вы можете настроить бота так, чтобы он делал следующее:
полная запись на прием (Ватсап, Вайбер, Телеграм и пр. мессенджеры) с выбором услуги, мастера, даты и воемени;
автоматическая запись на ту же услугу и к тому же мастеру, что в прошлый раз на ближайший сеанс;
отправить СМС с кодом подтверждения для регистрации клиента перед оформлением заказа;
вывести полное описание выбранной клиентом услуги;
получить список всех категорий и услуг;
получить основные сведения о клиенте из базы yclients (если он уже зарегистрирован в системе, но впервые в боте);
вычислить дату отправки сообщения со спецпредложением ко Дню Рождения;
вы можете организовать два и более филиала в одном боте, особенно, если клиенты в филиалах не повторяются.
После настройки бота установите адрес для отправки вебхуков в сервисе yclients. Пройдите в Настройки – WebHook. Выставьте «Отправлять» и адрес для уведомлений: https://chatter.salebot.pro/yclients_webhook/<api-ключ>
api-ключ необходимо взять из настроек проекта.
Поставьте галочку в поле «Событие по записям». Если хотите, чтобы бот получал даты дней рождения, то выставьте галочку и для поля «Событие по клиентам».
Внимание! Подключайте вебхуки только после настройки бота!
В Уклаентс есть Визиты и есть записи. Несколько записей могут объединяться в визиты. Интервал этого объединения задается в настройках. Для работы чат-бота необходимо, чтобы записи в визиты не объединялись. Иначе будет приходить несколько вебхуков за раз и бот будет работать некорректно. Настройки производятся в Yclients Настройки - Журнал записи. Здесь в поле Интервал между уникальными визитами выставьте Каждая запись - Отдельный визит.
Обратите внимание, что необходимо заполнять не только поле Условие, но и поле Строки, на которые не надо отвечать. Если это поле не заполнено, то клиенту будут приходить по нескольку сообщений.
Все блоки типа Первостепенная проверка условий.
На фото 2 представлены настройки для ветки с ответом на создание записи клиентом.
Условие: record create
В нашем примере клиенту отправляются разные сообщения в зависимости от того записался клиент через сайт или через бота, поэтому была сделана такая «вилка» (рисунок 3-4). Больше про заполнение блоков в вилке на рис. 29-30:
Условие: record update attendance_success_visit
В нашем случае это сообщение должно прийти через полчаса после визита, поэтому сначала идет пустое сообщение, а через 30 мин - сообщение с соответствующим текстом.
Условие: record update attendance_fail_visit
Условие: record update date
Условие: record delete
Условие: 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 группового события
Запись на прием состоит из последовательных апи вызовов. Если клиент записывается впервые или хочет записаться на услугу, отличную из предыдущей, то начинать запись надо с первого этапа. Если он хочет повторить запись (известны yclients_service_id и yclients_staff_id), то можно начать запись с этапа выбора даты.
В данной схеме предполагается, что имя клиента в системе Yclients и его номер телефона вы уже получили.
Данная функция предлагает вам уже готовые варианты для инлайн кнопок (#{buttons}), для цифрового меню в Ватсап (#{category_str} – цифра, название и небольшое описание, #{ buttons_str_*} – только цифра и название) и для условия перехода, чтобы минимизировать возможность ошибки при записи клиента (#{condition}). Также выводится #{answer}, в котором размещается ответ самого Yclients (в нем выводится почему произошла ошибка в апи вызове, поэтому лучше его показывать клиенту).
В качестве параметра {"company_id": " id вашего филиала Yclients"} надо подставлять идентификатор вашего филиала (или филиала вашего заказчика), он находится в разделе Обзор - Сводка в YCLIENTS (Рисунок 12)
Ответ: Выберите категорию: #{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"}
Ответ: Выберите название услуги: #{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": "", то выведется полный список услуг, а не список услуг в определенной категории.
В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_service
Ответ: Выберите мастера: #{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}
В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_staff
Ответ: Услуга: #{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}
В настройках стрелки указываем: Условие: #{condition1};#{condition_buttons} Активировать “Пользователь вводит данные” Вводимые данные: input_date
Если список дат больше 10, то есть возможность в Ватсапа показать все даты в одном списке (buttons_str_date) или выводить по 10 дат в сообщении (первое сообщение buttons_str1, второе buttons_str2, третье buttons_str3). И в зависимости от этого выбора надо использовать нужную переменную для условия (condition – если все даты в одном списке, condition1, condition2, condition3 – соответственно выводимому списку дат).
Ответ: Выберите время: #{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}
В настройках стрелки указываем: Условие: #{condition} Активировать “Пользователь вводит данные” Вводимые данные: input_time
Ответ: За сколько часов вам напомнить о записи? Введите цифру! Тип запроса: 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}"}
В настройках стрелки указываем: Условие: ^[1-9]+[0-9]*$ Тип сравнения: Регулярное выражение Активировать “Пользователь вводит данные” Вводимые данные: notify_by_sms
Ответ: Вы подтверждаете свою запись? Услуга: #{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 – генерируем некое число, которое надо для отправки запроса на запись (не принципиально какое), а тип_записи – переменная, которая является ключевой в вилке сообщений-реакций при записи на услугу. Попросту отмечаем, что только что сделали запись через бота.
Ответ: #{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}
our_client мы будем делать дальше при переходе в бот по ссылке и на втором этапе реакции на создание записи.
тип_записи Эту переменную очищаем, чтобы если клиент запишется в следующий раз через сайт, то он получил сообщение-реакцию на запись с сайта, а не из бота.
yclients_staff_name, yclients_staff_id и yclients_service_id нам понадобится, если клиент захочет записаться на ту же услугу не сначала, а с этапа выбора даты.
yclients_sms_before – нужна для подсчета времени напоминания о записи.
В сообщении, которое приходит при записи через сайт оставляем первый блок пустым. А из него делаем вилку (Рисунок 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}
Но в блоке, гдепеременная our_client отсутствует,
делаем дополнительный запрос, который нам понадобится, если хотим получить из вебхука День рождения клиента. Он описан ниже.
Дата ДР приходит в бот вместе с вебхуком в тот момент, когда администратор добавляет ее в карточку клиента, а если на момент регистрации клиента в боте она уже есть в его профиле.
В любом случае нам надо сделать следующий АПИ запрос где-то прямо на входе клиента в бот.
Для начала создадим дополнительное поле в Yclients. Для этого перейдите в сеть (нажмите на название филиала, слева над календарем), в разделе Настройки - Дополнительные поля – Доп. Данные клиента. Созданные дополнительные поля можно настроить в филиалах, отражаются они в карточке визита, во вкладке Детали записи - Все параметры. Настройки указаны на рисунках 32 -35.
Важно! Ключ-значение для API должен называться именно client_id!
Далее необходимо авторизовать пользователя в системе и получить секретный токен (в вызовах АПИ его надо подставлять в параметр «user_token»..
Пользователи - это сотрудники, указанные в Yclients в Настройки – Пользователи. Для получения токена необходимо сделать АПИ вызов, в котором указать логин и пароль нужного пользователя (Рисунок 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):
Тип запроса: 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.
Важно! Ключ-значение для API должно называться именно order_id_field !
Схема описана в разделе «Получаем дату дня рождения из 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".
Можно записать клиента на другое время. Для этого используются следующие настройки блока:
Тип запроса: 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 – получение токена описано в разделе Получение даты Дня рождения
Для быстрого создания бота вы можете просто установить шаблок рпоекта и поменять данные интеграции на свои.