/EVSTYGNEYМаркетинг на языке денег
Директ и каналы

Аудит Директа за четыре часа с ИИ-агентом: кейс с запросами к API и поправкой от CRM

Друзья прислали мне отчёт своего подрядчика по Директу и одну фразу: «вроде всё хорошо, но заказов не прибавляется». В отчёте было всё, что положено: конверсии, цена лида, «идеальный баланс объёма и цены» и план на сентябрь — лечить сайт, потому что 80% корзин бросают. Доставка еды в одном городе, около 1,6 млн ₽ рекламы в год. Я попросил доступ к кабинету и токен к API, открыл терминал с ИИ-агентом, и к обеду знал, что заказов вдвое меньше, чем конверсий, половина главной кампании уходит в автотаргетинг с ДРР 78%, а «80% брошенных корзин» — ошибка деления.

TL;DR Четыре часа стеной с Claude Code и API Директа и Метрики дали сводный документ и дек на 24 слайда. Витринные конверсии считали каждый заказ дважды. Средний CPO прятал бренд по 389 ₽ и небренд по 1 506 ₽. Настоящая конверсия корзины в заказ 58%, а главная потеря сайта — окно входа, которое открывается при заходе в корзину. Через пять дней выгрузка из CRM показала, что Метрика видела четверть заказов, повторность по телефону вдвое выше, чем по cookie, и небрендовый заказ из «не окупается» стал «окупается за 6–12 месяцев». Ниже весь ход с запросами к API и граблями, раздел о том, где этот аудит врёт, и отдельно для собственника: сколько это заняло и что здесь делал человек. Чтение — минут двадцать.

Простыми словами Аудит рекламы — проверка по данным кабинета, за что платили и что получили. ИИ-агент — программа, которая по моим вопросам пишет и запускает запросы к API, считает таблицы и складывает выводы в документы. Что считать заказом и чему верить, решал я.

Бизнес, город, подрядчик и платформа сайта не названы. Все суммы и количества умножены на коэффициенты, доли и проценты настоящие. Кейс публикуется с согласия владельцев данных.

Что было на входе

На руках было четыре вещи:

  • доступ к кабинету Директа и счётчику Метрики с включённой электронной торговлей (события покупки с суммами);
  • выгрузка «Мастера отчётов» за год, xlsx на 65 МБ;
  • отчёт подрядчика за август: текст, три таблицы и план на сентябрь;
  • ноль информации о марже, доле заказов через приложение и договоре с подрядчиком.

Инструменты: Claude Code, Python с pandas, OAuth-токен с правами Директа и Метрики. Токен и все выгрузки лежат в папке проекта на моём диске, во внешние чаты ничего не уходило.

Час первый: xlsx обрезан молча, идём в API

Агент открыл xlsx и сразу упёрся в две вещи. Первая мелкая: у файла битое описание размеров листа, и openpyxl читает его как пустой, пока не вызвать ws.reset_dimensions(). Вторая серьёзнее: в выгрузке ровно 400 000 строк, детализация обрывается в марте, а строка «Итого» внизу посчитана за весь год. Лимит веб-выгрузки режет период молча, и если сложить строки, в файле оказывается 44% годового расхода.

Лайфхак Любую веб-выгрузку из Директа сверяйте так: сумма колонки «Расход» по строкам против «Итого» внизу. Не сошлось — период обрезан.

Решение: не бороться с файлом и забрать год через Reports API. Четыре отчёта, все в TSV:

# Reports API Директа: год по дням × кампаниям × группам с целью реального заказа
params = {
    "SelectionCriteria": {"DateFrom": DATE_FROM, "DateTo": DATE_TO},
    "Goals": [PURCHASE_GOAL_ID],           # id цели «Ecommerce: покупка»
    "AttributionModels": ["AUTO"],
    "FieldNames": ["Date", "CampaignName", "AdGroupName", "CriterionType",
                   "Clicks", "Cost", "Conversions", "Revenue"],
    "ReportName": f"audit_{int(time.time())}",   # имя уникально навсегда в рамках токена
    "ReportType": "CUSTOM_REPORT",
    "DateRangeType": "CUSTOM_DATE", "Format": "TSV", "IncludeVAT": "YES",
}
# заголовки: Authorization: Bearer <token>, processingMode: auto,
# returnMoneyInMicros: false, skipReportHeader/skipReportSummary: true
# ответ 200 — готово; 201/202 — повторить через retryIn секунд; 429 — подождать 30 сек

Плюс поисковые запросы помесячно (SEARCH_QUERY_PERFORMANCE_REPORT) с той же целью: за большой период отчёт по запросам лучше дробить.

Грабля, которая стоит целого аудита: поле Conversions без параметра Goals возвращает сумму по всем целям счётчика, включая микроцели. У нас так получалось 25 тыс «конверсий» на 32 тыс кликов. С Goals колонки становятся Conversions_<id>_AUTO и Revenue_<id>_AUTO, и выручка приходит только по цели с деньгами.

Главное решение аудита: что считать заказом

Пока отчёты выгружались, агент вытащил полный список целей счётчика. Их оказалось больше десятка, и «конверсии» в отчётах складывались сразу из нескольких, поэтому первым делом мы разложили год по целям:

Цель Достижений за год
Ecommerce: покупка 1 968
Подтвердил заказ (событие платформы) 2 411
Оформление заказа (посещение страницы) 4 565
Составная «оформил заказ» 2 204
Автоцель: отправка формы 1 838

Витринные «4 466 конверсий» из годового отчёта кабинета — это сумма целей «покупка» и «подтвердил заказ», которые срабатывают на одном и том же заказе (в сумме 4 379, разница — атрибуция). Реальных заказов 1 968. Витринный CPA 354 ₽ превращается в CPO 816 ₽.

Правило, которое я вынес отсюда и теперь применяю первым: пока не выбрана одна цель реального заказа, любая «конверсия» в отчёте — не факт. При включённой электронной торговле это всегда «Ecommerce: покупка» — единственная цель с выручкой, а значит, единственная, из которой считается ДРР.

Экономика года по этой цели:

Показатель Значение
Расход с НДС 1,6 млн ₽
Заказов 1 968
Выручка из Директа 5,5 млн ₽
CPO 816 ₽
ДРР 29%
Средний чек 2 816 ₽

Для доставки еды ДРР 29% дорого: обычный целевой уровень канала 10–20%, первый заказ с рекламы при типичной марже общепита убыточен, канал живёт на повторных заказах. Насколько живёт, выяснилось только с CRM, об этом ниже.

Расход на Директ по месяцам и ДРР94 тыссен47%нет данныхоктноя30%дек32%янв26%фев28%мар23%апр24%май33%178 тысиюн37%июл27%174 тысавг18%
Столбцы — расход на Директ по месяцам, подпись под месяцем — ДРР. В октябре разметка покупок не работала. Бюджет с мая вырос в полтора раза, и ДРР сразу ушёл в 33–37%; август — лучший месяц года.

Попутно нашёлся октябрь без заказов: 8 покупок за месяц при обычной сотне по цели «подтвердил заказ». Разметка электронной торговли лежала месяц, и никто этого не заметил. В план пошёл алерт «заказов за день = 0».

Разрез бренд/небренд: среднее скрывает две разные рекламы

Средний CPO 816 ₽ ничего не говорит о том, что делать, потому что внутри него сидят две разные рекламы. Чтобы их развести, поисковые запросы за год разделили регуляркой на «свой бренд», «конкуренты» и «остальное»:

import re, pandas as pd
q = pd.read_csv("data/reports/r4-queries-purchases.tsv", sep="\t")
BRAND = re.compile(r"бренд\s*слитно|бренд\s+раздельно|brand", re.I)  # маска из топ-100 запросов
COMP  = re.compile(r"конкурент1|конкурент2", re.I)
q["seg"] = "nonbrand"
q.loc[q.Query.str.contains(COMP), "seg"] = "competitor"
q.loc[q.Query.str.contains(BRAND), "seg"] = "brand"
g = q.groupby("seg")[["Cost", "Clicks", "Conversions", "Revenue"]].sum()
g["CPO"] = g.Cost / g.Conversions
g["DRR"] = g.Cost / g.Revenue
g["CR"]  = g.Conversions / g.Clicks

Маска брендовых запросов собирается из данных: топ-100 запросов по расходу плюс все варианты написания названия — слитно, раздельно, латиницей, с опечатками. В веб-выгрузке есть готовое поле «Упоминания брендов в запросах», в API его нет.

Сегмент Расход Заказы CPO ДРР Конверсия из клика
Свой бренд 327 тыс ₽ 841 389 ₽ 14% 17%
Небренд 530 тыс ₽ 352 1 506 ₽ 53% 3%
Товарная кампания 312 тыс ₽ 565 553 ₽ 20%
Цена заказа по сегментамСвой бренд389 ₽ · ДРР 14%Товарная кампания553 ₽ · ДРР 20%Небренд, все запросы1 506 ₽ · ДРР 53%…из них автотаргетинг2 218 ₽ · ДРР 78%
Цена заказа (CPO) по сегментам поисковых запросов за год. Средние 816 ₽ складываются из бренда по 389 ₽ и небренда по 1 506 ₽; автотаргетинг без ключевых слов — половина расходов главной кампании.

Внутри небренда одна группа — «автотаргетинг без ключевых слов» — забрала 388 тыс ₽ за год и принесла 175 заказов: CPO 2 218 ₽, ДРР 78%. Это половина расходов главной кампании. Ещё 404 запроса потратили от 100 ₽ каждый и не дали ни одного заказа — вместе 144 тыс ₽, 9% бюджета. Регулярной чистки запросов не велось: за год в кабинете полсотни ключевых фраз и ноль корректировок ставок.

В деньгах Отключить широкие и альтернативные категории автотаргетинга и перенести бюджет в товарную кампанию — 120–200 тыс ₽ в год, которые перестают уходить при ДРР 78%. Сбить цену брендового клика (62 ₽ за клик по собственному имени на пустом аукционе, ручные ставки дали бы 18–31 ₽) — ещё 80–160 тыс ₽.

Google как контрольная группа

Бренд по 389 ₽ выглядит выгодно, пока не спросить, сколько из этих заказов пришло бы бесплатно. Прямого теста не было, но есть естественный контроль: в Google реклама не крутилась.

Запрос к Stat API Метрики, покупки и выручка по источникам за год:

GET https://api-metrika.yandex.net/stat/v1/data
  ?ids=<counter>&date1=<from>&date2=<to>&accuracy=full
  &dimensions=ym:s:lastsignSourceEngine
  &metrics=ym:s:visits,ym:s:ecommercePurchases,ym:s:ecommerceRevenue
  &sort=-ym:s:ecommerceRevenue
Authorization: OAuth <token>
Источник Визиты Покупки
Яндекс.Директ 27 938 1 842
Google, бесплатная выдача 14 222 1 453
Яндекс, бесплатная выдача 7 959 495
Покупки по источникам за годЯндекс.Директ, реклама1 842Google, бесплатная выдача1 453Яндекс, бесплатная выдача495
Покупок за год по источнику визита. В Google реклама не крутилась, и брендовый спрос дал 1 453 бесплатных заказа; в Яндексе, где та же выдача выкуплена, — 495.

В Google брендовый спрос без рекламы даёт 1 453 заказа в год. В Яндексе, где та же выдача выкуплена за 327 тыс ₽, органика дала 495. Помесячно бесплатный трафик из Яндекса упал почти вдвое за год, а доля брендового расхода в Директе за то же время выросла с 25% до 40–49%. Причинность здесь не доказана, но два графика на одном слайде задают владельцу правильный вопрос. В план пошёл тест инкрементальности: две недели пониженных брендовых ставок и замер суммы «Директ плюс органика Яндекса».

Отчёт подрядчика: что честно и что нет

Сырые цифры в отчёте за август сошлись с API до рублей: расход по кампаниям, число заказов, оценка кампаний в сетях. Это надо сказать первым, потому что цифры подрядчик не рисует. Спин живёт в том, какие из них показать. Два тезиса проверку не прошли.

Тезис «из корзины оплачивается 20%, 80% теряем — в сентябре лечим сайт, а не рекламу». Двадцать процентов получились делением заказов на срабатывания цели «добавил в корзину»: 335 на 1 666. Но цель срабатывает на каждый добавленный товар, а в заказе доставки еды в среднем пять позиций, это видно и по среднему чеку. Ошибку нашёл я, когда прочитал отчёт глазами: агент на неё не среагировал, для него «конверсия 20%» была просто числом. Дальше уже агент пересчитал воронку от визитов, как её считает сама Метрика:

metrics=ym:s:visits,
        ym:s:goal<CART_ID>conversionRate,      # доля визитов с добавлением в корзину
        ym:s:goal<PURCHASE_ID>conversionRate   # доля визитов с покупкой
# корзина → заказ = purchaseRate / cartRate
# достижения целей делить друг на друга нельзя: «корзина» срабатывает на каждый товар

Корзина → заказ по визитам: 58%. Для доставки это хороший показатель, катастрофы нет, и «+85 заказов от дожима корзин» в плане подрядчика не существуют. Обе цифры при этом были в самом отчёте: «44% от числа целей, но 14–15% от визитов», а для главного вывода выбрана та, что хуже.

Тезис «Основной Поиск: цена лида 476 ₽, идеальный баланс, масштабировать». Внутри кампании за август: бренд по 150 ₽ с ДРР 5% и небренд по 1 190 ₽ с ДРР 42%. Масштабируется только вторая часть, по 1 190 ₽. Разреза бренд/небренд в отчёте не было, ДРР и выручки тоже, хотя электронная торговля включена и данные лежат в одном клике.

Замечание Рамка вердикта — две колонки: что честно и что не выдерживает проверки. Тон нейтральный, потому что документ читает и подрядчик.

Воронка сайта и стена входа

Раз уж воронка размечена целями платформы до последнего шага, мы посчитали её целиком за 90 дней, по долям визитов:

Шаг Визитов Конверсия шага
Добавил в корзину 2 826 14,9% от всех визитов
Перешёл в корзину 2 722 96%
Перешёл к деталям доставки 1 914 70%
Выбрал оплату 1 758 92%
Подтвердил заказ 1 711 97%
Покупка 1 556 91%
Воронка оформления заказа за 90 днейДобавил в корзину2 826 · 14,9% визитовПерешёл в корзину2 722 · 96%К деталям доставки1 914 · 70%Выбрал оплату1 758 · 92%Подтвердил заказ1 711 · 97%Покупка1 556 · 91%
Визиты с каждым шагом оформления за 90 дней и конверсия от предыдущего шага. Единственный провал ниже 90% — переход из корзины к деталям доставки, где стоит окно входа.

Единственный шаг ниже 90% — вход в оформление. Там живёт авторизация: окно входа показывалось в 70% визитов, дошедших до корзины, и четверть увидевших его не проходила — около 470 оборванных визитов за квартал. На смартфонах окно выскакивало вдвое чаще, чем на компьютерах, поэтому мобильная конверсия хуже.

Чтобы не спорить с цифрами, агент прошёл флоу headless-браузером с мобильным вьюпортом: главная, добавление блюда, корзина. Скриншот подтвердил: при заходе в корзину, даже пустую, поверх экрана открывается окно «Вход» с полем телефона и выбором способа подтверждения — до адреса, суммы и времени доставки. Заказ не оформлялся, телефон не вводился.

Рекомендация №1 по сайту — гостевой заказ или вход после адреса: консервативно +50–65 заказов в месяц без рубля рекламы.

Когорты через Logs API: сколько клиент приносит потом

Ни один отчёт кабинета не ответит, окупается ли небрендовый заказ по 1 506 ₽. Нужны сырые визиты с идентификатором клиента. Это Logs API Метрики:

API = f"https://api-metrika.yandex.net/management/v1/counter/{COUNTER}"
fields = ("ym:s:visitID,ym:s:clientID,ym:s:dateTime,ym:s:isNewUser,"
          "ym:s:lastsignTrafficSource,ym:s:purchaseRevenue,ym:s:purchaseID")
# 1. GET  {API}/logrequests/evaluate?date1&date2&fields&source=visits  → possible: true
# 2. POST {API}/logrequests?...                                        → request_id
# 3. GET  {API}/logrequest/{id}  — поллить до status == "processed"
# 4. GET  {API}/logrequest/{id}/part/{n}/download  — скачать части
# 5. POST {API}/logrequest/{id}/clean  — снять квоту

Две грабли: лимит периода ровно год, date2 не позднее вчера; purchaseRevenue приходит списком вида [1234,567], парсить руками. Дальше pandas: первая покупка клиента и её канал, повторы за 90 дней, выручка за 90 дней, медиана дней до второй покупки — только по закрытым окнам, чтобы свежие клиенты не занижали повторность.

Канал первой покупки Покупателей Повторили Выручка за 90 дней на покупателя Медиана до 2-й покупки
Органика 1 388 17% 3 570 ₽ 25 дней
Реклама 1 350 15% 3 381 ₽ 11 дней

И ещё одно число: минимум 24% рекламных покупок — не первая покупка клиента. Реклама частично выкупала заказы собственных клиентов. Лечение — исключать сегмент «покупал за 90 дней» из брендовой закупки и ретаргетинга.

Вывод по окупаемости на этом этапе: клиент с рекламы приносит 3 381 ₽ за квартал, при марже 25–35% это 850–1 180 ₽ валовой прибыли, и небрендовый заказ по 1 506 ₽ за квартал не окупается. Через пять дней этот вывод пришлось переписать.

Бонус: чужой кабинет в Метрике

Разрез рекламного трафика по UTM показал источник vk_ads / cpa / <числовой id кампании>: 12 тыс визитов за пять месяцев и 2 заказа. Трафик шёл на главную и акционные страницы, 77% визитов из городов вне зоны доставки. Владельцы знали про «рекламу ВКонтакте на подписки в сообщество», про кампании на сайт не знали. Одна строка запроса к Метрике превратилась в вопрос, кто и сколько потратил в другом кабинете.

Что легло в дек

Восемь рабочих документов агент свёл в один по фиксированной структуре: главные цифры, сегменты, отчётность подрядчика, сайт, клиенты, план из 16 пунктов, приоритеты первого месяца, вопросы владельцу, оговорка об источнике данных. Из сводного документа — печатный дек на 24 слайда: HTML с графиками в SVG, PDF через headless-браузер. Приоритеты первого месяца выглядели так:

# Действие Кто Эффект
1 Разделить бренд и небренд, сбить брендовые ставки, отключить широкие категории автотаргетинга Подрядчик 200–360 тыс ₽ в год перестают утекать
2 Гостевой заказ или вход после адреса Платформа сайта +50–65 заказов в месяц
3 Бюджет в товарную кампанию, запросы-звёзды в ключи, правило чистки запросов Подрядчик +65–130 заказов в год при ДРР до 25%
4 Исключить купивших за 90 дней из закупки, повторные — в пуши и рассылки Подрядчик и владелец срезать перекупку своих
5 Тест инкрементальности бренда, две недели Подрядчик решение по 327 тыс ₽ в год
6 Отчётность: ДРР по сегментам, конверсии от визитов, алерт «заказов за день = 0» Подрядчик управляемость

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

Второй акт: что показала CRM

Владельцы прислали три выгрузки из системы заказов: заказы с телефонами клиентов за два года, справочник гостей с бонусами и отчёт по заказам с источником и статусом. Первые полчаса съели грабли данных: кодировка cp1251 и разделитель «;», история начинается с даты переезда на новую платформу (у 3 400 клиентов «дата рождения» равна дню миграции), заказы агрегатора заведены на один служебный номер, есть номер «Рабочий» с 900 заказами по 600 ₽ (питание персонала). Без исключения заглушек любая клиентская аналитика врёт.

Дальше три поправки к аудиту.

Метрика видела 20–30% заказов За год аудита в CRM 18,6 тыс заказов на 48 млн ₽; Метрика видела 4,3 тыс на 11,4 млн ₽. Средний чек сходится (2 618 ₽ по CRM против 2 816 ₽ по Метрике), то есть суммы в разметке передавались честно, терялись сами заказы: приложение, телефон, агрегатор. Расход Директа — 3,3% выручки бизнеса, а ДРР 29% верен только как «реклама против заказов, которые она сама привела через сайт».

Заказы в CRM и покупки в Метрике по месяцамЗаказов в CRMПокупок в Метрикесен16%октноя28%дек21%янв23%фев20%мар25%апр24%май22%июн23%июл30%авг42%
Заказы по системе заказов (CRM) и покупки, которые видит Метрика сайта, по месяцам; под месяцем — доля сайта. Метрика видела 20–30% заказов, в августе доля подскочила до 42%.

Повторность вдвое выше По телефону вместо cookie:

o = pd.read_csv(path, sep=";", encoding="cp1251", parse_dates=["Дата"])
o = o[~o["Телефон"].isin(SERVICE_PHONES)]              # агрегатор, «Рабочий», фиктивные номера
first = o.groupby("Телефон")["Дата"].min().rename("first")
o = o.join(first, on="Телефон")
o["days"] = (o["Дата"] - o["first"]).dt.days
closed = o[o["first"] <= o["Дата"].max() - pd.Timedelta(days=90)]   # только закрытые окна
repeated = closed[closed.days.between(1, 90)]["Телефон"].nunique()
print(repeated / closed["Телефон"].nunique())          # 0.30
Горизонт после первого заказа Повторили Выручка на нового клиента
90 дней 30% 3 926 ₽
365 дней 49% 6 853 ₽
Доля клиентов со вторым заказомПо cookie, 90 дней15%По телефону, 90 дней30%По телефону, 365 дней49%
Доля новых клиентов, сделавших второй заказ: по cookie Метрики и по телефону из CRM. Cookie не видит приложение, звонки и смену устройства.

Валовая прибыль с нового клиента за год при марже 25–35% — 1 700–2 400 ₽. Небрендовый заказ по 1 506 ₽ окупается за 6–12 месяцев, за квартал — только по августовской цене. Целевой CPO небренда с окупаемостью за полгода — 1 200–1 700 ₽, и маржу по-прежнему нужно спросить у владельца.

Рост Директа не дал новых клиентов. Расход с весны вырос в полтора раза, новых клиентов в CRM летом столько же, сколько год назад; заказов больше на 15%, целиком за счёт повторных. Это подтвердило по кассе то, что аудит видел по когортам: бренд и ретаргет выкупают своих.

Что осталось верным без правок: разрез бренд/небренд, автотаргетинг с ДРР 78%, стена входа, пятница и суббота как 42% недели, праздничные пики. Что пришлось перепроверять: «август — лучший месяц». В CRM заказов в августе не прибавилось, а доля сайта в заказах подскочила с 30% до 42%: либо заказы перетекли из приложения на сайт, либо поменялась разметка. Вопрос ушёл владельцу.

Из CRM вырос второй план: сегменты в Яндекс.Аудиториях по телефонам (исключение «купил за 90 дней» — 3,2 тыс номеров, похожие на лучших клиентов, реактивация 91–365 дней — 5,2 тыс), триггер второго заказа на 7-й и 21-й день, пятничный пуш, праздничный предзаказ. Одна волна SMS по спящим при отклике 3–5% — 160–260 заказов за 24 тыс ₽, в 5–10 раз дешевле рекламного заказа.

Сколько это заняло и что делал человек

Хронометраж дня аудита11:0012:0013:0014:0010:48 xlsx разобран, найдена обрезка, решение идти в API11:10 четыре отчёта Директа за год выгружены11:27 разбор отчёта подрядчика12:17 план из 16 пунктов с ценами в рублях12:42 воронка чекаута, скриншот стены входа13:01 когорты и сводный документ14:30 печатный дек, 24 слайда, PDF
Хронометраж дня по времени изменения файлов проекта: от первой выгрузки до готового дека — под четыре часа.

Четыре часа стеной от первой выгрузки до дека, ещё около пяти часов через пять дней на CRM и второй дек на 17 слайдов. Внутри этого времени агент писал и запускал скрипты, ждал API, считал таблицы и складывал документы. Я делал четыре вещи: выбрал цель реального заказа, нашёл ошибку деления в отчёте подрядчика, задавал порядок вопросов («теперь Google как контроль», «теперь воронка от визитов») и переписывал вердикты в человеческий язык для владельцев.

В деньгах Аудит такого объёма у агентства или фрилансера, по моей прикидке рынка, — одна-две недели календаря и 30–80 тыс ₽, причём когорты через Logs API и живой проход сайта в стандартный аудит обычно не входят. Здесь — четыре часа и подписка на агента. Для собственника важнее срок: вопрос «сколько стоит заказ по данным кабинета» получил ответ в день, когда был задан, а не через две недели после согласования коммерческого предложения.

Что не вошло в четыре часа: день переписки за доступами и токеном, и работа после. Из этого аудита собран набор правил и скриптов, с которым следующий такой же аудит начинается с готовых выгрузчиков и чеклиста. Второй раз будет быстрее первого.

Где этот аудит врёт

  • Все заказы и выручка до второго акта — из электронной торговли Метрики. Отмены не вычтены, промокоды учтены как получится. CRM подтвердила чек и показала охват, но маржа так и осталась вопросом владельцу; без неё целевой CPO — экспертная прикидка.
  • Каннибализация бренда доказана косвенно, через Google. Настоящий ответ даст только тест с понижением ставок.
  • Когорты по cookie — нижняя оценка повторности; когорты по телефону — с левой цензурой: клиенты до переезда на новую платформу выглядят новыми.
  • Атрибуция Директа автоматическая. Три независимых счёта заказов из Директа разошлись на 7%. Это нормально, но точный ДРР канала гуляет в этих пределах.
  • Агент ошибку подрядчика не заметил. Он посчитал бы «20% из корзины» как данность, если бы я не знал, что цель «добавил в корзину» срабатывает на каждый товар. Экспертиза в этой связке пока у человека.
  • Хронометраж — по времени файлов, не по секундомеру, и в него не входит день на доступы.
  • Цифры в тексте изменены коэффициентами. Сверять свой бизнес с этими абсолютами не надо, сверяйте доли.

Как повторить у себя

  1. Получить токен с правами Директа и Метрики и номер счётчика. Выгрузить список целей, выбрать одну цель реального заказа. При включённой электронной торговле — «Ecommerce: покупка».
  2. Reports API: год по кампаниям и группам с Goals и AttributionModels, поисковые запросы помесячно с той же целью. Полю «Конверсии» без цели не верить.
  3. Разрезать запросы регуляркой на бренд, конкурентов и небренд; отдельно посмотреть группы автотаргетинга. По каждому сегменту — расход, заказы, CPO, ДРР.
  4. Метрика: источники × покупки × выручка; органика по поисковикам помесячно рядом с долей бренда в расходе.
  5. Воронка — только через conversionRate, никогда через деление достижений.
  6. Logs API за год: повторы за 90 дней, выручка на клиента, доля рекламных покупок у старых клиентов.
  7. Отчёт подрядчика: сверить расход до рублей, потом искать четыре приёма — двойной счёт целей, конверсия от срабатываний, среднее без разреза, CPL вместо ДРР.
  8. Выгрузка из CRM с телефонами: сверить охват Метрики и повторность до того, как выносить вердикт об окупаемости.
  9. В каждый документ — оговорку об источнике данных.

Чеклист проверок кабинета без API есть в статье про аудит контекстной рекламы своими силами, про цену брендовых запросов — в отдельном разборе.

Краткие выводы

  1. Первое действие аудита — выбрать цель реального заказа. У нас витринные конверсии были завышены вдвое, и весь отчёт подрядчика стоял на этой цифре.
  2. Средние скрывают всё: CPO 816 ₽ распался на бренд по 389 ₽ и небренд по 1 506 ₽, а внутри небренда сидел автотаргетинг с ДРР 78%.
  3. Конверсию воронки считают от визитов. Деление на срабатывания цели «корзина» дало 20% вместо 58% и увело план подрядчика в «лечить сайт».
  4. Метрика видела четверть бизнеса. Любой вердикт об окупаемости рекламы без выгрузки CRM с телефонами — вердикт на четверти данных.
  5. Четыре часа стеной с ИИ-агентом закрыли объём, который обычно продают как двухнедельный проект. Решения о том, что считать и чему верить, принимал человек.

Откуда брали данные Reports API Яндекс.Директа, Stat API и Logs API Яндекс.Метрики за 12 месяцев; отчёт подрядчика за один месяц; три выгрузки из системы заказов за два года; внешняя проверка сайта и проход headless-браузером. Цифры изменены постоянными коэффициентами, доли и проценты настоящие.

У вас в отчёте подрядчика есть строка «конверсии». Вы знаете, из каких целей она сложена и сколько в ней настоящих заказов?