Что болело до запуска
Селлер видит в кабинете маркетплейса выручку. Прибыль он считает сам, в таблице. Эту боль мы вынесли прямо на страницу и отрисовали макет таблицы на CSS: файл «PnL_финал_ИТОГ_v3_правки_ноябрь.xlsx», подпись «не обновлялось 3 недели», в ячейках «=B2*0.18», «???», «РУЧ», по итогам «≠ факт» и жёлтая плашка «не учтён возврат». Комиссия забита формулой наугад, логистика проставлена руками, возвраты потеряны.
Рядом шесть формулировок, по которым селлер узнаёт себя:
Наша задача была своя: сделать точку входа в воронку МП Приборки. Бесплатный аудит показывает реальные цифры, дальше разговор о подписке идёт уже предметно.
- оборот растёт, денег на счёте нет
- непонятно, какие SKU убыточны
- реклама работает, по каким карточкам она окупается, неясно
- кабинет показывает выручку, прибыль считаете сами в Excel
- непонятно, что выгоднее: FBO или FBS
- в таблице разбираетесь только вы, и только иногда
Оффер: цена разложена по работам
Аудит бесплатный. Если написать просто «бесплатно», ценность падает до нуля. Поэтому отдельной секцией показано, из чего цена собирается: выгрузка и нормализация данных 8 000 ₽, расчёт PNL по каждому SKU 10 000 ₽, разбор юнит-экономики 8 000 ₽, презентация и план действий 6 000 ₽. Сумма сходится ровно в 32 000 ₽. Следующей строкой стоит «Вы платите 0 ₽».
Состав аудита виден уже в первом экране, тремя шагами: PNL по каждой карточке, юнитка отдельно для WB и Ozon, план на 3 месяца с ответом, что убрать и что масштабировать.
Три бонуса остаются у селлера даже при отказе от подписки: 14 дней доступа к МП Приборке, шаблон юнит-экономики в Excel под Ozon и WB, чек-лист «20 точек утечки маржи». Отказ перестаёт быть обидным.
Любое аналитическое поле, которое собирает браузер, дублируем на сервере из заголовков запроса. И считаем заявку принятой только после того, как её подтвердили все получатели, включая CRM.
Лид квалифицируется до звонка
Условие входа написано под кнопкой в первом экране и повторено в оффере: оборот от 1 млн ₽/мес на Ozon или WB, от 3 месяцев продаж. Это отсекает тех, кому аудит пока нечего показать.
Форма спрашивает четыре вещи: имя, телефон, роль и оборот. Роль выбирается из четырёх вариантов, оборот из трёх ступеней (1-5 млн, 5-30 млн, более 30 млн). Обработчик разворачивает коды в читаемый текст, поэтому в CRM и в уведомление падает «Собственник · 5-30 млн р» вместо сырых значений формы.
Вместе с заявкой уезжают все пять UTM-меток. Их снимает фронт из адресной строки. Менеджер видит источник до первого звонка.
Как это устроено
Один статический index.html, из них 904 строки инлайнового CSS в head. Никакого фреймворка, бандлера и node_modules. Файл кладётся на сервер и работает. Выкатка идёт push в GitHub, дальше сервер сам забирает изменения по крону.
Заявка уходит POST-запросом с JSON-телом на небольшой PHP-обработчик. Он пускает только POST, режет тело больше 10 000 байт, валидирует имя и телефон, дублирует лид в нашу CRM и шлёт уведомление в рабочий чат Telegram. Экран успеха обещает связаться сегодня, с 10:00 до 19:00 МСК.
Юридический контур сделан целиком: политика на 11 разделов, cookie-баннер с запоминанием согласия, чекбокс и реквизиты оператора в футере. Отдельный скрипт держит кнопку отправки выключенной, пока галочка не проставлена, и подставляет в форму скрытое поле с ISO-датой. То есть у нас остаётся точное время, когда согласие дали. Поверх этого стандартная SEO-обвязка: canonical, Open Graph с картинкой 1200×630, JSON-LD типа Service, robots.txt и sitemap.xml.
Грабли
Посадочная страница не доходила до CRM. Фронт кладёт в тело запроса имя, телефон, роль, оборот и UTM. Поле с адресом страницы он не отправляет вообще, а сервер его ждал. В итоге у лидов с лендинга поле посадочной было пустым: метки есть, страница неизвестна. Починили 10 июля на сервере. Если поле пустое, PHP разбирает заголовок Referer и собирает адрес заново из схемы, хоста и пути, отбрасывая хвост с UTM, чтобы одна страница не размножилась на сотню вариантов. Урок общий: поле для аналитики, которое собирает браузер, требует серверного фолбэка из заголовков. Заявки-то приходят, поэтому потерю источника долго никто не замечает.
Картинки не оптимизированы, и это самая дорогая проблема страницы. Грузится около 7,1 МБ PNG, тяжелее всего дашборд на 3,0 МБ и фото в первом экране. Ни у одного тега img нет width, height и ленивой загрузки. Отсюда скачок вёрстки и тяжёлый первый экран. Для страницы под платный трафик это прямые потери конверсии. Лечится без переделки дизайна: WebP, размеры в атрибутах, lazy на всё ниже первого экрана.
Успех заявки завязан только на Telegram. Запись в CRM сделана по схеме «выстрелил и забыл», её результат нигде не проверяется. Если CRM приляжет, пользователь всё равно увидит зелёную галочку, менеджер получит сообщение в чат, лида в системе не будет. Знакомый сценарий ложного «сохранено». Минимум здесь: логировать неуспешный ответ CRM так же, как уже логируется Telegram.
Что ещё в списке на исправление:
- 12,8 МБ мёртвого веса в репозитории: старые копии фотографий команды переименовали в латиницу, оригиналы забыли удалить
- форма ничем не защищена от автоматических заявок: ни honeypot, ни лимита по частоте с одного IP, ни проверки Origin
- в первом экране заявлено «более 8 лет» опыта, в секции команды «4 года ведём управленческий учёт». Две цифры в одном скролле, внимательный лид споткнётся
- документации в проекте нет вообще: тот, кто придёт править лендинг через полгода, восстановит логику только чтением кода
Частые вопросы
Зачем показывать цену, если аудит бесплатный?
Слово «бесплатно» само по себе обнуляет ценность в глазах селлера. Поэтому отдельной секцией показано, из чего складываются 32 000 ₽: выгрузка и нормализация данных 8 000 ₽, PNL по каждому SKU 10 000 ₽, разбор юнит-экономики 8 000 ₽, презентация и план действий 6 000 ₽. Следующей строкой идёт «Вы платите 0 ₽».
Как лендинг отсекает нецелевые заявки?
Условие входа написано прямо под кнопкой первого экрана и повторено в оффере: оборот от 1 млн ₽ в месяц на Ozon или WB, от 3 месяцев продаж. Форма спрашивает четыре вещи: имя, телефон, роль и оборот, оборот выбирается из трёх ступеней. Обработчик разворачивает коды в читаемый текст, поэтому в CRM падает «Собственник · 5-30 млн р» вместо сырых значений формы.
Как понять, откуда пришёл лид, до первого звонка?
Вместе с заявкой уезжают все пять UTM-меток, их снимает фронт из адресной строки. Адрес посадочной сначала терялся: браузер это поле не отправлял, а сервер его ждал. Починили 10 июля, теперь PHP собирает адрес заново из заголовка Referer и отбрасывает хвост с метками. Урок забрали в правила: аналитическое поле, которое собирает браузер, дублируем на сервере.
Нужен ли фреймворк для такой посадочной?
Нет. Весь лендинг это один статический index.html на 1598 строк, из них 904 строки CSS лежат прямо в head. Ни бандлера, ни node_modules: файл кладётся на сервер и работает. Выкатка идёт через push в GitHub, дальше сервер сам забирает изменения по крону.
Что чаще всего мешает такой странице под платный трафик?
На этой странице две вещи. Первая: около 7,1 МБ картинок в PNG, самый тяжёлый дашборд весит 3,0 МБ, у тегов img нет width, height и ленивой загрузки, отсюда скачок вёрстки и медленный первый экран. Вторая: успех заявки завязан только на Telegram, ответ CRM нигде не проверяется, поэтому при её падении пользователь увидит зелёную галочку, а лида в системе не будет.
