Все началось с кофейни рядом с домом. Там была очень простая программа лояльности: покупаешь чашку кофе - на их визитке ставят печать. Собираешь 7 печатей и можешь поменять визитку на бесплатную чашку. Проблема была в том, что со временем эти визитки оказывались везде [, где они не нужны], в разных карманах разных курток, в кошельке, в рюкзаках и сумках, и на каждой оказывалось 1-2-3 печати. Когда они начинали мешаться - отправлялись в мусорку. При этом позиция кофейни была твердая и возможно даже правильная, собрать 7 печатей нужно было на одной визитке, а не на разных. Но это было неудобно. И не единожды я становился свидетелем споров из-за этого правила.
Дисклеймер 1: Без рейтинга, прошу поднять пост. Сервис я публикую в открытый доступ и ничего с этого не получаю - просто хочется, чтобы больше тех, кому он может понадобиться, о нём узнали.
Дисклеймер 2: "Открытый доступ" означает, что любой человек может зайти на GitHub, посмотреть код, запустить у себя или предложить улучшения.
Дисклеймер 3: Несмотря на то, что в посте я в основном пишу о кофейнях, сервис я всё таки считаю универсальным. Почему так — в конце поста.
По моему мнению, и для бизнеса эти визитки являются не лучшим решением. Нет никакой интерактивности, такие карточки меняются в лучшем случае раз в квартал, но скорее, только тогда, когда закончится тираж с существующим дизайном. Из этого вытекает следующая проблема: сложно использовать в маркетинге. Через них не получится сообщить клиенту о новинках, акциях или сезонных предложениях. А еще цена. Каждая визитка стоит денег, и либо ты тратишь "немного" печатая небольшой тираж, но теряя на цене каждой, либо экономишь на цене штуки, но сразу тратишь заметную сумму на печать нескольких тысяч штук. И я почти уверен, что подобные визитки нигде и никогда не учитываются, а значит предприимчивый наемный сотрудник может использовать их для злоупотреблений, начиная от раздачи заранее заполненных визиток своим друзьям, и заканчивая подменой налички из кассы такими визитками.
Однажды мне стало любопытно, почему не перейти на какой-то цифровой сервис, который позволил бы решить проблему? Беглый гуглеж показал, что такие сервисы есть, и их много, но у всех есть какие-то недостатки. Какие-то уже не поддерживаются, для каких-то требуется дополнительное оборудование в виде ПК и монитора, а какие-то еще до начала использования, требуют от 15 до 30 тысяч за интеграцию. Тогда у меня родилась мысль, о том, что можно сделать свой сервис с пасьянсом и мадемуазелями без описанных недостатков.
Первые шаги
Я решил поделиться мыслями с подругой, которая в то время подрабатывала в другой кофейне. Она вела телеграм-канал кофейни и пожаловалась на проблему: в той кофейне условием участия в программе лояльности, была подписка на их канал в телеге. Но из-за отсутствия какой-либо автоматизации, баристе приходилось "вручную" проверять, что покупатель действительно подписан, а это занимало время. По вечерам, во время наплыва гостей, такие задержки порой приводили к негативу. Тогда определилось первое требование к сервису, который я собирался разработать "возможность автоматически проверять, что пользователь является подписчиком телеграм-канала". Очевидно, что такую проверку проще всего реализовать с помощью телеграм-бота. Другое требование, это простота реализации и использования, без необходимости использования (и приобретения) дополнительного оборудования. Какие-то кофейни могут быть ограничены финансово, у кого-то может не быть лишнего пространства. Ну и само использование сервиса должно занимать минимум времени, что бы не создавать очереди. Тогда разработка сервиса мне казалась приключением на 20 минут, вошли и вышли... Что ж, я никогда так не ошибался.
В первую очередь я решил, что проще всего, для управления и взаимодействия с сервисом будет использовать смартфон, хоть личный, хоть рабочий. Что бы не провоцировать приступы паранойи у сотрудников, я не буду использовать никакие приложения, которые нужно было бы загружать и устанавливать, очевидным выбором остается веб сайт. Со стороны гостя будет использоваться телеграм бот. Во времена, когда я начинал разработку ни о каких блокировках телеги и мыслей не было, напротив, многие госучреждения заводили там свои каналы. Тогда возник вопрос, как связать сотрудника и гостя, что бы подтверждение покупки происходило быстро, надежно и безопасно? В голову пришел QR код, в который можно зашить хоть ссылку, хоть код, да и любой текст. Ну что ж, звучит как план.
Что бы не растягивать пост, я пока опущу технические детали. Если возникнут вопросы, отвечу на них в комментариях или следующем посте.
Почти сразу появилась идея использовать QR код с чека. Однако подобное решение привело бы к множеству костылей, начиная от разных видов касс, и заканчивая механизмами валидации. И я решил, что QR код должен находиться на территории, которую я контролирую. Очевидно, что он должен быть на сайте, который будет использоваться сотрудником. Тогда я добавил на сайт страницу, которая собирает из уникального ключа заказа и ссылки на бота QR код, при сканировании которого открывался бы диалог с ботом. Потом я научил бота использовать этот ключ для связи заказа с клиентом, который его использует. Несмотря на то, что вся разработка велась с использованием telegram бота, из-за блокировок, в примерах здесь и далее будет использоваться vk бот.
Вертикальные видео на пикабу выглядят не очень и сильно растягивают пост. Потому сюда я положу скриншоты. Сами видео с работой сервиса есть в паблике в вк раз и два
Примерно в этот момент, в голову пришла мысль, о том что этот сервис может стать простейшей системой учета, и как минимум позволит контролировать кол-во заказов выполненных разными сотрудниками.
Сотрудники и доступы
На этом этапе работы я добавил страницы для создания и изменения сотрудников, и просмотра списка сотрудников. Как мне показалось, для начала достаточно простого разделения ролей:
Сотрудник может создавать новые заказы, выдавать награды и просматривать свои заказы.
Управляющий может все тоже самое + управлять сотрудниками, просматривать все заказы, и работать с отзывами (о них ниже)
Что бы не собирать персональные данные (номер телефона/email), аутентификацию построил так:
Управляющий создаёт учётку с временным паролем.
Сотрудник входит и меняет пароль на постоянный.
Если забыл — управляющий "сбрасывает" пароль, и процесс повторяется.
Видео с примером создания сотрудника тык
Заказы и аналитика
Далее, я добавил страницу со списком заказов. Уже в этот момент можно начинать вести простейшую аналитику. Можно оценивать кол-во заказов в день и их зависимость от дня недели или баристы, распределение в течение дня, долю заказов с использованием системы лояльности, долю вознаграждений среди всех заказов. Зная примерный расход материалов на один заказ, можно прогнозировать как скоро придется их закупать, или контролировать, что бы сотрудники не продавали напитки "мимо кассы".
Очевидно, что если заказ можно создать, то это можно сделать случайно, или по ошибке. Для таких ситуаций реализована возможность удаления заказа. Однако, для сохранения целостности данных, этот заказ не удаляется полностью, а только помечается удаленным. При этом он не отображается в списке заказов, который доступен сотруднику, но будет доступен к просмотру из списка заказов, которые доступны управляющему, вместе с причиной удаления.
Как спасти рейтинг
Спустя какое-то время появилось понимание, что работа с отзывами так же должна быть компонентом сервиса. В среднестатистической кофейне, повезёт если бариста предложит оставить отзыв о работе одному из десяти клиентов. При этом, если опыт посещения был негативным, клиенту обычно не где этим поделиться, кроме как на картах. И вот у кофейни рейтинг меньше трех звёзд. Для решения этой проблемы в бота был добавлен диалог, запрашивающий после привязки заказа обратную связь. В ходе диалога бот выясняет все ли клиенту понравилось, и если да, предлагает перейти по ссылке и оставить отзыв на картах. Если клиент остался недоволен, бот предлагает описать проблему. Таким образом получается позитивно влиять на оценку на карте сразу с двух направлений. Во первых, при позитивном опыте, каждый посетитель, после каждого заказа, получает предложение поделиться отзывом, что должно увеличить кол-во 4 и 5 звезд. Во вторых, при негативном отзыве, посетитель может оставить его в боте, и выплеснув негатив, он не пойдет писать тоже самое и на карте, то есть количество низких оценок должно уменьшиться. При этом все негативные отзывы, которые оставляют клиенты, доступны в отдельном списке, и имеют интерфейс для работы с ними. При ответственном отношении это позволит оперативнее решать возникающие проблемы, отслеживать их и систематизировать.
Видео с примером того как выглядит запрос отзыва тык
Почему это универсально
Примерно в этот момент я задумался о том, что сервис не обязан быть завязан только на кофейни, его можно использовать и в других видах продаж. И сейчас с кофейнями он связан только шаблонами текстов в боте. Но при небольшом изменении, например:
"Поздравляем! При следующем заказе вы можете получить "
"бесплатную чашку кофе!"
"Поздравляем! При следующем заказе вы можете получить "
"скидку на хотдог!"
позволит использовать сервис в фудтраке. Шаблонов там достаточно много, но почти любая нейронка сможет их актуализировать без каких-то сложностей.
Да, есть и другое ограничение. Прямо сейчас в сервисе реализована только одна программа лояльности "делаешь n покупок -> получаешь награду (скидку)", но если появится потребность Можно достаточно просто реализовать и другие, например "при накоплении кол-ва или суммы покупок Х% скидки" (можно даже прогрессивную шкалу), или например "делаешь покупки раз в n дней, и размер скидки увеличивается, не делаешь - уменьшается".
Где потрогать и как поучаствовать
Исходный код проекта и документация опубликованы на GitHub. Если вы разработчик, и вас заинтересовал проект - буду рад участию.
Если кому-то интересно пощупать интерфейс сайта, он доступен по ссылке: loyalty-machine.ribeyra.ru
Логин: pikabu
Пароль: Pikabu2026
Данные на демо сайте сбрасываются каждые 15 минут.
Бот доступен через QR код на сайте или тут
С идеями, предложениями или по поводу сотрудничества, можно писать мне в вк или на почту
Всех остальных я приглашаю к обсуждению в комментариях