Что болело до запуска
Селлер видит в кабинете маркетплейса выручку. Прибыль он считает сам, в таблице. Эту боль мы вынесли прямо на страницу и отрисовали макет таблицы на 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 нигде не проверяется, поэтому при её падении пользователь увидит зелёную галочку, а лида в системе не будет.
