Трекер позиций, который следит за тысячами ключей пока вы спите
SEO-команда клиента отслеживала позиции запросов через смесь сторонних сервисов и ручных проверок. Каждое утро кто-то выгружал отчёт, пробегал глазами цифры и помечал то, что выглядело странно. Проблема была не в усилиях, а в покрытии. У них больше 8 000 запросов в десятках проектов, а инструменты, за которые они платили, либо не тянули такой объём по разумной цене, либо отдавали устаревшие данные со вчерашнего обхода. Когда падение позиций замечали, ущерб уже накапливался 48 часов.
батчи и хранение
Систему отслеживания позиций встроили прямо в платформу. В каждом проекте — цепочки ключей, сгруппированные по интенту, посадочной странице или кампании. Система отправляет эти запросы оптимизированными батчами в провайдер SERP-данных, собирает результаты и каждый день сохраняет снимки позиций. Логика батчинга важна, потому что провайдер берёт деньги за запросы и держит жёсткие лимиты. Наивная отправка 8 000 одиночных запросов разорвёт бюджет и упрётся в потолок за минуты. Вместо этого запросы группируются по поисковикам и регионам, пакуются в максимально допустимые батчи и распределяются во времени с управляемыми задержками. Только за счёт этого расходы на API упали примерно на 40% по сравнению с прошлыми инструментами.
разбор SERP
Надёжный парсинг результатов оказался работы больше, чем рассчитывали. Раскладка SERP неоднородна: брендовый запрос отдаёт knowledge panel и sitelinks, локальный — map pack, товарный — карусели магазинов. Позиция «обычного» органического результата сдвигается в зависимости от того, что ещё поисковик решает показать. Наш парсер извлекает именно органические листинги, сопоставляет их с отслеживаемыми доменами и фиксирует и абсолютную позицию, и реальную видимость (с учётом SERP-фич, которые двигают органику ниже фолда). Это разделение оказалось полезным: команда начала ловить случаи, когда позиция формально стабильна, но реальная видимость упала — над органикой появился новый featured snippet.
трафик и сверка
Система также подтягивает данные по трафику из аналитической платформы поисковика, связывая позиции запросов с реальным CTR и сессиями. Эта интеграция потребовала возни с отдельным API: своя авторизация, свои лимиты и соглашение об именовании ресурсов, которое не всегда совпадает с тем, что вводят пользователи. Сверху — слой сверки: нечёткое сопоставление имён ресурсов и кэширование auth-токенов с автоматическим обновлением.
отчёты и оповещения
Ежедневные отчёты запускаются по cron в ранние часы. Для больших наборов запросов — в некоторых проектах отслеживается 3 000+ запросов — генерация отчёта занимает 20–30 минут. Её вынесли в фоновую обработку с server-sent events, передающими прогресс в дашборд, чтобы команда видела сборку отчёта в реальном времени, а не смотрела на спиннер. Если запрос проседает больше чем на пять позиций за день, система подсвечивает его в отчёте и помечает для разбора. Устойчивое падение в течение недели запускает отдельное оповещение с контекстом: какие конкуренты выросли, есть ли технические проблемы у посадочной и когда контент обновлялся в последний раз.
результаты
Система работает автономно и выводит только то, что требует внимания человека. Команда перестала тратить утро на сбор данных и начала тратить его на решения. Один долг по схеме данных: первая версия писала каждый ежедневный снимок отдельной строкой — нормально работало месяцами, пока часть проектов не накопила год истории и не упёрлась в проблемы производительности запросов. Перешли на time-series-friendly схему с партиционированными таблицами.