Что болело до сайта

Vivid монтирует видеонаблюдение, СКУД, сигнализацию и умный дом в Петербурге и Ленобласти. Своей площадки в интернете у компании не было. Человека из поиска приводить было некуда.

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

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

Каркас: 14 страниц, которые собираются из одного места

Сайт сделали с нуля. В истории репозитория 23 коммита с 25 июля по 3 августа, то есть примерно 10 календарных дней. Структура получилась такая:

Страницы не пишутся руками. Шапка, подвал и служебный заголовок лежат в одном месте, небольшой сборщик на Python подставляет в них контент конкретной страницы и раскладывает результат по папкам. Адреса получаются чистые, вида /videonablyudenie/dlya-dachi/, без .html на конце. Правка в шапке применяется сразу ко всем 14 страницам.

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

  • главная и хаб «Видеонаблюдение», разведённые по смыслу запроса
  • 6 посадочных под тип объекта: дом, дача, квартира, магазин, офис и склад, жилой комплекс
  • СКУД, сигнализация, умный дом
  • цены, контакты, о компании и юридические страницы
!
Форма показывала «принято», а лид терялся

Первая версия формы мгновенно подменяла себя на «Заявка принята». Выглядело аккуратно, только парсер лидов не успевал снять поля из события отправки, и заявка пропадала. На экране при этом горела зелёная галочка, то есть потерю не видел никто: ни посетитель, ни менеджер. Форму притормозили. Теперь 600 мс она держится в состоянии «Отправляем…», за это время поля успевают уйти в обработку.

Первый экран и разговор про аренду

Первый экран сделали интерактивным: монитор наблюдения с переключателем День и Ночь, карта объектов по Ленобласти с карточками, калькулятор стоимости по типу объекта и числу камер. Посетитель получает порядок цены ещё до звонка.

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

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

Заявка: как лид доходит до менеджера

Сайт статический, серверного кода на нём нет. Токен телеграм-бота в скрипт страницы вшивать нельзя: он окажется в открытом исходнике, который видит любой посетитель. Поэтому форма отправляет телефон POST-запросом на серверный endpoint, где ключи лежат закрыто. Оттуда заявка уходит в телеграм и во внутреннюю CRM. В браузере не остаётся ничего чувствительного.

Параллельно ту же заявку снимает парсер коллтрекинга. Готовый виджет сервиса поставить как есть не вышло: он ронял оценку скорости, и его вырезал сканер безопасности на нашем сервере, который проверяет страницы на посторонние скрипты и чужие CDN. Виджет грузим динамически уже после загрузки страницы, адрес получаем отдельным запросом с бренд-домена. В коде страницы посторонних доменов нет вообще. Подмену номера под коллтрекинг написали своим скриптом.

Дальше выяснилось неочевидное. Если ради скорости отсечь все headless-браузеры, то есть браузеры без окна, ломается проверка кода в личном кабинете коллтрекинга: их собственный проверяльщик ходит именно headless и рапортует, что код на сайте не найден. Фильтр сузили до ботов PageSpeed, Lighthouse и SEO-сканеров, headless пропускаем.

Грабли

Дольше всего чинили выпадающее меню «Услуги». Оно исчезало ровно в тот момент, когда курсор шёл к нужному пункту. Между кнопкой и панелью был зазор в 23 пикселя, а невидимый CSS-мостик, который обычно закрывает такой разрыв, срезался свойством overflow:hidden у родителя. Стилями победить не удалось, сделали честно на JS: меню держится открытым 240 мс после ухода курсора, за это время рука спокойно доходит.

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

Мелочи, которые стоили индексации. Яндекс.Вебмастер ругался на фавикон: робот запрашивает /favicon.ico в корне, а лежал только SVG, добавили ico и набор PNG. Стеклянная шапка на светлом дневном фото выглядела серой и грязной, сделали её всегда тёмной поверх героя. Из подвала убрали демо-адрес, который успел попасть в разметку со времён заглушек.

Отдельная история для поиска: главная и хаб /videonablyudenie/ начали конкурировать друг с другом. Развели по интенту. Главная стала зонтичной, про бренд и все услуги сразу. Хаб забрал транзакционный запрос про установку видеонаблюдения и стал родителем шести подстраниц.

Скорость, разметка и запуск без готовых фото

На старте мобильный PageSpeed был 74, LCP 4,7 секунды. Первый экран разобрали по килобайтам.

Под поиск и под ответы нейросетей сделали разметку: 2 или 3 блока JSON-LD на каждой странице, llms.txt с ценами и разделами, robots.txt с явно открытыми AI-краулерами, sitemap. По 152-ФЗ закрыли cookie-баннер, политику и согласие, обязательный чекбокс стоит на всех 14 формах.

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

  • ночное фото грузится только при клике на «Ночь»: минус 140 КБ
  • Яндекс.Метрика загружается отложенно: минус 86 КБ JS с критического пути
  • главная картинка на мобильном 64 КБ вместо 145 КБ, отдельным адаптивным вариантом
  • две картинки блока сравнения пережаты под реальный размер контейнера: 41 КБ в 14 КБ и 31 КБ в 8,8 КБ
  • критический CSS вклеен прямо в страницу, браузеру нечего ждать перед отрисовкой
  • убран горизонтальный скролл на экране 320 px, кнопки доведены до 44 px, контраст подпунктов меню поднят с 3,24:1 до 7:1

Частые вопросы

Сколько времени занимает разработка сайта для компании по видеонаблюдению?

Сайт Vivid собрали за 10 календарных дней: 23 коммита с 25 июля по 3 августа. За это время сделали 14 страниц, форму заявки и разметку под поиск. Стартовали без готовых фотографий клиента, на временных изображениях.

Зачем делать отдельные страницы под тип объекта: дача, магазин, жилой комплекс?

Заявки в этой нише идут по узким запросам. Человек ищет видеонаблюдение для дачи или для магазина. Общая страница на все случаи такие запросы не забирает. У Vivid под тип объекта сделано 6 посадочных, у каждой свой FAQ, всего 35 вопросов.

Как объяснить клиенту разницу между покупкой видеонаблюдения и арендой камер у оператора?

На сайте Vivid для этого стоит отдельный блок сравнения. Аренда на входе выглядит дешевле: небольшой платёж каждый месяц, архив в облаке на несколько дней, оборудование остаётся чужим. Блок за минуту показывает, за что человек платит ежемесячно и что остаётся у него в собственности.

Как отправлять заявки с сайта в телеграм, если сайт статический?

Токен бота нельзя вшивать в скрипт страницы: его увидит любой посетитель в исходном коде. У Vivid форма отправляет телефон POST-запросом на серверный endpoint, ключи лежат там закрыто. Оттуда заявка уходит в телеграм и во внутреннюю CRM. В браузере ничего чувствительного не остаётся.

Можно ли запустить сайт, пока клиент не прислал фотографии объектов?

Да. Каждое фото подключено слотом: нет файла с нужным именем, блок тихо прячется и вёрстка остаётся целой. Сайт Vivid запустили на временных изображениях и подменяли их по мере поступления. 3 августа демонстрационные объекты заменили на реальные: склад на 13 камер, стройка бизнес-центра, эко-парк на 16 камер.