Автоматический аудит Яндекс Директа: интерактивный HTML-отчёт вместо скучного Excel

Автоматический аудит Яндекс Директа: интерактивный HTML-отчёт вместо скучного Excel

04.04.2026 0 Автор Павел

Аудит рекламного аккаунта в Яндекс Директе — рутина, которую я делал десятки раз. Выгрузки в Excel, ручные формулы, раскраска ячеек. Отчёт получался на 15 вкладок, которые никто не хотел открывать. Я решил это исправить и написал инструмент, который собирает данные через API, анализирует их и генерирует интерактивный HTML-отчёт — с графиками, KPI-карточками, анализом слива бюджета и готовыми рекомендациями.

Зачем мне это понадобилось

Каждый маркетолог, который ведёт контекстную рекламу, рано или поздно сталкивается с задачей аудита. Новый аккаунт от предыдущего подрядчика, плановая ревизия, запрос от руководства — причины разные, процесс одинаковый. И он тоскливый.

Стандартный сценарий выглядит так: выгружаешь статистику из интерфейса Директа, копируешь в Excel, считаешь CPA и CTR руками, раскрашиваешь плохие кампании красным, хорошие — зелёным. На выходе — файл, который открывается 30 секунд и в котором заказчик не может найти главное.

Я несколько лет делал именно так. А потом решил: хватит. Если я могу описать логику аудита в виде правил — значит, могу и закодить. Причём не в очередную таблицу, а в нормальный интерактивный отчёт, который можно открыть в браузере и сразу увидеть проблемы.

Что умеет инструмент

Результат — Python-скрипт, который подключается к Яндекс Директ API v5, вытягивает все нужные данные и генерирует HTML-файл. Один файл, который открывается в любом браузере. Без серверов, без зависимостей, без «сначала установите Node.js».

Что внутри отчёта:

  • KPI-дашборд — ключевые метрики за период одним взглядом
  • Помесячная динамика — как менялись расходы, клики, конверсии
  • Распределение бюджета по типам кампаний — поиск, РСЯ, ретаргетинг, мастер кампаний
  • Эффективность кампаний — с группировкой по типу и сортировкой «худшие первыми»
  • Анализ слива бюджета — конкретные суммы, потраченные впустую
  • Площадки — хорошие и плохие, с разбивкой по группам
  • Устройства — десктоп vs мобайл vs планшеты
  • Демография — пол и возраст аудитории
  • Рекомендации — сгруппированные по приоритету, с конкретными действиями

Как собираются данные

Яндекс Директ API v5 — штука мощная, но капризная. Данные разбросаны по нескольким сервисам, и для полного аудита нужно обратиться к каждому из них.

Отчёт по статистике

Основной массив данных приходит через сервис Reports. Это аналог того, что вы видите в Мастере отчётов, только через API. Запрос выглядит примерно так:

{
  "params": {
    "SelectionCriteria": {
      "DateFrom": "2025-10-01",
      "DateTo": "2026-03-31"
    },
    "FieldNames": [
      "CampaignName", "CampaignId", "CampaignType",
      "Impressions", "Clicks", "Cost",
      "Conversions", "ConversionRate", "CostPerConversion"
    ],
    "ReportName": "audit_campaigns",
    "ReportType": "CAMPAIGN_PERFORMANCE_REPORT",
    "DateRangeType": "CUSTOM_DATE",
    "Format": "TSV",
    "IncludeVAT": "YES"
  }
}

Один запрос — и у меня есть статистика по всем кампаниям за полгода. Аналогичные запросы я делаю для ключевых слов, площадок, устройств и демографии. Между запросами — пауза 3 секунды, чтобы не упереться в лимиты API.

Настройки кампаний

Статистика — это полдела. Для аудита нужны ещё и настройки: какая стратегия выбрана, включены ли расширенные площадки, какие корректировки стоят. Это уже сервис Campaigns:

response = client.campaigns.get(
    fields=["Id", "Name", "Type", "Status", "Strategy",
            "NegativeKeywords", "DailyBudget"],
    text_campaign_fields=["BiddingStrategy", "Settings"]
)

Всё это объединяется в единую структуру данных, которая потом прогоняется через анализатор.

Как выглядит HTML-отчёт

Теперь самое интересное — результат. Ниже я покажу демо-версии ключевых блоков отчёта. Данные, разумеется, фиктивные.

KPI-дашборд

Первое, что видит читатель — четыре карточки с ключевыми метриками. Без графиков, без лишнего. Просто цифры, которые сразу дают картину.

Расход за период
850 000 ₽
6 месяцев, с НДС
Клики
45 230
CTR 3.8%
Конверсии
230
CR 0.51%
Стоимость конверсии
3 696 ₽
целевой CPA: 3 000 ₽

Каждая карточка — это div с inline-стилями. Цвет верхней полоски зависит от метрики. Если CPA превышает целевой — полоска красная. Всё считается автоматически.

Таблица эффективности кампаний

Основной рабочий инструмент отчёта. Кампании сгруппированы по типу (Поиск, РСЯ, Ретаргетинг) и отсортированы по расходу — самые затратные сверху. Цветовая индикация показывает проблемы без чтения цифр.

Кампания Расход Клики CTR Конв. CPA Статус
Поиск (3 кампании)
demo-company | Поиск | Основные запросы 285 400 ₽ 18 720 5.2% 142 2 010 ₽
demo-company | Поиск | Брендовые 42 100 ₽ 8 340 12.1% 51 825 ₽
demo-company | Поиск | Широкие запросы 128 500 ₽ 5 120 1.1% 8 16 063 ₽
РСЯ (2 кампании)
demo-company | РСЯ | Ретаргетинг 95 200 ₽ 6 450 0.3% 24 3 967 ₽
demo-company | РСЯ | Широкая аудитория 198 300 ₽ 4 200 0.1% 3 66 100 ₽

Обратите внимание: строки с проблемами подсвечиваются красным фоном. Индикатор справа — зелёный, жёлтый или красный кружок. Это мгновенная навигация по проблемам. Не нужно всматриваться в цифры — красное видно сразу.

В реальном отчёте таблица интерактивная: можно сортировать по любому столбцу, сворачивать группы и фильтровать только проблемные кампании.

Анализ слива бюджета

Это, пожалуй, самый ценный блок для заказчика. Вместо абстрактного «тут что-то не так» — конкретные суммы и источники потерь.

!
Потенциальный слив бюджета
Обнаружено за период: октябрь 2025 — март 2026
Кампании без конверсий
72 400 ₽
2 кампании, 3 800 кликов
Мусорные площадки (РСЯ)
41 200 ₽
18 площадок, CTR > 2% без конв.
CPA выше целевого (x5+)
128 500 ₽
1 кампания «Широкие запросы»
Нерелевантные устройства
15 800 ₽
Планшеты: 0 конверсий
Суммарный потенциал экономии
257 900 ₽
30.3% от общего бюджета за период

Этот блок генерируется автоматически. Скрипт проходит по всем кампаниям и ключевым словам, находит «дыры» по чётким правилам:

  • Кампании, которые потратили больше N рублей и не принесли ни одной конверсии
  • Площадки в РСЯ с аномально высоким CTR, но нулевыми конверсиями (признак бот-трафика)
  • Кампании, где CPA превышает целевой в 5 и более раз
  • Устройства, на которые тратится бюджет, но конверсий нет

Анализ площадок

Площадки в РСЯ — отдельная головная боль. Их могут быть сотни, и разбирать каждую вручную — занятие для мазохистов. В отчёте площадки автоматически разбиваются на две группы: эффективные и мусорные.

Эффективные площадки (12)
yandex.ru CPA 1 240 ₽
mail.ru CPA 2 100 ₽
avito.ru CPA 2 850 ₽
+ 9 площадок
Мусорные площадки (18)
com.app.game.puzzle 8 420 ₽, 0 конв.
dzen.ru/news/random 6 350 ₽, 0 конв.
com.android.weather 5 100 ₽, 0 конв.
+ 15 площадок 21 330 ₽

Критерии отнесения площадки к «мусорным»: CTR выше 2% при нулевых конверсиях (вероятный бот-трафик), мобильные приложения с высокими расходами и нулевой отдачей, площадки, где стоимость клика в 3+ раза выше средней по аккаунту.

Статистика по устройствам

Простая, но важная секция. Показывает, как бюджет распределяется между десктопом и мобайлом, и где конверсии стоят дешевле.

Десктоп
52%
441 500 ₽
170 конв. | CPA 2 597 ₽
Мобайл
40%
340 000 ₽
55 конв. | CPA 6 182 ₽
Планшеты
8%
68 500 ₽
5 конв. | CPA 13 700 ₽

В данном примере видно, что планшеты — чёрная дыра. 8% бюджета, CPA в 5 раз выше десктопа. Рекомендация очевидна: снизить корректировку на планшеты до -50% или -100%.

Демография

Разбивка по полу и возрасту помогает понять, кто реально конвертируется, а на кого деньги тратятся впустую.

Сегмент Расход Доля Конв. CPA
Мужчины 35–44 215 000 ₽ 25.3% 89 2 416 ₽
Мужчины 25–34 178 000 ₽ 20.9% 62 2 871 ₽
Мужчины 45–54 142 000 ₽ 16.7% 38 3 737 ₽
Женщины 25–34 95 000 ₽ 11.2% 18 5 278 ₽
Не определено 120 000 ₽ 14.1% 12 10 000 ₽

Здесь сразу видно: ядро конверсий — мужчины 25–44. Сегмент «Не определено» тратит 14% бюджета с CPA в 4 раза выше среднего. Понижающая корректировка на этот сегмент — очевидное решение.

Как генерируются рекомендации

Рекомендации — не просто список проблем. Это структурированные, приоритизированные действия, которые можно брать и выполнять. Логика генерации построена на правилах:

# Пример правила для рекомендаций
if campaign.cost > threshold and campaign.conversions == 0:
    recommendations.append({
        "priority": "high",
        "category": "budget_waste",
        "action": f"Остановить кампанию '{campaign.name}' "
                  f"(потрачено {campaign.cost} руб., 0 конверсий)",
        "impact": campaign.cost
    })

if device.cpa > target_cpa * 3 and device.conversions < 5:
    recommendations.append({
        "priority": "medium",
        "category": "devices",
        "action": f"Снизить ставки на {device.name} (-50%)",
        "impact": device.cost * 0.5
    })

Каждая рекомендация получает приоритет (высокий, средний, низкий), категорию и оценку потенциальной экономии. В отчёте они группируются и сворачиваются:

Высокий приоритет (3 рекомендации) — экономия до 242 100 ₽
Остановить кампанию «Широкие запросы»
Потрачено 128 500 руб., CPA 16 063 руб. (целевой 3 000 руб.). Рекомендация: остановить, переработать семантику, запустить с точными ключами.
Потенциальная экономия: 128 500 ₽/полгода
Остановить кампанию «РСЯ | Широкая аудитория»
198 300 руб. при 3 конверсиях, CPA 66 100 руб. Кампания неэффективна. Остановить, сузить таргетинг, добавить минус-площадки.
Потенциальная экономия: 98 000 ₽/полгода
Отключить планшеты
68 500 руб. на планшеты, 5 конверсий с CPA 13 700 руб. Установить корректировку -100% на планшеты во всех кампаниях.
Потенциальная экономия: 15 600 ₽/полгода
Средний приоритет (4 рекомендации) — экономия до 67 000 ₽
Добавить 18 площадок в исключения
Мусорные площадки с нулевыми конверсиями. Добавить в список запрещённых площадок на уровне аккаунта.
Снизить ставки на женщин 25–34 (-30%)
CPA 5 278 руб. при целевых 3 000 руб. Понижающая корректировка снизит расходы.
Снизить ставки на сегмент «Не определено» (-50%)
14% бюджета, CPA 10 000 руб. Значительный перерасход на неидентифицированную аудиторию.
Проверить стратегию РСЯ-ретаргетинга
CPA 3 967 руб. — близко к порогу. Сузить аудиторию, проверить сроки ретаргетинга.
Низкий приоритет (2 рекомендации) — улучшения
Расширить семантику брендовой кампании
Кампания с самым низким CPA (825 руб.). Есть потенциал увеличить охват за счёт дополнительных вариантов бренда.
Настроить повышающие корректировки на мужчин 25–44
Самый конверсионный сегмент. Повышающая корректировка +20% увеличит долю трафика.

Блоки рекомендаций используют стандартный тег <details> — нативный HTML, без JavaScript. Высокий приоритет открыт по умолчанию, остальные свёрнуты. Заказчик сразу видит главное.

Разделы отчёта: подробнее

Помесячная динамика

Графики строятся на Chart.js — библиотека подключается через CDN. Для самодостаточности отчёта я загружаю её inline в base64, чтобы файл работал полностью оффлайн. Динамика показывает три линии: расходы, клики и конверсии — на одном графике с двумя осями Y.

Зачем это нужно: тренд важнее абсолютных чисел. Если расходы растут, а конверсии стоят на месте — это проблема, которая на графике видна за секунду. В таблице — нет.

Распределение бюджета по типам кампаний

Круговая диаграмма (или горизонтальная столбчатая — зависит от количества типов). Стандартный набор: Поиск, РСЯ, Ретаргетинг, Мастер кампаний, Смарт-баннеры. Если 70% бюджета уходит на РСЯ при целях на поиске — это повод для разговора.

Настройки кампаний

Отдельный чек-лист по настройкам: стратегии назначения ставок, дневные бюджеты, минус-слова на уровне аккаунта, расширенный геотаргетинг, показ по дополнительным релевантным фразам. Каждый пункт — зелёная галочка или красный крестик.

Техническая реализация

Весь инструмент — это Python-скрипт с модульной архитектурой:

  • api/ — модули для работы с Яндекс Директ API v5 (campaigns, ads, keywords, reports)
  • audit/ — логика анализа: сборщик данных, движок чек-листа, анализатор эффективности
  • output/ — генераторы отчётов: HTML (основной), а также XLSX, DOCX и JSON для совместимости

Конфигурация — через YAML-файл:

# config.yaml
token: "OAuth y0_..."
client_login: "demo-company"
date_from: "2025-10-01"
date_to: "2026-03-31"
goals:
  - id: 123456
    name: "Заявка"
  - id: 789012
    name: "Звонок"
thresholds:
  target_cpa: 3000
  min_clicks_for_analysis: 100
  waste_campaign_min_cost: 10000

Запуск — одна команда:

py run_audit.py --config config.yaml

На выходе — папка с отчётами. HTML-файл весит 200–400 КБ (зависит от количества кампаний) и открывается в любом браузере.

Почему HTML, а не Excel или PDF

Я долго думал над форматом. Excel — привычный, но у него три проблемы:

  1. Нет интерактивности. Нельзя свернуть блок, нельзя сделать всплывающую подсказку, нельзя отфильтровать одной кнопкой.
  2. Тяжело визуализировать. Графики в Excel можно сделать, но они выглядят как из 2005 года. А условное форматирование ячеек — это компромисс, а не решение.
  3. Неудобно шарить. Чтобы открыть Excel, нужен Excel. HTML открывается в браузере на любом устройстве — включая телефон.

PDF решает проблему шаринга, но убивает интерактивность. HTML — золотая середина. Один файл, ноль зависимостей, работает оффлайн, выглядит как настоящий дашборд.

Что это даёт на практике

Раньше полный аудит рекламного аккаунта с 20–30 кампаниями занимал у меня 4–6 часов. Большая часть времени — не анализ, а рутина: выгрузка данных, форматирование таблиц, раскраска ячеек, написание текстовых комментариев.

Сейчас:

  • Сбор данных: 2–3 минуты (ограничен скоростью API)
  • Генерация отчёта: 5–10 секунд
  • Мой анализ: 30–60 минут на проверку выводов и дополнение рекомендаций контекстом

Итого: час вместо шести. При этом качество выросло — скрипт не пропускает мелочи, которые я мог проглядеть при ручном аудите. Он проверяет каждую кампанию, каждую площадку, каждый сегмент аудитории.

Инструмент не заменяет маркетолога. Он заменяет рутину. Интерпретация данных, приоритизация рекомендаций с учётом бизнес-контекста, разговор с заказчиком — это по-прежнему ручная работа. Но она занимает 20% времени вместо 100%.

Честно про рекламу и маркетинг

Разбираю реальные кейсы, делюсь цифрами и инструментами в Telegram-канале. Без воды и мотивационных цитат.

Подписаться на канал

Что можно улучшить

Инструмент уже работает и используется, но идеи для развития есть:

  • Сравнение периодов. Сейчас отчёт строится за один период. Логично добавить сравнение «до/после» — чтобы видеть эффект внедрённых рекомендаций.
  • Интеграция с Метрикой. Данные по конверсиям из Директа — это не всегда полная картина. Подтягивание данных из Метрики даст более точные CPA.
  • Автоматические скриншоты. Puppeteer или Playwright могут сделать скриншот HTML-отчёта — для вставки в презентацию или отправки в чат.
  • Шаблоны рекомендаций. Сейчас тексты рекомендаций генерируются по шаблонам. Можно подключить LLM для более естественных формулировок.

Я собрал шаблоны, которые использую в работе: медиаплан, учёт рабочего времени, аналитические отчёты. Скачайте бесплатно на странице шаблонов.

Шаблоны для маркетинга

Профессиональные шаблоны для организации работы:
медиапланирование, учёт времени, аналитические отчёты
Telegram-канал Павезло маркетинг Павезло во ВКонтакте

Выводы

Автоматический аудит Яндекс Директа с HTML-отчётом — это не про замену маркетолога. Это про то, чтобы тратить время на анализ и принятие решений, а не на форматирование таблиц.

Что я вынес из этого проекта:

  1. API v5 Яндекс Директа достаточно для полного аудита. Все нужные данные доступны: статистика, настройки кампаний, ключевые слова, площадки, устройства, демография.
  2. HTML — лучший формат для аналитических отчётов. Интерактивность, визуализация, работа на любом устройстве — ни Excel, ни PDF этого не дают.
  3. Правила аудита формализуемы. Если вы можете объяснить стажёру, что проверять — вы можете это запрограммировать. Порог CPA, минимум конверсий для оценки, признаки бот-трафика — всё это конкретные условия.
  4. Автоматизация рутины освобождает время для экспертизы. Час на аудит вместо шести — и больше внимания тому, что действительно важно: контекст бизнеса, стратегия, коммуникация с заказчиком.

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