01
Правила в отдельном файле
Слово, основа, категория, область
Каждое минус-слово хранится с категорией (площадки, чужие услуги, чужие имена, информационные запросы, чужое гео) и областью действия: все кампании или одна. Ярославские города минусуются только ярославской кампании, для B2B это целевое гео.
02
Белый список и защита заявок
Слова, которые нельзя минусовать
Скрипт копит запросы, давшие заявку или старт квиза, и отбрасывает любое слово из них. Сейчас под защитой 13 запросов с заявками и 53 запроса со стартом квиза. Отдельный белый список закрывает «недорого», «дешево», «цена», «стоимость».
03
Симуляция перед заливкой
Сухой прогон по умолчанию
Без флага применения скрипт ничего не меняет, а печатает, какие слова добавит и сколько кликов и рублей из окна они бы отсекли. Заливка идёт только по команде и из крона.
04
Проверка записи
Чтение списка после заливки
Директ лемматизирует слова и часть схлопывает, пустой список ошибок успехом не считается. После заливки скрипт читает минус-слова из кабинета и пишет в лог, чего там не оказалось.
05
Очередь на ручной разбор
Скликано, но правилами не покрыто
Всё, что набрало клики и не подошло ни под одно правило, уходит в таблицу minus_review. Слова из неё человек переносит в правила осознанно, а не отсекает по цифрам.
06
Синхронизация между группами
Юбилеи → Бренд
Минус-слова личных групп автоматически зеркалятся в брендовую группу, потому что её автотаргетинг ловил небрендовый мусор. Слова «корпоратив» и «программа» в бренд не переносятся, они режут запросы вроде «денис гагарин корпоратив».