Автоматически минусуем площадки в РСЯ по правилам через Гугл Таблицы
Всем привет, одной из регулярных задач в контекстной рекламе является чистка площадок, которая иногда занимает существенное время (даже с расширениями) + требует постоянного человеческого ресурса для своевременного мониторинга, ну и это руками делать как минимум медленно, а следовательно, теряются деньги на «набор» данных по тому, что никогда не будет конвертить.
Учитывая мою страсть к автоматизации всего и вся, я решил, что соберу скрипт, который будет:
- Выгружать статистику по площадкам из Яндекс Директа за всё время.
- Находить список «плохих» площадок по моим правилам.
- Автоматически выгружать это по API внутрь Директа.
- И это делать хоть раз в 5 минут.
*Единственное, что мастера кампаний (МК и ТК) мы по-прежнему минусуем руками, по API исключение недоступно, но с новым отчетом это стало делать чуть проще.
Задача поставлена, реализуем.
Реализовывать будем через Apps Script Google: чтобы разобраться, что где находится, лучше ознакомиться с предыдущей статьей —
Что делает скрипт (логика)
- Читает настройки из листа settings: токен, логин, цели Метрики, пороги (CPL/CTR/Bounce/DRR), присутствует режим теста (чтобы вы могли проверить, перед выкаткой данных), фильтрацию площадок и что будет отправлено.
- Читает базовый список площадок для исключения из листа. Базовые список площадок (топ 300 по расходу) (берёт колонку Placement, максимум ~307 строк) — этот список собран исходя из аналитики по 50 аккаунтам за последние полгода (сортировка по убыванию расхода).
- Запрашивает отчёт по площадкам (TSV) через https://api.direct.yandex.com/json/v5/reports, агрегирует данные по ключу login + CampaignId + Placement и пишет результат в лист Placements_All.
- Дополняет Placements_All колонкой CampaignState, подтягивая статусы кампаний через https://api.direct.yandex.com/json/v5/campaigns (можно выгружать не только активные кампании и удобно смотреть статус).
- Строит «план исключений»: какие площадки исключить в каждой кампании на основе правил (база + паттерны + метрики) — на основе убывания расхода.
- Применяет изменения: для кампаний в состоянии актива, собирая финальный список как base (база) → dynamic (то, что пришло по правилам) → старые (уникальные, до 1000).
- База исключается всегда (*Базовые список площадок (топ 300 по расходу)), далее идет по убыванию расхода динамика (регулярка и метрики), а далее остаток хвоста. После набора данных динамика и старые площадки заменяются новыми, которые приносят наибольший вред в деньгах для кампании. То есть в кампаниях всегда актуальный список на основе данных.
- Записывает лог в лист Exclusions_Log и хранит его 7 дней (старые строки удаляются).
Какие листы нужны в Google Sheets
В таблице должны быть (названия важны):
- settings — ввод параметров и логинов.
- Базовые список площадок (топ 300 по расходу) — базовый «чёрный список», колонка Placement (можно менять, тогда база будет больше, а список динамических правил и старых площадок сократится).
- Placements_All — создаётся/перезаписывается скриптом (вывод).
- Exclusions_Log — создаётся/пополняется скриптом (лог) - будет указано что добавлено (уникальное + причину по которой эта площадка попала в список).
Переменные и что заполнять
Листе settings (каждая строка = отдельный аккаунт/логин).
Обязательные колонки в settings
- login — произвольный идентификатор строки/аккаунта (используется в ключах и логах).
- token — OAuth-токен Яндекс.Директа (старая ссылка *без организации — https://oauth.yandex.ru/authorize?response_type=token&client_id=db0084b785964e89908f2b32e246f1de, новая с организацией — https://oauth.yandex.ru/authorize?response_type=token&client_id=db0084b785964e89908f2b32e246f1de&force_confirm=true).
- goal_ids — список целей Метрики для конверсий/дохода (разделители: запятая/пробел/; максимум 10).
Опциональные колонки в settings
- client_login — если работаете по агентскому токену, сюда логин клиента (просто продублировать логин, если у вас режим организации).
- test_mode — если 1/true/yes/да/on, то скрипт не применяет Campaigns.update, а только пишет в лог «TEST: бы поставил…».
- report_only_active_campaigns — если true, отчёт строится только по кампаниям ON (скрипт сначала получает список активных) — использовать только если нужно посмотреть старые данные по остановленным кампаниям.
- include_zero_cost — если true, строки с нулевой стоимостью могут попадать в обработку при наличии кликов (иначе нулевые расходы отбрасываются) — полезно для ОЗК кампаний, но обычно решаем через https://vc.ru/marketing/2615329-obuchenie-rk-na-chistyh-lidah-i-ekonomiya-na-frod-ploshhadkah.
- exclude_campaign_ids — список ID кампаний, которые никогда не трогаем (разделители как выше) — полезно если не хотите минусовать конкретную РК.
Пороги (если пусто — правило не применяется):
- cpl_multiplier — исключать площадку, если её CPL > (CPL конкретной кампании * множитель — для великолепного правила x3 CPL).
- zeroconv_cpl_multiplier — множитель CPL (сколько должна потратить площадка при нуле конверсий чтобы мы ее отключили).
- ctr_limit и ctr_min_impr — исключать, если CTR площадки выше ctr_limit и показов не меньше ctr_min_impr (тут учесть, что поиск тоже может попадать, поэтому на базе исключения я внедрил запрет на площадки Яндекса).
- bounce_limit и bounce_min_clicks — исключать, если отказы выше bounce_limit и кликов не меньше bounce_min_clicks.
- drr_limit_pct и drr_min_conv — исключать, если DRR% = cost/revenue*100 выше drr_limit_pct и конверсий не меньше drr_min_conv (если не задано — по умолчанию 10 для стат. достоверности).
Диапазон дат (глобально для всех строк settings, если есть колонки и заполнены хотя бы в одной строке):
- date_from (дата от) и date_to (по какую дату) в формате YYYY-MM-DD (или как Date-ячейки) — включают режим CUSTOM_DATE; иначе используется «За всё время».
База и «жёсткие списки» в коде (как работают).
- BASE_EXCLUDE_SHEET/Placement: всё из базы всегда на исключение (как причина BASE_EXCLUDE) — это наш список на листе: Базовые список площадок (топ 300 по расходу).
- BAD_PREFIXES_RE: площадки, совпадающие с regex (game, vpn, dsp, com. и прочее), исключаются по причине BAD_PREFIX.
- HARD_WHITELIST: гасит только правило BAD_PREFIX, то есть он не будет применен по маскам из BAD_PREFIXES_RE (но по CPL/CTR/BOUNCE/DRR/BASE_EXCLUDE площадка всё равно может улететь, что логично).
- HARD_ALLOWLIST: площадки из этого списка никогда не исключаются (нужно, чтобы исключить ресурсы Яндекса для поиска).
- Лимит исключаемых площадок в Директе соблюдается через EXCLUDED_SITES_LIMIT = 1000.
Пошаговый план запуска
- Скопировать мой Google Sheet https://docs.google.com/spreadsheets/d/1ka_b_C-XuoaOfZ09GnyXgSIkGa3oVxY5kRNgCiZKU6g/edit?usp=sharing (там уже заложен скрипт).
- Заполнить строки settings для каждого аккаунта/клиента: токен, goal_ids, (при агентском доступе) client_login.
- Скорректировать (если нужно) список базовых площадок на исключение, но не советую трогать, все остальные правила быстро заминусуют вам площадки до тех.лимита.
- В Google Apps Script запустить код. Дать доступы на редактирование скрипту, запросит при первом запуске. Первый прогон сделать с test_mode = true, чтобы увидеть в Exclusions_Log, что именно будет добавлено, не меняя кампании.
- Проверить лист Placements_All (агрегация) и Exclusions_Log (что планируется добавить, причины и объёмы). Также рекомендую замерить время выполнения скрипта, от этого вы будете выставлять временной триггер (не рекомендую опускаться ниже 5 минут).
- Если всё корректно — выключить test_mode (поставить пусто/false) и запустить main() повторно для реального применения Campaigns.update.
- Настроить триггер (например, каждые 5 минут на main() в Apps Script, если нужна регулярная авто-очистка площадок.
Если хотите скорректировать список исключенных приложений, то найдете в коде строку: constBAD_PREFIXES_RE = /(otkritkionline|pozdravleniya|sudoku|balls|prikol|solitaire|blastmania|race|\.android|klondike|app\.|hexasort|huawei|shooter|crossword|\.card|com\.|dsp|game|puzzle|vpn|gdz|gia|io\.)/i;
Сюда можно докинуть маски, которые будут исключены по базовому правилу очистки от фрода. Эти площадки на дистанции хоть и могут давать единичных лидов, но после проверки качества они обычно оказываются «пустыми».
Если нужно скорректировать вайт листы:
То просто допишите их сюда в том виде, в котором они есть. Напомню, что HARD_WHITELIST — площадки, которые не исключаются по регулярному выражению, но исключаются по метрикам, а вот HARD_ALLOWLIST — не исключается никогда.
Рекомендации/замечания:
- Замерьте время выполнения скрипта, должно быть меньше 6 минут на выполнение — иначе упираемся в квоту Apps Script.
- Док лучше дублировать на каждый проект и использовать не более 2-3 логинов (на большем количестве не проверял).
- Я не тестировал массово залив с 1 аккаунта Гугла, но раз в полчаса делается стабильно уже на 5 проектах.
- Если хотите сократить или, наоборот, расширить список базовых площадок для 100% исключения, то нужно поменять кусок кода const BASE_EXCLUDE_MAX = 307; — количество строк без первичного заголовка.
- Пользуйтесь тестовым режимом, чтобы проверить, что конкретно отдается в рекламную кампанию.
- После выкатки скрипта в бой проверьте историю изменений.
- Периодически отслеживайте результаты минусовки.
- Триггер по времени ставьте от 5 минут, реже не надо, скорее всего, смысла нет. Лучше уменьшите со старта бюджет кампании с последующим увеличением.
- Изменения ставятся только на активные кампании — это заложено в логике скрипта, учтите это.
- Все площадки нормализируются: www и без www — одна и та же площадка (нужно для логики дублей).
- В проектах с оплатой за покупки или квал.лиды неважно, какая площадка, поэтому я бы по умолчанию там скрипт не использовал.
- МК и ТК по-прежнему минусуем руками, других способов на данный момент пока нет.
- Любые баги и доработки пишите комментариями в чат или мой тг (тг, думаете, найдете сами).
Всем успехов, надеюсь, помог снять существенную часть работы и сделать вашу работу чуточку проще.