Что болело до нас
Собственник платит агентству или штатному маркетологу. Отчёт о работе присылает тот же человек, который эту работу делал. Проверить самому нечем. Остаётся два пути: разбираться в SEO и рекламном праве лично или звать второе агентство, которое заинтересовано отговорить от первого.
Параллельно сайт годами живёт с нарушениями 152-ФЗ и закона о рекламе. Владелец узнаёт о них из письма Роскомнадзора. Заранее не предупреждает никто.
Толчком стала своя же боль. 15 мая 2026 года мы вручную проверили по SEO-чеклисту собственный сайт. Работа заняла целый день и вылилась в папку из семи файлов инструкций. Вывод был простой: такую диагностику по чеклисту должна делать машина за минуты. Через двенадцать дней сели писать сервис.
Что сделали
В личном кабинете komu.marketing два рабочих инструмента: юридическая проверка сайта и SEO+GEO-аудит с обходом страниц пауком.
- Юридический движок на 8 проверок: HTTPS, политика конфиденциальности, cookie-уведомление, согласие в формах, реквизиты оператора, порядок отзыва согласия, передача данных за рубеж, маркировка рекламы
- Собственный паук: обходит страницы, ловит битые адреса, дубли title, страницы без H1 и description, картинки без alt, читает robots.txt, sitemap.xml и llms.txt
- GEO-блок: видят ли сайт нейросети. Пущены ли GPTBot, ClaudeBot, PerplexityBot и YandexAdditional, есть ли llms.txt, есть ли FAQ-разметка
- Генераторы готовых файлов: robots.txt с разрешением 14 AI-ботов, llms.txt, JSON-LD Organization и WebSite, FAQPage-разметка
- Скоринг: балл от 0 до 100, четыре уровня риска по порогам 85/60/35 и сумма штрафа только по реально проваленным пунктам
- Отчёт на печать в PDF: серверная HTML-страница с print-стилями под A4, без тяжёлой PDF-библиотеки в зависимостях
- Защита от SSRF: перед запросом резолвим DNS и блокируем восемь диапазонов приватных адресов, чтобы через форму «проверь сайт» нельзя было простучать внутреннюю сеть
Сервис складывает максимумы только по тем пунктам, которые сайт реально провалил, поэтому цифра у каждого сайта своя. Теоретический потолок, если провалены все восемь юридических проверок: 1 880 000 ₽. Это расчёт движка по своим таблицам. Юридическим заключением он не является. Статьи и вилки штрафов зафиксированы в коде в мае 2026 года и с тех пор не обновлялись.
Как это работает
Приложение на Next.js 15, данные в PostgreSQL через Prisma. Проверка идёт в два хода. Роут запуска проверяет авторизацию и лимит, создаёт запись в базе и сразу отдаёт браузеру id задачи. Дальше он же дёргает внутренний фоновый роут, закрытый служебным ключом. Получилась самодельная очередь без Redis и брокера: браузер не держит соединение, фронт просто опрашивает статус.
Юридический движок качает страницу один раз, разбирает HTML через cheerio и прогоняет по одному дереву восемь независимых анализаторов. Каждый возвращает одинаковый объект: статус, что нашли, что требует закон, ссылка на статью, вилка штрафа, рекомендация. Два анализатора ходят в сеть дополнительно: открывают саму политику конфиденциальности и ищут внутри пять обязательных разделов. Трекеры разбираются по стране размещения данных. Google Analytics, Meta Pixel, Hotjar и ещё несколько помечаются как зарубежные. Яндекс.Метрика и Jivo штрафа не дают.
SEO-движок работает в четыре стадии. Паук качает главную, снимает паспорт домена, читает robots.txt и sitemap.xml. Собирает до 500 внутренних адресов и обходит первые 16 батчами по 4 страницы, с таймаутом 10 секунд на страницу. Общее число найденных страниц считается всегда: если сайт больше, в отчёт встаёт отдельная строка про это. Молчаливой обрезки выдачи нет.
Третья стадия отдаёт модели gpt-4o-mini готовую сводку словами и просит строгий JSON: вердикт, резюме, переписанные title и description, шесть пар вопрос-ответ под тематику сайта. Эти шесть вопросов потом становятся FAQPage-разметкой. Если ключа нет или ответ битый, движок берёт заготовленный текст, и отчёт всё равно выходит полным. Все технические выводы посчитаны кодом, ИИ добавляет формулировки.
Четвёртая стадия собирает отчёт как план по срокам: A «сделать сегодня», B «на этой неделе», C «в этом месяце», D «внешний GEO». Балл считается с весами 3/2/1, внешний GEO на оценку сайта не влияет. К каждой проваленной проверке приложен готовый файл с кнопкой «Копировать». Пока фон работает, каждый шаг паука пишется в базу, браузер опрашивает статус раз в 1,2 секунды и печатает шаги в чёрное окно лога. Пользователь видит строку «сканируем 16 из 84 страниц».
Грабли
Server Actions выбросили. Авторизацию сначала написали на них. Через nginx Server Action отдавал «Connection closed.». Всё переписали на обычные HTML-формы с POST на роуты, и заработало. Файл со старыми экшенами до сих пор лежит в проекте и никуда не импортируется. Вывод на будущее: за реверс-прокси надёжнее скучный POST на роут.
Два механизма прогресса под одним именем. У юридической проверки прогресс идёт через настоящий SSE. У SEO-аудита роут называется так же, но внутри обычный JSON, а клиент опрашивает его раз в 1,2 секунды. Роут не переименовали. Следующий человек в проекте на это наступит.
Сборка падала по памяти. В конфиге стоят один процесс на сборку и оптимизация памяти, проверка типов и линт при сборке выключены. Типы гоняем локально перед деплоем. Это плата за сборку на маленьком сервере.
Очередь без подстраховки. Фоновый вызов сделан по принципу «отправил и забыл», ошибка глотается. Если процесс перезапустится в этот момент, аудит навсегда останется в статусе PENDING, ретраев нет. Для нескольких проверок в день терпимо. При росте нагрузки это первое, что надо менять.
Цена разошлась в трёх местах кода, текст разошёлся с движком: форма обещает расширенный аудит до 16 страниц, в коде лимит 100. Прайс и обещания правили в интерфейсе и забывали в комментариях. Ещё в проекте осталась пустая папка под Supabase: начали по привычному стеку, для одного сервера с одной базой взяли Prisma и чистый PostgreSQL.
Где сервис сейчас
Код заморожен, последняя правка 31 мая 2026 года. Работают два инструмента: юридическая проверка и SEO+GEO-аудит. Всё, что описано выше, собрано и запущено именно в этом виде.
По объёму работы это около 5 000 строк собственного TypeScript, 28 точек диагностики и жёсткий потолок 120 секунд на одну фоновую задачу. Каждый отчёт заканчивается развилкой. Можно чинить самому по готовым кускам кода. Можно отдать команде.
Частые вопросы
Как собственнику проверить работу маркетолога или агентства?
Проблема в том, что отчёт о работе присылает тот же человек, который эту работу делал. Сервис komu.marketing даёт независимую диагностику: 28 точек проверки, из них 8 юридических и 20 по SEO и GEO. Обычный SEO-аудит занимает 20-40 секунд, отчёт приходит списком конкретных пунктов с готовыми файлами правок.
Что именно проверяется по 152-ФЗ и закону о рекламе?
Юридический движок делает 8 проверок: HTTPS, политика конфиденциальности, cookie-уведомление, согласие в формах, реквизиты оператора, порядок отзыва согласия, передача данных за рубеж, маркировка рекламы. Два анализатора открывают саму политику и ищут внутри пять обязательных разделов. Трекеры разбираются по стране размещения данных: Google Analytics, Meta Pixel и Hotjar помечаются как зарубежные, Яндекс.Метрика и Jivo штрафа не дают.
Откуда в отчёте берётся сумма штрафа?
Движок складывает максимумы только по тем пунктам, которые сайт реально провалил, поэтому цифра у каждого сайта своя. Теоретический потолок при всех восьми проваленных проверках: 1 880 000 ₽. Это расчёт по внутренним таблицам сервиса, юридическим заключением он не является. Статьи и вилки штрафов зафиксированы в коде в мае 2026 года.
Как понять, видят ли сайт нейросети?
За это отвечает GEO-блок. Он смотрит, пущены ли GPTBot, ClaudeBot, PerplexityBot и YandexAdditional, есть ли llms.txt и есть ли FAQ-разметка. Если чего-то нет, сервис сразу отдаёт готовый robots.txt с разрешением 14 AI-ботов, llms.txt и JSON-LD, кнопкой «Копировать».
Сколько страниц обходит паук и что попадает в отчёт?
Паук собирает до 500 внутренних адресов и обходит первые 16 батчами по 4 страницы, с таймаутом 10 секунд на страницу. Общее число найденных страниц считается всегда: если сайт больше, в отчёт встаёт отдельная строка про это, молчаливой обрезки выдачи нет. Итог собирается как план по срокам: A «сделать сегодня», B «на этой неделе», C «в этом месяце», D «внешний GEO».
