---
title: "Аудит Директа за четыре часа с ИИ-агентом: кейс с запросами к API и поправкой от CRM"
canonical_url: https://evstygney.ru/articles/direct-audit-case-ai-agent/
date_published: 2026-09-12
date_modified: 2026-09-12
author: Егор (https://evstygney.ru/about/)
summary: "Обезличенный кейс аудита Директа и Метрики через API с ИИ-агентом за четыре часа стеной: цель заказа, бренд/небренд, проверка отчёта подрядчика, воронка, когорты, и как выгрузка CRM переписала вывод об окупаемости. С кодом запросов."
tags: ["Директ и каналы", "ИИ и инструменты"]
---

# Аудит Директа за четыре часа с ИИ-агентом: кейс с запросами к 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:

```python
# 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, об этом ниже.

<!-- chart:monthly -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 250" role="img" aria-label="Расход на Директ по месяцам и ДРР" class="chart-wide"><title>Расход на Директ по месяцам и ДРР</title><line x1="20" y1="204" x2="710" y2="204" stroke="rgba(0,0,0,.18)" stroke-width="1"/><rect x="36.3" y="113.2" width="24.0" height="90.8" fill="#0B5E8C" rx="4" ry="4"/><text x="48.3" y="105.2" font-size="12.5" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">94 тыс</text><text x="48.3" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">сен</text><text x="48.3" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">47%</text><rect x="93.0" y="198" width="24.0" height="6" fill="#C9D3DA" rx="2"/><text x="105.0" y="190" font-size="10.5" fill="#777" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">нет данных</text><text x="105.0" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">окт</text><text x="105.0" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">—</text><rect x="149.7" y="100.1" width="24.0" height="103.9" fill="#0B5E8C" rx="4" ry="4"/><text x="161.7" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">ноя</text><text x="161.7" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">30%</text><rect x="206.3" y="91.2" width="24.0" height="112.8" fill="#0B5E8C" rx="4" ry="4"/><text x="218.3" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">дек</text><text x="218.3" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">32%</text><rect x="263.0" y="84.2" width="24.0" height="119.8" fill="#0B5E8C" rx="4" ry="4"/><text x="275.0" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">янв</text><text x="275.0" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">26%</text><rect x="319.7" y="95.4" width="24.0" height="108.6" fill="#0B5E8C" rx="4" ry="4"/><text x="331.7" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">фев</text><text x="331.7" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">28%</text><rect x="376.3" y="88.9" width="24.0" height="115.1" fill="#0B5E8C" rx="4" ry="4"/><text x="388.3" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">мар</text><text x="388.3" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">23%</text><rect x="433.0" y="96.4" width="24.0" height="107.6" fill="#0B5E8C" rx="4" ry="4"/><text x="445.0" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">апр</text><text x="445.0" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">24%</text><rect x="489.7" y="61.9" width="24.0" height="142.1" fill="#0B5E8C" rx="4" ry="4"/><text x="501.7" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">май</text><text x="501.7" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">33%</text><rect x="546.3" y="32.9" width="24.0" height="171.1" fill="#0B5E8C" rx="4" ry="4"/><text x="558.3" y="24.9" font-size="12.5" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">178 тыс</text><text x="558.3" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">июн</text><text x="558.3" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">37%</text><rect x="603.0" y="30.0" width="24.0" height="174.0" fill="#0B5E8C" rx="4" ry="4"/><text x="615.0" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">июл</text><text x="615.0" y="239" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">27%</text><rect x="659.7" y="36.4" width="24.0" height="167.6" fill="#0B5E8C" rx="4" ry="4"/><text x="671.7" y="28.4" font-size="12.5" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">174 тыс</text><text x="671.7" y="221" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">авг</text><text x="671.7" y="239" font-size="13" font-weight="800" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">18%</text><text x="20" y="239" font-size="11" fill="#777" font-family="Montserrat,Arial,sans-serif" text-anchor="end" transform="translate(-2,0)"></text></svg>
<figcaption>Столбцы — расход на Директ по месяцам, подпись под месяцем — ДРР. В октябре разметка покупок не работала. Бюджет с мая вырос в полтора раза, и ДРР сразу ушёл в 33–37%; август — лучший месяц года.</figcaption>
</figure>
<!-- /chart:monthly -->

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

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

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

```python
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% | — |

<!-- chart:segments -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 156" role="img" aria-label="Цена заказа по сегментам"><title>Цена заказа по сегментам</title><text x="203" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Свой бренд</text><rect x="215" y="8" width="43.8" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="268.8" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">389 ₽ · ДРР 14%</text><text x="203" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Товарная кампания</text><rect x="215" y="44" width="62.3" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="287.3" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">553 ₽ · ДРР 20%</text><text x="203" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Небренд, все запросы</text><rect x="215" y="80" width="169.7" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="394.7" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 506 ₽ · ДРР 53%</text><text x="203" y="132.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">…из них автотаргетинг</text><rect x="215" y="116" width="250.0" height="22" fill="#00A8ED" rx="4" ry="4"/><text x="475.0" y="132.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">2 218 ₽ · ДРР 78%</text><line x1="215" y1="6" x2="215" y2="152" stroke="rgba(0,0,0,.18)" stroke-width="1"/></svg>
<figcaption>Цена заказа (CPO) по сегментам поисковых запросов за год. Средние 816 ₽ складываются из бренда по 389 ₽ и небренда по 1 506 ₽; автотаргетинг без ключевых слов — половина расходов главной кампании.</figcaption>
</figure>
<!-- /chart:segments -->

Внутри небренда одна группа — «автотаргетинг без ключевых слов» — забрала 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 |

<!-- chart:organic -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 120" role="img" aria-label="Покупки по источникам за год"><title>Покупки по источникам за год</title><text x="238" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Яндекс.Директ, реклама</text><rect x="250" y="8" width="215.0" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="475.0" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 842</text><text x="238" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Google, бесплатная выдача</text><rect x="250" y="44" width="169.6" height="22" fill="#00A8ED" rx="4" ry="4"/><text x="429.6" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 453</text><text x="238" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Яндекс, бесплатная выдача</text><rect x="250" y="80" width="57.8" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="317.8" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">495</text><line x1="250" y1="6" x2="250" y2="116" stroke="rgba(0,0,0,.18)" stroke-width="1"/></svg>
<figcaption>Покупок за год по источнику визита. В Google реклама не крутилась, и брендовый спрос дал 1 453 бесплатных заказа; в Яндексе, где та же выдача выкуплена, — 495.</figcaption>
</figure>
<!-- /chart:organic -->

В 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% |

<!-- chart:funnel -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 228" role="img" aria-label="Воронка оформления заказа за 90 дней"><title>Воронка оформления заказа за 90 дней</title><text x="203" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Добавил в корзину</text><rect x="215" y="8" width="250.0" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="475.0" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">2 826 · 14,9% визитов</text><text x="203" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Перешёл в корзину</text><rect x="215" y="44" width="240.8" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="465.8" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">2 722 · 96%</text><text x="203" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">К деталям доставки</text><rect x="215" y="80" width="169.3" height="22" fill="#00A8ED" rx="4" ry="4"/><text x="394.3" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 914 · 70%</text><text x="203" y="132.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Выбрал оплату</text><rect x="215" y="116" width="155.5" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="380.5" y="132.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 758 · 92%</text><text x="203" y="168.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Подтвердил заказ</text><rect x="215" y="152" width="151.4" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="376.4" y="168.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 711 · 97%</text><text x="203" y="204.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">Покупка</text><rect x="215" y="188" width="137.7" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="362.7" y="204.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">1 556 · 91%</text><line x1="215" y1="6" x2="215" y2="224" stroke="rgba(0,0,0,.18)" stroke-width="1"/></svg>
<figcaption>Визиты с каждым шагом оформления за 90 дней и конверсия от предыдущего шага. Единственный провал ниже 90% — переход из корзины к деталям доставки, где стоит окно входа.</figcaption>
</figure>
<!-- /chart:funnel -->

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

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

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

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

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

```python
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% верен только как «реклама против заказов, которые она сама привела через сайт».

<!-- chart:crm -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 270" role="img" aria-label="Заказы в CRM и покупки в Метрике по месяцам" class="chart-wide"><title>Заказы в CRM и покупки в Метрике по месяцам</title><line x1="20" y1="224" x2="710" y2="224" stroke="rgba(0,0,0,.18)" stroke-width="1"/><rect x="20" y="10" width="12" height="12" rx="3" fill="#0B5E8C"/><text x="38" y="21" font-size="13" font-weight="600" fill="#444" font-family="Montserrat,Arial,sans-serif">Заказов в CRM</text><rect x="164" y="10" width="12" height="12" rx="3" fill="#00A8ED"/><text x="182" y="21" font-size="13" font-weight="600" fill="#444" font-family="Montserrat,Arial,sans-serif">Покупок в Метрике</text><rect x="31.3" y="79.5" width="16.0" height="144.5" fill="#0B5E8C" rx="4" ry="4"/><rect x="49.3" y="200.3" width="16.0" height="23.7" fill="#00A8ED" rx="4" ry="4"/><text x="48.3" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">сен</text><text x="48.3" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">16%</text><rect x="88.0" y="70.8" width="16.0" height="153.2" fill="#0B5E8C" rx="4" ry="4"/><rect x="106.0" y="219" width="16.0" height="5" fill="#C9D3DA" rx="2"/><text x="105.0" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">окт</text><text x="105.0" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">—</text><rect x="144.7" y="73.3" width="16.0" height="150.7" fill="#0B5E8C" rx="4" ry="4"/><rect x="162.7" y="181.7" width="16.0" height="42.3" fill="#00A8ED" rx="4" ry="4"/><text x="161.7" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">ноя</text><text x="161.7" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">28%</text><rect x="201.3" y="76.6" width="16.0" height="147.4" fill="#0B5E8C" rx="4" ry="4"/><rect x="219.3" y="193.2" width="16.0" height="30.8" fill="#00A8ED" rx="4" ry="4"/><text x="218.3" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">дек</text><text x="218.3" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">21%</text><rect x="258.0" y="59.6" width="16.0" height="164.4" fill="#0B5E8C" rx="4" ry="4"/><rect x="276.0" y="186.3" width="16.0" height="37.7" fill="#00A8ED" rx="4" ry="4"/><text x="275.0" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">янв</text><text x="275.0" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">23%</text><rect x="314.7" y="56.7" width="16.0" height="167.3" fill="#0B5E8C" rx="4" ry="4"/><rect x="332.7" y="189.7" width="16.0" height="34.3" fill="#00A8ED" rx="4" ry="4"/><text x="331.7" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">фев</text><text x="331.7" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">20%</text><rect x="371.3" y="62.5" width="16.0" height="161.5" fill="#0B5E8C" rx="4" ry="4"/><rect x="389.3" y="183.6" width="16.0" height="40.4" fill="#00A8ED" rx="4" ry="4"/><text x="388.3" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">мар</text><text x="388.3" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">25%</text><rect x="428.0" y="83.0" width="16.0" height="141.0" fill="#0B5E8C" rx="4" ry="4"/><rect x="446.0" y="189.6" width="16.0" height="34.4" fill="#00A8ED" rx="4" ry="4"/><text x="445.0" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">апр</text><text x="445.0" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">24%</text><rect x="484.7" y="72.4" width="16.0" height="151.6" fill="#0B5E8C" rx="4" ry="4"/><rect x="502.7" y="190.2" width="16.0" height="33.8" fill="#00A8ED" rx="4" ry="4"/><text x="501.7" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">май</text><text x="501.7" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">22%</text><rect x="541.3" y="54.3" width="16.0" height="169.7" fill="#0B5E8C" rx="4" ry="4"/><rect x="559.3" y="184.7" width="16.0" height="39.3" fill="#00A8ED" rx="4" ry="4"/><text x="558.3" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">июн</text><text x="558.3" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">23%</text><rect x="598.0" y="44.0" width="16.0" height="180.0" fill="#0B5E8C" rx="4" ry="4"/><rect x="616.0" y="170.4" width="16.0" height="53.6" fill="#00A8ED" rx="4" ry="4"/><text x="615.0" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">июл</text><text x="615.0" y="259" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">30%</text><rect x="654.7" y="49.1" width="16.0" height="174.9" fill="#0B5E8C" rx="4" ry="4"/><rect x="672.7" y="151.2" width="16.0" height="72.8" fill="#00A8ED" rx="4" ry="4"/><text x="671.7" y="241" font-size="12" fill="#444" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">авг</text><text x="671.7" y="259" font-size="13" font-weight="800" fill="#0b0b0b" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">42%</text></svg>
<figcaption>Заказы по системе заказов (CRM) и покупки, которые видит Метрика сайта, по месяцам; под месяцем — доля сайта. Метрика видела 20–30% заказов, в августе доля подскочила до 42%.</figcaption>
</figure>
<!-- /chart:crm -->

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

```python
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 ₽ |

<!-- chart:repeat -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 120" role="img" aria-label="Доля клиентов со вторым заказом"><title>Доля клиентов со вторым заказом</title><text x="238" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">По cookie, 90 дней</text><rect x="250" y="8" width="53.8" height="22" fill="#0B5E8C" rx="4" ry="4"/><text x="313.8" y="24.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">15%</text><text x="238" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">По телефону, 90 дней</text><rect x="250" y="44" width="107.5" height="22" fill="#00A8ED" rx="4" ry="4"/><text x="367.5" y="60.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">30%</text><text x="238" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif">По телефону, 365 дней</text><rect x="250" y="80" width="175.6" height="22" fill="#00A8ED" rx="4" ry="4"/><text x="435.6" y="96.0" font-size="14" font-weight="600" fill="#0b0b0b" font-family="Montserrat,Arial,sans-serif">49%</text><line x1="250" y1="6" x2="250" y2="116" stroke="rgba(0,0,0,.18)" stroke-width="1"/></svg>
<figcaption>Доля новых клиентов, сделавших второй заказ: по cookie Метрики и по телефону из CRM. Cookie не видит приложение, звонки и смену устройства.</figcaption>
</figure>
<!-- /chart:repeat -->

Валовая прибыль с нового клиента за год при марже 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 раз дешевле рекламного заказа.

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

<!-- chart:timeline -->
<figure class="chart">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 298" role="img" aria-label="Хронометраж дня аудита"><title>Хронометраж дня аудита</title><line x1="40" y1="30" x2="680" y2="30" stroke="#0B5E8C" stroke-width="2" stroke-linecap="round"/><line x1="115.3" y1="24" x2="115.3" y2="36" stroke="rgba(0,0,0,.18)" stroke-width="1"/><text x="115.3" y="16" font-size="11.5" fill="#777" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">11:00</text><line x1="265.9" y1="24" x2="265.9" y2="36" stroke="rgba(0,0,0,.18)" stroke-width="1"/><text x="265.9" y="16" font-size="11.5" fill="#777" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">12:00</text><line x1="416.5" y1="24" x2="416.5" y2="36" stroke="rgba(0,0,0,.18)" stroke-width="1"/><text x="416.5" y="16" font-size="11.5" fill="#777" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">13:00</text><line x1="567.1" y1="24" x2="567.1" y2="36" stroke="rgba(0,0,0,.18)" stroke-width="1"/><text x="567.1" y="16" font-size="11.5" fill="#777" text-anchor="middle" font-family="Montserrat,Arial,sans-serif">14:00</text><line x1="85.2" y1="30" x2="85.2" y2="56" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="85.2" cy="30" r="5" fill="#0B5E8C" stroke="#fff" stroke-width="2"/><text x="93.2" y="66" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="start" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">10:48</tspan>  xlsx разобран, найдена обрезка, решение идти в API</text><line x1="140.4" y1="30" x2="140.4" y2="90" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="140.4" cy="30" r="5" fill="#0B5E8C" stroke="#fff" stroke-width="2"/><text x="148.4" y="100" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="start" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">11:10</tspan>  четыре отчёта Директа за год выгружены</text><line x1="183.1" y1="30" x2="183.1" y2="124" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="183.1" cy="30" r="5" fill="#0B5E8C" stroke="#fff" stroke-width="2"/><text x="191.1" y="134" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="start" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">11:27</tspan>  разбор отчёта подрядчика</text><line x1="308.5" y1="30" x2="308.5" y2="158" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="308.5" cy="30" r="5" fill="#0B5E8C" stroke="#fff" stroke-width="2"/><text x="316.5" y="168" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="start" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">12:17</tspan>  план из 16 пунктов с ценами в рублях</text><line x1="371.3" y1="30" x2="371.3" y2="192" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="371.3" cy="30" r="5" fill="#0B5E8C" stroke="#fff" stroke-width="2"/><text x="379.3" y="202" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="start" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">12:42</tspan>  воронка чекаута, скриншот стены входа</text><line x1="419.0" y1="30" x2="419.0" y2="226" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="419.0" cy="30" r="5" fill="#0B5E8C" stroke="#fff" stroke-width="2"/><text x="427.0" y="236" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="start" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">13:01</tspan>  когорты и сводный документ</text><line x1="642.4" y1="30" x2="642.4" y2="260" stroke="rgba(0,0,0,.18)" stroke-width="1"/><circle cx="642.4" cy="30" r="5" fill="#00A8ED" stroke="#fff" stroke-width="2"/><text x="634.4" y="270" font-size="13" font-weight="600" fill="#0b0b0b" text-anchor="end" font-family="Montserrat,Arial,sans-serif"><tspan fill="#444">14:30</tspan>  печатный дек, 24 слайда, PDF</text></svg>
<figcaption>Хронометраж дня по времени изменения файлов проекта: от первой выгрузки до готового дека — под четыре часа.</figcaption>
</figure>
<!-- /chart:timeline -->

Четыре часа стеной от первой выгрузки до дека, ещё около пяти часов через пять дней на 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 есть в статье [про аудит контекстной рекламы своими силами](/articles/direct-audit-checklist/), про цену брендовых запросов — [в отдельном разборе](/articles/brand-queries-cost/).

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

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

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

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

---
Автор: Егор, маркетинг на языке денег. Telegram: https://t.me/evstygney_ru. Все цифры — модельные прикидки, если не сказано иное.
