Пронто. Система оповщений

Задача

  • Мотивировать клиентов делать последующие заказы
    • Рассылая им мотивирующие сообщения
  • Измерять эффективность рассылок

Реализация

  • Реализация происходит исключительно по настоящему ТЗ
  • Система не имеет настроек. Её параметры могут быть изменены только через доработку и установку обновления
  • Отправка оповещения инициируется на стороне Юпитера
    • Для этого добавляем задания для планировщика. На каждый вид оповещения своё задание.
  • Юпитер подготавливает сообщение и передает его Сайту через POST запрос (формат). Сайт отправляет оповещение клиенту через push или sms
  • Вместе с отправкой оповещения Юпитер может выполнять и другие действия, например начислить бонусы
  • Все действия и отправка оповещения должны выполняться в транзакции
  • Для одного вида оповещений может быть задан набор различных действий. Тогда Юпитер выбирает одно из возможных действий псевдослучайным способом. Пример: 
    • Нужно выполнить 5 оповещений (одного вида). Задано 3 возможных действия.
      • 1 оповещение отработает по действию № 1
      • 2 оповещение отработает по действию № 2
      • 3 оповещение отработает по действию № 3
      • 4 оповещение отработает по действию № 1
      • 5 оповещение отработает по действию № 2
  • Виды оповещений:
  • Механика определения эффективности.
    • В бонусных операциях начислениях сохраняем "Причину начисления".
      • Возможные причины начисления:
        • feedback (Начисление за отзыв)
        • profile (Начисление за заполнение анкеты)
        • birthday (Начисление на день рождения)
        • order (Начисление за заказ)
        • invite (Приглашение в ресторан)
      • Добавляем новое поле в БД в таблицу временных и постоянных бонусов
      • Добавляем новый параметр reason в запросы на начисление бонусов. Значение параметра не проверяется, и сохранятся в БД как есть.
      • Во все операции начисления по заказам, записываем причину order. Это нужно, чтобы отличать такие операции от всех остальных.
    • Все отправленные оповещения сохраняются на центральном сервере Юпитера, для дальнейшего построения отчетов
    • В таблице отправленных оповещений фиксируем наличие реакции клиента на оповещение.
      • Для разных видов оповещений, могут быть разные виды реакций. Возможные реакции:
        • Клиент сделал заказ
        • Клиент выполнил спец. действие (например оставил отзыв или заполнил анкету).
      • Для фиксации реакции, добавляем задание для планировщика, которое:
        • Перебирает все оповещения по которым ожидаем реакцию
        • Проверяет наличие реакции
          • Если вид оповещения feedback, profile
            • Находит первое начисление бонусов нужного вида, после даты отправки оповещения
              • Проверка будет выполнятся через запрос на бонусный сервер. Для этого реализуем советующий сервис на бонусном сервере
            • Если такое начисление есть, то записывает в оповещение признак наличия реакции и ID операции начисления (на всякий случай).
            • Если начисления нет, то проверят сколько дней прошло с момента отправки оповещения. Если больше 14, то записывает в оповещение признак, что реакции нет.
          • Если вид оповещения birthdayinvite 
            • Находит первый закрытый заказ клиента, после даты отправки оповещения
            • Если такой заказ есть, то записывает в оповещение признак наличия реакции и UID заказа (для отчётов)
            • Если такого заказа нет, то проверят сколько дней прошло с момента отправки оповещения. Если больше 14, то записывает в оповещение признак, что реакции нет.
  • Для реализации оповещений необходимо знать дату последнего заказа клиента. Для этого при закрытии заказа, прописываем в карточку клиента дату последнего заказа
    • Добавляем служебную процедуру, которая прописывает во всех клиентов дату последнего заказа. Без передачи по почте.

Виды оповещений

Предложение оставить отзыв feedback

Каждый день с 11:00 по 22:00, Юпитер каждый час, отбирает закрытые заказ на доставку у которых источник заказа = Сайт, Приложение или Новое приложение, в которых указан клиент и по которым не было отправки оповещения. По каждому заказу формирует и отправляет оповещение с текстом: "Все понравилось? Оцени заказ и получи 50 баллов!" "Все понравилось? Оцени заказ в приложении и получи 100 баллов!". Прописывает в заказ признак, что оповещение отправлено. Делает запись в таблице оповещений. Команду на начисление бонусов отправляет мобильное приложение с указанием ключа feedback. Юпитер сохраняет ключ в таблицу транзакций для последующих отчётов. Если клиент сделал несколько заказов в один день, то ему будет отправлено несколько сообщений (столько, сколько было заказов).

Нет активности (Приглашение) invite

Каждый день в 12:00 (чтобы всем было комфортно), Юпитер отбирает всех клиентов, чей последний заказ был больше чем 4 недели и меньше чем 3 месяца назад, и у которых не стоит признак, что оповещение о неактивности отправлено. Для каждого клиента, псевдослучайным образом выбирается одно из возможных действий:

  1. Юпитер получает текущее кол-во бонусов у клиента. Если кол-во бонусов> 0, то отправляет оповещение с текстом "На счету {текущий_баланс} бонусов! Потрать их в новом заказе". Где {текущий_баланс} это текущее кол-во бонусов. Если текущее кол-во бонусов <= 0, то вместо отправки выполняет действие № 2.
  2. Юпитер начисляет клиенту 100 временных бонусов, которые сгорают через 2 недели с момента начисления (если их не потратить). Отправляет оповещение с текстом "Как насчет подарков? Дарим 100 бонусов на 2 недели".
  3. Юпитер отправляет оповещение с текстом "Как насчет скидки? -10% по промокоду PRO10".

В клиента прописывается признак, оповещение о неактивности отправлено.

Юпитер отбирает всех клиентов, чей последний заказ был больше чем 2 недели и меньше чем 4 недели назад, и у которых не стоит признак, что оповещение о неактивности отправлено. Для каждого клиента, псевдослучайным образом выбирается одно из возможных действий:

  1. Юпитер получает текущее кол-во бонусов у клиента. Если кол-во бонусов> 0, то отправляет оповещение с текстом "На счету {текущий_баланс} бонусов! Потрать их в новом заказе". Где {текущий_баланс} это текущее кол-во бонусов. Если текущее кол-во бонусов <= 0, то вместо отправки выполняет действие № 2.
  2. Юпитер начисляет клиенту 100 временных бонусов, которые сгорают через 2 недели с момента начисления (если их не потратить). Отправляет оповещение с текстом "Как насчет подарков? Дарим 100 бонусов на 2 недели".

В клиента прописывается признак, оповещение о неактивности отправлено.

Предложение заполнить анкету profile

Каждый 1ый день месяца, в 12:30. Юпитер отбирает всех клиентов, которые делали заказ в прошлом месяце, у которых не указан ДР, и у которых не стоит признак, что была отправка данного оповещения в прошлом месяце. По каждому клиенту формирует и отправляет оповещение с текстом "Привет! Заполни дату рождения у себя в профиле и получи 100 бонусов на счет!". В клиента прописывается признак, что ему отправлен данный вид оповещения в прошлом месяце.

Поздравление с ДР birthday

Каждый день в 13:00, Юпитер отбирает всех клиентов, у которых будет ДР в ближайшие 14 дней и у которых не стоит признак, что данный вид оповещения уже отправлен в текущем году. Для каждого клиента, псевдослучайным образом выбирается одно из возможных действий:

  1. Юпитер отправляет оповещение с текстом "У вас скоро день рождения: дарим скидку 15% на всю следующую неделю". Для реализации этого действия, нужно доработать систему скидок. Добавить новое условие применения скидки: если у клиента д/р было не более 7 дней назад. Настраиваем, что применять эту скидку автоматически (только если заказ делается в Юпитере). Сайт и приложения делают это сами.
  2. Юпитер начисляет клиенту 500 временных бонусов, которые сгорают через 2 недели с момента начисления (если их не потратить). Отправляет оповещение с текстом "С Днем рождения! Дарим 500 бонусов на 2 недели".

Успей потратить

Отказались от данного вида оповещений. Не реализуем. Юпитер отправляет оповещение с текстом "На счету 1000 бонусов, успей потратить до 1.06", "На счету 1000 бонусов, сделай любой заказ до 1.06 или баланс обнулится"

Сохрани ранг

Отказались от данного вида оповещений. Не реализуем. Юпитер отправляет оповещение с текстом "Ваш кэшбэк 10%. Закажи на 1345 р. до 1.06, чтобы сохранить ранг"

 

Взаимодействие с сайтом

Юпитер передает оповещение через POST запрос. Пример:

POST /bonus/send-sms.html?key=key HTTP/1.1
Content-Length: 35
Host: www.pronto24.ru
Content-Type: application/x-www-form-urlencoded

phones=89091582149&text=ya.password

Успешный ответ:

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 31 Oct 2019 14:10:39 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.0.13
Strict-Transport-Security: max-age=31536000;includeSubDomains
Content-Encoding: gzip

{"mesages_sent":1}

 

Действия по оповещениям

Посмотреть можно в Администратор системы-Служебные процедуры (Осторожно!)-Рассылка сообщений клиентам-Таблица сообщений

image-1681976590918.png

image-1681976594951.png


Система JUPITER                                 www.jupiter.systems                                 (с) 2024г.