Daily MaverickESCAPE: Walking the Leopard Trail — Four days of fynbos, fatigue and fierce resilienceBollywood HungamaVikram Malhotra on Abundantia Entertainment evolving their AI division aiOn into a standalone studio, “It is being shaped as a fully-integrated, total capability movie studio”PunchPolice arrest four over sexual offences in BauchiThe Jerusalem PostBennett's comments about sitting with Netanyahu in next gov't were 'unsuccesful irony,' Lapid saysInquirerGatchalian: Defense to start presentation on Nov. 9ZDF heuteAktuelle Pressemitteilungen des ZDFUOLAtaques houthis colocam infraestruturas sauditas 'à prova'; aeroporto de Riade segue fechadoColliderNetflix's Beloved Spy Thriller Officially Confirms Its Long-Awaited Season 2 DateThe Hollywood Reporter‘Rebellion’: Why the Bradford 12 Doc Is So Timely and Its Directors Want People to Know “Your Problems Are Created by Elon Musk, Not Migrants”Fotogramas"Una rareza gótica que acaba en delirio": La película sobre el primer caso de vampirismo en España documentado por la IglesiaBBC NewsSinn Féin ministers facing no-confidence vote after Drumcree disputeVanguardTribargain Unveils a New E-Commerce Platform for the Nigerian Market
The Daily Newsstand · Free, Always
Monday, October 12, 2026

Полгода SEO с нуля после переезда с Tilda: органика ×20 и 12 граблей, на которые я наступил

Translate

Привет, Хабр! Меня зовут Дмитрий, я руководитель маркетинга на аутсорсе: захожу в компании, где реклама и сайт вроде бы работают, а заявок мало, и пересобираю маркетинг так, чтобы каждая цифра сходилась с CRM. Один из таких проектов — клининговая компания из Петербурга, на рынке с 2016 года. Договор под NDA, поэтому без названия и домена, а все цифры ниже настоящие, я снял их из Метрики, Search Console, Вебмастера, Топвизора и Roistat 9 октября, в том числе там, где они выглядят не очень.

Если коротко, вот что получилось за шесть месяцев, с апреля по сентябрь 2026:

Апрель

Сентябрь

Визиты из поиска, Метрика

166

3 446 (×20,8)

из Яндекса

73

1 829 (×25)

Запросов в топ-10 Яндекса, Топвизор, 580 фраз

23

247

Средняя позиция в Google

25,6

10,4

“клининг спб”, позиция в Яндексе

25 (июль)

9

Целевое обращение из поиска, Roistat

-

915 ₽ против 1 600 ₽ из Директа

Доля поиска во всех обращениях компании

-

49%

Дальше подробно, откуда это взялось, и отдельно про то, что не сработало, потому что из ошибок в этом проекте вышло не меньше пользы, чем из удачных решений.

Точка ноль

В конце марта сайт переехал с Tilda на самописный PHP без CMS: каждая страница отдельный файл, роутинг через .htaccess, обычный shared-хостинг. При переезде сменились все адреса, так что домену было около четырёх лет, а поисковой истории у сайта не было никакой.

На 31 марта на сайте было 175 страниц, из них 70 под станции метро, 18 под районы и 15 под города Ленобласти, каркас этих посадочных собрали до меня. В sitemap лежало 104 URL и ни одной страницы метро, а в шаблоне метро с первого коммита стоял noindex, и вот эта одна строчка потом стоила мне полгода в Google.

Остальное по первым аудитам 5-10 апреля:

— по 16 главным коммерческим запросам сайта нет в топ-10 ни в Яндексе, ни в Google, сверху домены с ключом в адресе и агрегаторы; — Топвизор по 580 фразам: топ-3 — 10 запросов, топ-10 — 23, вне топ-100 — 231; — в Google 130 кликов за апрель при средней позиции 25,6; — TTFB около секунды, CLS главной 0,377, LCP на мобильных 3,5-4,9 с; — две конкурирующие разметки LocalBusiness на одной странице; — страницы районов по 200 уникальных слов, страницы Ленобласти почти на две трети дублировали друг друга.

Что вышло

Визиты из поиска по месяцам

Визиты из поиска по месяцам

Первые три месяца рост медленный, и это нормально для сайта без истории: в апреле 166 визитов, в июне 711. На август в Яндексе (317 → 1 454 визита) пришлось сразу несколько событий, о которых ниже: разводка каннибализации, рост страницы прайса в ценовых запросах и скачок 4 августа, когда пять запросов разом поднялись на 16-19 позиций без единой правки в коде. Этот скачок я специально не записываю себе в заслуги, разложить августовский рост по причинам точно не получится.

Запросы в топе Яндекса по Топвизору

Запросы в топе Яндекса по Топвизору

По Топвизору на одном и том же наборе фраз в топ-10 стало 247 запросов вместо 23, в топ-3 — 79 вместо 10, медиана позиции на 1 октября 11. Провал 3 августа (138 → 121) совпал с периодом, когда я перекладывал главный запрос между страницами.

Клики и позиция в Google

Клики и позиция в Google

Для тех, кто не верит самодельным графикам, тот же период как есть в Search Console: 5,22 тыс. кликов и 433 тыс. показов за полгода, средняя позиция 12,5 по всему периоду.

Search Console, апрель-сентябрь 2026

Search Console, апрель-сентябрь 2026

Google рос ровнее: клики 130 → 1 850 в месяц, позиция 25,6 → 10,4. Тут важная оговорка, без которой этот график вводит в заблуждение. В Google рост в основном дал блог, коммерческие страницы двигаются медленнее (позиция 26,4 → 19,0), а у блога из Петербурга только 9% входов, тогда как на коммерческих страницах 43%. То есть по Google значительная часть визитов — это всероссийский инфотрафик, полезный для веса сайта, но не для заявок.

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

Поиск, Roistat

Август

Сентябрь

Расход на SEO

65 000 ₽

65 000 ₽

Обращений

83

88

Целевых

62

71

Цена целевого обращения

1 048 ₽

915 ₽

Доля поиска в обращениях компании

31%

49%

В расход входит и подписка Roistat 15 000 ₽, то есть цифра не приукрашена. В сентябре целевое обращение из Директа вместе с карточкой Яндекс Бизнеса стоило 1 600 ₽ (Директ как раз перевели только на юрлиц, и он подорожал), так что поиск к шестому месяцу стал самым дешёвым каналом. Продажи и выручку не привожу: статусы сделок в CRM почти не заполняются, суммы есть у 16 сделок из 150, и любой ROI тут был бы натяжкой.

Как я работал

За полгода в репозитории 527 коммитов, страниц стало 442 вместо 175, в sitemap 371 URL вместо 104, в блоге 188 статей. И сразу ответ на вопрос, который на Хабре зададут первым: 338 коммитов из 527, то есть 64%, сделаны в связке с AI-агентом Claude Code. Агент работал с подключёнными API Яндекс Вебмастера, Search Console и Метрики, гонял аудиты параллельными субагентами и мерил CLS и LCP через Playwright на холодном кэше. Без этого объём одному человеку за полгода не вытянуть, но каждую находку агента приходилось перепроверять, потому что он регулярно находил проблемы, которых нет, например «нет llms.txt», когда файл лежал на месте.

По месяцам коротко:

  • Апрель — фундамент. PHP-кэш вывода (TTFB ~1000 → 100-150 мс при попадании), IndexNow, свой генератор sitemap, 301 и 410 со старых адресов Tilda. CLS главной 0,377 → 0,002, WebP для 191 картинки. Страницы метро я наполнил и открыл, уникальность районов поднял с 20-25% до 45-50%. 13 отраслевых страниц для производств и складов, 40 статей, глоссарий на 45 терминов с автоссылками, канал в Дзене через RSS.

  • Май — массовая оптимизация. Деплой через GitHub Actions, правки title на 95 страницах и description на 42, первая каннибализация (услуга против статьи, общая страница квартир против страниц по количеству комнат). GA4 удалил из-за 152-ФЗ.

  • Июнь — расширение. Прайс разбил на 8 разделов с якорями под 73 услуги, страницы по типам бизнеса и графикам уборки офиса, 24 страницы под Великий Новгород, 16 B2B-страниц под Москву. LCP на мобильных 4,0 → 3,1 с через content-visibility. С 10 июня заморозил вёрстку и дизайн.

  • Июль — аналитика. Roistat с событиями, динамический коллтрекинг, visit id в CRM, обогащение карточек звонков по крону в GitHub Actions каждые 15 минут.

  • Август — данные вместо гипотез. Все 365 URL через URL Inspection API, аудит каннибализации через query-analytics Вебмастера, Москва только под спрос по Вордстату.

  • Сентябрь — добивание. Индекс Google 366 из 366, разводка промышленного кластера, CLS внутренних страниц 0,57 → 0,001, усиление страницы уборки после ремонта, 20 статей кластерами под услуги.

Шесть разборов, которые стоят отдельной статьи

1. Indexing API не вытаскивает страницы с плохим вердиктом. Метатег noindex в шаблоне метро я убрал ещё в апреле, но Google запомнил вердикт. Indexing API я отправлял пять раз, на 99, 91, 122, 91 и 71 URL, и все ответы были “OK”, а нового обхода не было ни у одной застрявшей страницы, на 31 мая под noindex висели 63 из 63. Помогла только ручная кнопка «Запросить индексирование» в Search Console, около 55 URL в сутки: 10 августа в индексе 294 из 365, 21 сентября 366 из 366. Показы метро-кластера в Google выросли примерно с 30 до 111 в день. Новые статьи, кстати, Google сам забирает из sitemap примерно за 36 часов, проблема только у тех, кто однажды получил плохой вердикт.

2. NO_LCP из-за трёх пикселей прокрутки. PageSpeed стабильно отказывался находить LCP на главной, я по очереди чинил скрипт обогащения звонков, ленту партнёров и первый экран, а причина оказалась в карусели с scroll-snap-type: x mandatory и padding: 4px. Точка привязки первого слайда не совпадала с позицией, браузер сам доскролливал 3-4 пикселя при загрузке стилей, и scroll-событие навсегда останавливало замер LCP, даже с выключенными скриптами. Многочасовое расследование закончилось одной строкой:

.works-track {
  scroll-snap-type: x mandatory;
  padding: 4px;
  /* snap-точка = позиция первого слайда с учётом паддинга: без этого браузер
     сам доскролливает 4px при загрузке, а scroll-событие убивает LCP-замер */
  scroll-padding-inline: 4px;
}

LCP 1,3 с, CLS 0,008, score 99.

3. CLS 0,57 на внутренних страницах при идеальной главной. На главной всё было зелёное, а страница мытья окон давала CLS 0,565, статьи блога около 0,5. Причин оказалось четыре: critical CSS был написан только под главную; у кнопок на разных страницах были разные классы, .btn--outline и .btn-outline, и блок раздувался на 57 px; display:none для свёрнутого FAQ стоял только в асинхронном CSS, поэтому до загрузки FAQ был развёрнут; у баннеров не было высоты на 161 странице из 163. Critical CSS вырос с 8 до 15 КБ, CLS 0,001, полевые Core Web Vitals на 24 сентября — 246 хороших URL и ни одного плохого. И отдельные грабли: первую верную правку я откатил, потому что мерил на тёплом кэше и не увидел эффекта.

4. Сквозной футер топил промышленные страницы. По B2B-запросам за месяц было 650+ показов в Google и 1 клик, а по «генеральная уборка цеха» показывались 9 страниц сайта сразу. Причина — футер на всех страницах: по 16 ссылок на московские и новгородские страницы и только 3 на питерские промышленные, и поисковик честно считал главными не те. Развёл футер по регионам, и за месяц по Топвизору медиана позиции в кластере «производство и склады» ушла с 10,5 до 5, в топ-10 вместо 16 запросов из 33 стало 28. «Промышленный клининг спб» сейчас на 5-м месте, «уборка склада спб» на 7-м.

5. Прайс оказался самой денежной страницей. В начале июня ценовые запросы просели («клининг цена спб» с 19 на 60), я разбил страницу прайса на 8 разделов с подзаголовками и поправил вхождения. К 25 августа у неё было 24 776 показов в Яндексе, 1 903 клика, CTR 7,7% и средняя позиция 8,4, а в начале сентября прайс давал треть всех кликов сайта в Яндексе. Восемь из десяти лидеров роста кликов в августе — ценовые запросы. Люди в этой нише хотят сначала увидеть цену, и страница, которая отвечает на этот вопрос сразу, забирает трафик лучше любой красивой услуги.

6. «Клининг спб» и интент, который сильнее твоих решений. Главный запрос ниши я перекладывал четыре раза за 2,5 месяца: главная, прайс, снова главная, главная с ценой в title и H1. Позиция 25 → 29 → 13 → 9. Но 28 сентября Яндекс всё равно показывал выше главной страницу уборки квартир (830 показов против 462). Разбор выдачи показал почему: у конкурентов на главных слово «квартир» встречается 38-75 раз, на главной сайта 16, главная заточена под B2B, а выдача по «клининг спб» бытовая. Яндекс решает по интенту выдачи, а не по тому, какого хозяина ты назначил в title, и с этим можно только работать, а не бороться.

Где я ошибался

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

Что вынес

Публиковал статьи пачками по 21, 11 и 18 в день вопреки своему же правилу “не больше 5”, через 3-4 недели — волны LOW_QUALITY в Яндексе

Темп важнее объёма

Пассажи “для нейросетей” с брендами техники, с которой в работе не было: “постремонтная уборка спб” упала с 3-го места на 63-е, “уборка после покраски” со 2-го на 77-е

Только подтверждённые факты, бренды вычистил из 34 файлов

38 сгенерированных “вопросов клиентов” под разметку QAPage, через три недели разметку пришлось убрать

Не выдумывать пользовательский контент

Рейтинг в разметке добавлял и убирал 4 раза, Яндекс дважды блокировал YML-фид услуг

Рейтинг — только при видимых на странице отзывах

Генератор sitemap на ручных списках 4 раза терял страницы, один раз всю Москву

Генератор сверяет карту с роутами в .htaccess и ругается на расхождения

24 страницы и 30 500 слов под Новгород, где B2B-спроса по Вордстату ноль: страница на 1-й позиции дала 2 показа за 5 недель

Сначала замер спроса, потом вёрстка

Москва: страницы под города области и разовые услуги, которые там некому продавать

Порог новой страницы - 50 показов в месяц и вопрос «может ли компания это обслужить»

Правил main.js и style.css, а живыми были минифицированные файлы на CDN, стили блока ответов полгода не доезжали до 150 страниц

Править то, что реально отдаётся, и проверять дифф минификатора

Мои же служебные параметры проверок (?_nc=, ?fresh=, ?_ym_debug=) попали в индекс Яндекса

Все параметры обхода кэша — в Clean-param

HTML-кэш раздавал всем CSRF-токен одного посетителя, и формы отвечали 403

Кэшировать страницы с формами осторожно

До 31 июля Roistat не видел ни одной заявки с форм: в CRM 44, в Roistat 0

Сверять CRM и аналитику руками, а не верить дашборду

Звонки на старый номер терялись три недели, а журнал АТС показывал, что всё в порядке

Сверять коллтрекинг с журналом телефонии

С Clean-param в итоге получилась длинная строка, но после неё мусор из индекса ушёл:

Clean-param: v&_&_nc&fresh&test&etext&nocache&bust&yclid&ysclid&gclid&fbclid&utm_source&utm_medium&utm_campaign&utm_content&utm_term&_ym_debug&_ym_status-check&_ym_lang&roistat_check&ybaip&nc&audit&fin&cls&cold&probe&diag&ux&m&ver

Отдельно про измерения, на которых легко построить красивый отчёт и ошибиться. Клики в Вебмастере расходятся с Метрикой в 4-9 раз (в июле 5 137 против 1 250 визитов), а 14 сентября клики Вебмастера упали вдвое при ровной Метрике, поэтому трафик из Яндекса я считаю только по Метрике. Показы блога в Search Console раздуты ответами ИИ: у одной статьи 6 518 показов на уровне страницы и 489 по сумме запросов, а на позициях 1-3 висят «запросы» вроде «да» и «а подешевле» — это реплики диалога, а не люди. И в один день, 7 сентября, у меня было сразу три ложные тревоги: «реклама упала вдвое» (это был плановый перевод Директа на юрлиц), «обвал обращений» (метод выгрузки не видел неразобранные сделки) и «81% трафика мимо Петербурга» (если отделить блог от коммерческих страниц, на коммерции Петербург 43%).

Что переносится на другие проекты

Если отвечать на вопрос, что дало рост, то это не приём, а скучная последовательность: сначала вычистить технический мусор и noindex из шаблонов, потом открыть и наполнить посадочные под реальный спрос, а не под карту города, потом развести каннибализацию по данным Вебмастера, а не по ощущениям, и только после этого наращивать контент ровным темпом, потому что пачки по 20 статей Яндекс возвращает волной LOW_QUALITY через месяц. Москву и Новгород я сначала строил по логике «больше страниц — больше трафика» и потерял на этом время, а заработало всё тогда, когда порогом для новой страницы стали 50 показов в месяц по Вордстату и вопрос «может ли компания это обслужить». AI-агент ускорил работу в разы, но самые дорогие ошибки, выдуманные бренды в текстах и сгенерированные вопросы клиентов, родились как раз из желания сделать контент «для нейросетей» быстро, так что проверка фактов человеком осталась самой ценной частью процесса, и я бы на ней не экономил ни в одном проекте.

Интересно, у кого ещё Indexing API так же молча отвечал «OK» и ничего не переобходил, и чем вы вытаскивали такие страницы, кроме ручной кнопки?

Источники цифр: Яндекс Метрика, Google Search Console, Яндекс Вебмастер, Топвизор (Яндекс, Санкт-Петербург, 580 фраз), Roistat, amoCRM. Выгрузка 9 октября 2026 года, период 1 апреля - 30 сентября 2026. Данные Search Console и Метрики задним числом пересчитываются, поэтому отдельные цифры могут немного отличаться от отчётов, сделанных в течение периода.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.