При рекламном бюджете в сотню-другую тысяч в месяц любая кампания, ушедшая в разнос, заметно бьёт по марже. А заходить в кабинет каждый день никто не будет. Поэтому на сервере работает скрипт: каждое утро он забирает статистику за вчера через API Директа и присылает письмо со сводкой и сигналами.
Почему переделываем сигналы
В один из дней в письме пришёл сигнал по расходу, и начали разбираться, почему. Разбор показал, что сигнал был один, а внимания в тот день заслуживали три вещи: рост общего расхода, расход конкурентной кампании и резкое падение показов товарной. Старые правила сравнивали каждую кампанию по отдельности и не видели ни общей картины, ни проседания показов.
Новые правила
База для сравнения — медиана за прошлые дни, а не среднее: один аномальный день не сдвигает порог для следующих.
- Расход вырос: общий расход за вчера в полтора раза и больше суммы медиан по кампаниям.
- Кампания начала тратить: медиана расхода была нулевой, а вчера ушло 200 ₽ и больше. Ловит случайно включённые и «проснувшиеся» кампании.
- Показы упали: 30% от медианы и меньше. Часто это первый признак отклонённых объявлений или сломанного товарного фида.
Сигналы в письме разбиты на группы «Расход», «Показы» и «Ошибки». Строки таблицы подсвечены по типу сигнала, а сверху — строка «итого вчера / сумма медиан». Приёмка простая: на данных того самого дня должны прийти три сигнала, а не один.
Коннектор к кабинету — только на чтение
Вторая часть — MCP-коннектор к Директу, чтобы ИИ-ассистент мог по запросу посмотреть статистику, поисковые запросы, фиды, баланс и настройки кампаний и объяснить, откуда взялся сигнал. Любые методы записи — остановить, изменить, удалить — отклоняются в самом коде коннектора, а не только правами токена. Решения по рекламе принимает человек, ассистент только смотрит и подсказывает.
Отдельно предстоит разобраться, что API отдаёт по кампаниям Мастера: у них часть настроек скрыта.
Ложная тревога на 16 тысяч ключевых слов
Как сигналы не должны работать, показал случай в середине октября. Утреннее письмо сообщило о массовых изменениях в кабинете: минус 16 227 ключевых слов и тысячи объявлений, расход за вчера — ноль. Выглядело как удаление всех кампаний.
Разбор показал другое. Выгрузка всех восьми типов данных — клиенты, кампании, стратегии, быстрые ссылки и другие — упала с одной и той же ошибкой: API вернул пустой ответ вместо данных. Скрипт сравнил пустую выгрузку с прошлым снимком и честно посчитал, что всё пропало. Проверили по шагам: запрос без токена получал тот же пустой ответ, что и с токеном, а запрос из другой сети — тоже. Значит, дело не в токене и не в адресе сервера. Через несколько часов подтвердилось: у Яндекса была авария в дата-центре, недоступен был весь Директ, включая веб-кабинет. Когда сервис поднялся, следующий прогон выгрузил нормальный снимок, и «пропажа» исчезла.
Что поменяли сразу: письмо стало HTML-сводкой с цветным статусом — красный для ошибок, жёлтый для сигналов и изменений, зелёный для спокойного дня, — карточками ключевых цифр и таблицей расхода по кампаниям. Ошибки выгрузки показаны отдельным блоком, а не смешаны с изменениями. Вывод для новых правил: если выгрузка не удалась, сравнивать её с прошлым снимком нельзя — это ошибка сбора данных, а не изменение в кабинете.
Статус
Сводка работает. Новые правила и коннектор описаны в техническом задании и находятся в работе. Критерий приёмки коннектора: расход за конкретный день должен совпасть с цифрой из письма до рубля, а попытка остановить кампанию через него — закончиться отказом.