Перейти к основному содержимому
megapromotingДавайте обсудим

Решения · Рестораны и HoReCa

Меню по QR-коду, которое читается на телефоне, в полумраке, на трёх языках — и не ставит ни одного cookie.

Меню заведения — это не брошюра: в нём цены и объёмы должны быть точными, оно часто меняется и читается людьми, говорящими на трёх языках. Мы строим меню как данные, генерируем страницу из них и проверяем перед каждой публикацией, в том числе что цены идут вниз в каждой категории и что каждая фотография существует.

Уже построеноDouă meniuri digitale în producție, verificabile din exterior azi. Primul: 119 produse în 21 de categorii, cu preț, volum, compoziție și fotografie, plus câte un text scurt de prezentare și un set de recomandări de asociere pentru fiecare produs; generatorul are 402 linii, iar verificarea dinaintea publicării are 233 de linii și 16 blocuri. Al doilea, site-ul-soră cu același motor: 146 de produse în 31 de categorii, generator de 377 de linii, verificare de 210 linii cu 14 blocuri, iar integrarea continuă regenerează pagina din surse și respinge modificarea dacă rezultatul diferă de fișierul din depozit. Ambele răspund 200 și niciunul nu pune vreun cookie — verificat de mine pe 06.09.2026. Spunem și că sunt două lucrări cu același motor și același proprietar, nu două lucrări independente.

Отсканированный PDF по QR-коду не решает ничего из того, что заведение должно решать. В нём нельзя искать, он не переводится, на телефоне не масштабируется нормально и его нельзя изменить без повторной печати кода. А меню часто меняется: кухня убирает блюдо, бар получает другой бренд, цена позиции растёт. Меню — это набор данных, который меняется еженедельно, а не документ, напечатанный один раз.

Поэтому мы рассматриваем его как данные. Реальные источники — это несколько структурированных файлов: товары, описательные тексты, рекомендации по сочетанию, переводы, — а написанный на Python генератор собирает из них одну страницу. В одном из заведений: 119 товаров в 21 категории, каждый с ценой, объёмом, составом и фотографией, плюс 119 коротких текстов и 119 наборов «с чем сочетается». В другом: 146 товаров в 31 категории. Страница не редактируется напрямую — она пересобирается.

Перевод не ограничивается кнопками. Румынский — основа, а русский и английский покрывают категории, наименования, объёмы, составы, 82 ярлыка вкуса и все описательные тексты. В городе, где соседний стол заказывает на другом языке, меню, переведённое наполовину, раздражает сильнее, чем непереведённое: оно заставляет думать, что вы можете прочитать всё.

Часть, которую мы считаем самой важной и которую никто не просит в брифе: корзина, список избранного и разделение счёта работают в браузере, без аккаунта и без сервера, а сайт не ставит ни одного cookie и не запрашивает ничего у стороннего домена. Это не обещание из политики конфиденциальности — это правило, заданное автоматическими проверками, которые запускаются перед каждой публикацией и отклоняют изменение, если появился какой-либо трекер, какой-либо внешний ресурс или какой-либо шрифт, взятый у кого-то ещё.

Что входит

Что конкретно меняется в ресторанах и horeca

Меню — это набор данных, а страница генерируется из него

Товары, презентационные тексты, рекомендации и переводы хранятся в структурированных файлах; генератор, написанный на Python — 402 строки в одном локале, 377 в другом — собирает из них одну страницу. Опубликованная страница не редактируется вручную; когда кто-то это делает, это ловит непрерывная интеграция, потому что она заново генерирует страницу и сравнивает результат.

У каждой позиции есть цена, объём, состав и фотография

В баре объём — часть цены: одно и то же название на 40 и на 100 миллилитров — это два разных продукта, а клиент, который не видит объём, думает, что ему сказали другое. Структура данных держит все четыре поля как обязательные, а не как необязательные, именно для того, чтобы неполная позиция не попала на стол.

Три языка, до последней вкусовой метки

Перевод охватывает интерфейс, категории, названия, объёмы, составы, 82 вкусовые метки и все короткие презентационные тексты, при этом у каждого румынского ключа есть пара на русском и английском. Одна из проверок перед публикацией не проходит, если меню не полностью во всех трёх языках.

Корзина, избранное и разделение счёта работают в браузере

Без аккаунта, без сервера, без передачи данных куда-либо. Клиент собирает свой заказ на телефоне и показывает его официанту или использует для разделения счёта. Техническое следствие: нет базы с тем, что заказали ваши клиенты, потому что она не создаётся.

Ноль cookie и ничего от сторонних доменов

Проверено извне: ни одного cookie-заголовка ни на одном из двух сайтов, а политика содержимого одного из них не допускает абсолютно ничего извне. Шрифты размещены на том же домене, а не у внешнего сервиса. Единственные внешние адреса на странице — ссылки на социальные сети заведения, на которые нажимает посетитель, а не вызывает страница.

Проверки перед каждой публикацией, включая скучные

Шестнадцать блоков проверки в одном локале, четырнадцать в другом: без отслеживающих скриптов, без автоматически загружаемых ресурсов от третьих сторон, шрифты на собственном хостинге, действительные структурированные файлы, каждая фотография существует, меню полностью на трёх языках, структурированные данные на странице действительны и — то, что удивляет всех — цены по каждой категории идут по убыванию. Неправильно введённая цена видна как разрыв в порядке списка, а не по жалобе клиента.

Опубликованная страница всегда соответствует источникам

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

Серверные журналы не сохраняют полные IP-адреса

В серверной конфигурации одного из локалов: маскирование IP-адресов, удаление заголовков идентификации из журнала и ограниченное хранение, с явной отсылкой к принципу ограничения хранения. Непрерывная интеграция отклоняет изменение, если из конфигурации исчезают эти строки — значит, защиту нельзя тихо потерять при смене сервера.

Чего не делает цифровое меню

Не принимает заказ на кухне и не подтверждает бронь: для этого нужна связь с операционной системой заведения, а это отдельная работа. И мы не публикуем функции, которые обещают то, что должно быть исполнено на кассе — скидка типа «happy hour» или график кухни не запускаются без письменного согласия заведения, потому что за обещание на экране платит человек у стойки.

Traseul

Как запрос проходит через систему.

01

Мы структурируем меню до того, как что-либо рисовать

Первая поставка — это меню как данные: категории, позиции, цена, объем, состав, фотография. Здесь же выявляются и недочеты — позиции без объема, категории, которые на самом деле являются двумя, продукты без фотографии. Цифровое меню, построенное на неполных данных, выглядит неполным, как бы хорош ни был дизайн.

02

Переводим все, а не только интерфейс

Категории, названия, объемы, составы, вкусовые метки и презентационные тексты получают свои пары на русском и английском. Мы поставляем полное меню на трех языках и автоматическую проверку, которая падает, если какой-то ключ остается непереведенным.

03

Ставим проверки до первой публикации

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

04

Автоматическая публикация из репозитория, с копией предыдущей версии

Публикация происходит при слиянии изменения, после того как непрерывная интеграция заново сгенерировала страницу и сравнила ее с источниками, и после того как была сохранена копия предыдущей версии. Мы передаем доступы и процедуру отката — а не только запущенный сайт.

1Fișiere de date(produse, texte,asocieri, traduceri)2generator Python3o singură pagină416 verificări(urmăritori, terți,fonturi, fotografii,trei limbi, prețuridescrescătoare)5publicare automată,cu copie a versiuniianterioare
Traseul, în 5 pași

Данные

К чему прикасаемся, где оно лежит и сколько остаётся

Правила различаются от отрасли к отрасли. Это те, что применяются в ресторанах и horeca.

Ничего о клиенте не собирается
Без аккаунта, без cookie, без трекеров, без ресурсов, запрашиваемых с доменов третьих сторон. Корзина и избранное живут в браузере посетителя. У нас и у заведения нет списка того, что кто-то просмотрел в меню — не потому, что мы его удалили, а потому, что он не создается.
Что остается в журналах сервера
Обычные запросы веб-сервера, с замаскированным IP-адресом, без идентификационных заголовков, хранящиеся ограниченный срок. Они записываются в конфигурации сервера, автоматически проверяются и обоснованы принципом ограничения хранения — а не оставлены на значениях по умолчанию программы.
Меню, цены, рецепты и фотографии принадлежат заведению
Мы строим структуру, генератор и проверки. Контент принадлежит ему и меняется по его решению. Мы не публикуем ни одной цены как пример в наших материалах, даже иллюстративно.
Что происходит, когда заведение хочет еще и ассистента на странице
Можно, но это означает, что политика контента страницы должна разрешать именно этот домен и ничего больше. На одном из двух сайтов это видно снаружи: политика разрешает один внешний домен, домен ассистента. Разница между «разрешаем домен» и «разрешаем все» — это и есть весь разговор о отслеживании.
Данные бронирования, если они появляются, меняют правила
В момент, когда меню получает форму бронирования, появляются имя, телефон и время — то есть персональные данные, со сроком хранения, с местом, куда они попадают, и с кем-то, кто их видит. Тогда же пишется и опубликованная политика заведения. До этого меню — это страница, которая ничего не собирает, и проще оставить все так, если бронирования делаются по телефону.

Случай

Проверка, которая требует, чтобы цены снижались в каждой категории

Ситуация

В меню с более чем сотней позиций самая частая ошибка — не в дизайне, а в наборе: лишняя цифра в цене или позиция без фотографии. Обе обычно обнаруживаются, когда клиент показывает их официанту.

Что мы построили

Перед публикацией мы поставили скрипт проверки — 233 строки в одном заведении, 210 в другом — который запускает шестнадцать, соответственно четырнадцать блоков: что не закрался ни один трекер, что страница ничего не запрашивает у стороннего домена, что шрифты размещены локально, что файлы данных валидны и каждая фотография существует, что меню полное на всех трех языках, что структурированные данные на странице валидны и что цены снижаются в каждой категории. Отдельно непрерывная интеграция заново генерирует страницу из источников при каждом изменении и отклоняет ее, если результат отличается от опубликованного файла.

Что получилось

Опечатка в цене нарушает нисходящий порядок и останавливает публикацию, а отсутствующая фотография никогда не попадает на экран у стола. Опубликованная страница всегда соответствует данным, которые редактирует заведение, потому что иначе она не публикуется.

Чего этот случай не говорит

Проверки ловят то, что можно проверить механически. Неправильно введенная, но правдоподобная — и по порядку — цена проходит; для нее нет другого механизма, кроме как если кто-то посмотрит. В документации одного из проектов сказано «14 проверок» там, где в скрипте 16 блоков; правильная цифра — та, что в скрипте.

Вопросы

Что спрашивает кто-то из ресторанов и horeca

Можем ли мы сами менять цены и убирать блюдо из меню?

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

Почему важно, что вы не ставите cookie?

Потому что меню, которое ничего не собирает, не нуждается в баннере согласия, ему нечего утекать и нечего объяснять контролеру. Проверить это может любой: один запрос к сайту показывает, что ни один cookie-заголовок не возвращается. А политика содержания одного из заведений не допускает вообще никакого ресурса извне.

Меню может принять заказ?

Корзина работает в браузере, как список, который клиент показывает официанту или использует для разделения счета. Отправка заказа на кухню требует подключения к системе заведения и является отдельной работой, с предварительной проверкой совместимости. Мы не называем «онлайн-заказом» корзину, которая никуда не доходит.

Можем ли мы поставить «happy hour» или вечернее предложение?

Это можно построить, но мы не запускаем это без письменного согласия заведения, потому что это обещание, которое выполняется на кассе. Наше правило: функции, которые обязывают заведение перед клиентом — скидки, часы работы кухни, доступность — не публикуются на основе устной договоренности.

На скольких языках и насколько полно?

На трех: румынский как база, русский и английский. Полно означает категории, наименования, объемы, составы, вкусовые теги и тексты презентации, а не только кнопки. Автоматическая проверка падает, если меню не полно на всех трех — поэтому оно не попадает на сайт наполовину переведенным.

Как вы обеспечиваете, чтобы не появился неправильный ценник?

Среди проверок перед публикацией есть одна, которая требует, чтобы цены снижались в каждой категории. Это не коммерческое правило, а детектор опечаток: позиция, введенная с лишней или недостающей цифрой, нарушает порядок и останавливает публикацию. Остальные проверки занимаются отсутствующими фотографиями и недопустимыми файлами.

Сайт быстрый на телефоне, в локальной сети, на мобильных данных?

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

Можем добавить ассистента, который отвечает на вопросы о меню?

Да, и тогда политика контента страницы разрешает ровно эту область, ничего больше. На одном из двух локалов это видно снаружи. Стоит сказать и обратную сторону: в тот момент страница уже не «без ничего внешнего», поэтому решение принимается осознанно, а не как бонус.

У вас в портфолио два почти идентичных меню. Это две работы?

Это два сайта с одним и тем же движком, одного и того же владельца, и мы говорим об этом прямо. Заявленное функциональное различие между ними — рекомендации по сочетанию для каждого продукта, которых во втором нет. Мы могли бы представить их как независимые работы; это было бы преувеличением портфолио.

Что вы хотели бы наладить?

Расскажите о своём процессе. Вместе определим, что стоит построить, что можно подключить и как проверим результат.

Давайте обсудим