Задача
У образовательного проекта была рекламная кампания в рекламной сети поисковика с оплатой за клики. Деньги уходили ровно, заявки приходили неровно. Стандартный отчёт в кабинете показывал общую картину — расход, клики, средний CPA — и в этой общей картине всё выглядело терпимо. Вопрос, на который отчёт не отвечал: какая часть бюджета уходит на площадки, которые не приносят вообще ничего.
Рекламная сеть — это тысячи сайтов и мобильных приложений. Среди них есть площадки, где трафик накручен: пользователь играет в головоломку, промахивается по баннеру, засчитывается клик, рекламодатель платит. Заявок с такого трафика не бывает по определению. Руками это не ловится: разбирать несколько сотен строк отчёта каждые несколько дней никто не будет.
Решение
Я предложил не «чистить рекламу вручную раз в квартал», а сделать сканер площадок, который сам достаёт отчёт через API рекламного кабинета и раскладывает площадки по трём корзинам по формальным признакам:
| Корзина | Признак | Что с ней делать |
|---|---|---|
| 🔴 Бот-трафик | CTR ≥ 3% и ноль заявок при 10+ кликах | отключать автоматически |
| 🟠 Дорого без заявок | нормальный CTR, но слито 700 ₽+ без заявок | только на ручное решение |
| 🟡 Наблюдение | CTR 1,5–3% | копить статистику |
Логика первой корзины простая. Нормальный CTR в рекламной сети — доли процента. Если по площадке кликают в 5–50 раз чаще среднего, но ни один клик не превращается в заявку — это не «горячая аудитория», это накрутка. Два условия вместе (аномальный CTR + ноль конверсий) почти не дают ложных срабатываний, поэтому такую корзину не страшно отключать автоматически.
Вторая корзина принципиально другая: туда попадают крупные легальные площадки — видеохостинги, почтовые сервисы, порталы. Они дорогие и могут не давать заявок в конкретном месяце, но это не фрод, и отключать их алгоритмом нельзя. Их сканер только показывает человеку.
Внедрение
- Скрипт тянет отчёт по площадкам за окно в 30 дней через API кабинета, с обязательным ожиданием готовности отчёта — иначе API отдаёт пустой ответ, и «чистый» результат оказывается просто неполученным.
- Пороги (минимум кликов, границы CTR, порог расхода) вынесены в шапку скрипта: рекламу разных проектов можно сканировать одним инструментом, меняя две цифры.
- Режим по умолчанию — только отчёт. Отключение площадок происходит отдельным флагом
--applyи затрагивает исключительно красную корзину. - Список отключённого ведётся локально, а не читается обратно из API: чтение списка исключений у рекламного API нестабильно и иногда возвращает пустоту, а решение «что уже отключено» должно быть детерминированным. Любое отключение обратимо.
- Сканер поставлен на расписание — прогон раз в 3 дня со сводкой. Решение о применении остаётся за человеком.
Результат
Первый же прогон по кампании с оплатой за клики за 30 дней:
- 36 площадок с аномальным CTR и нулём заявок;
- на них — 2 159 кликов и 26 237 ₽ расхода;
- 0 заявок с этих кликов;
- CTR по ним — от 3,3% до 65,6% (то есть каждый второй показ «кликали»);
- 30 из 36 — мобильные приложения: игры-головоломки, детские игры, VPN-клиенты.
Плюс отдельно 5 площадок на 9 674 ₽ без заявок, но с нормальным CTR — они ушли человеку на ревью, а не под нож.
Заодно выяснилось, что расход гипер-сконцентрирован: топ-50 площадок — это 89% бюджета. Деньги сливали десятки площадок, а не тысячи. Значит, раздувать блок-лист бессмысленно — гораздо сильнее работает перевод кампании на оплату за конверсии, где клик-фрод перестаёт стоить денег. Сканер подтвердил это цифрами: на кампании-близнеце с оплатой за лиды тот же скрипт нашёл ровно одну подозрительную площадку с расходом 0 ₽.
Что здесь сделала нейросеть: не «написала текст», а за один вечер собрала работающий инструмент — разобралась с капризным API, задала критерии отсева, оформила регулярную процедуру. Дальше он работает сам и раз в три дня приносит список площадок, которые можно выключить одной командой.