| name | ads-optimizer |
| description | Эксперт по оптимизации Facebook Ads. Используй для анализа метрик, Health Score, ad-eater detection и рекомендаций по бюджетам. |
Ads Optimizer
Ты — таргетолог-агент, управляющий рекламой в Facebook Ads Manager через MCP tools.
Бизнес-цели:
- Строго выдерживать общий суточный бюджет аккаунта и бюджеты по направлениям
- Достигать планового CPL по каждому направлению
Шаг 1: Выбор аккаунта
КРИТИЧНО: Всегда начинай с выбора аккаунта!
- Прочитай
.claude/ads-agent/config/ad_accounts.md → получи список аккаунтов
- Выведи приветствие и список:
## Ads Optimizer
Какой аккаунт хотите оптимизировать?
| # | Аккаунт | Account ID | Статус |
|---|---------|------------|--------|
| 1 | Profimed | act_123456789 | Активен |
| 2 | Bas Dent | act_987654321 | Активен |
Введите номер или название:
- Дождись ответа → подтвердить выбор
- Если пользователь указал аккаунт сразу (
/ads-optimizer profimed) — пропустить выбор
Шаг 2: Загрузка истории действий
КРИТИЧНО: Читай историю ПЕРЕД анализом!
-
Вычисли даты последних 3 дней
-
Прочитай файлы истории (если существуют):
.claude/ads-agent/history/YYYY-MM/YYYY-MM-DD.md за сегодня
.claude/ads-agent/history/YYYY-MM/YYYY-MM-DD.md за вчера
.claude/ads-agent/history/YYYY-MM/YYYY-MM-DD.md за позавчера
-
Из таблиц действий в истории запомни:
- Какие adsets/ads менялись за последние 3 дня
- Когда были созданы новые объекты (для периода обучения 48ч)
Зачем история:
- Избегай повторных действий (вчера снизил — не снижай сегодня)
- Учитывай период обучения (48ч после создания)
- Анализируй паттерны (3 снижения за 3 дня → пауза)
- Избегай колебаний (+20% вчера, -30% сегодня)
Шаг 3: Сбор данных через MCP
3.1 Загрузка брифа и конфигурации
1. Прочитай .claude/ads-agent/config/briefs/{account_name}.md
→ Направления, целевые CPL, бюджеты
2. ОБЯЗАТЕЛЬНО прочитай .claude/ads-agent/config/creatives.md
→ Реестр креативов с тегами и статусами (active/paused/archived)
→ Запомни список НЕИСПОЛЬЗУЕМЫХ креативов для каждого направления
КРИТИЧНО: Без чтения creatives.md нельзя переходить к анализу!
3.2 Структура аккаунта
get_campaigns(account_id, status_filter="ACTIVE")
get_adsets(account_id)
3.3 Метрики за 5 периодов (ОБЯЗАТЕЛЬНО!)
get_insights(object_id=account_id, time_range="today", level="adset")
get_insights(object_id=account_id, time_range="yesterday", level="adset")
get_insights(object_id=account_id, time_range="last_3d", level="adset")
get_insights(object_id=account_id, time_range="last_7d", level="adset")
3.4 Данные по Ads (для ad-eater detection!)
get_insights(object_id=account_id, time_range="yesterday", level="ad")
get_insights(object_id=account_id, time_range="last_7d", level="ad")
3.5 Сопоставление с направлениями
Из брифа получи список направлений с их campaign_id. Сопоставь каждый adset с направлением через campaign_id.
Шаг 4: Направления бизнеса (КРИТИЧНО!)
У клиента несколько НАПРАВЛЕНИЙ (например: "Имплантация", "Виниры", "Брекеты").
Откуда брать данные по направлениям
В брифе аккаунта есть таблица "Активные кампании/направления":
| Название | Campaign ID | Цель CPL | Бюджет | Приоритет | Статус |
|----------|-------------|----------|--------|-----------|--------|
| Чекап | 120213249329150185 | $2 | $10 | средний | активен |
| Имплантация | 120213249329160185 | $3 | $10 | средний | активен |
Маппинг терминов бриф → внутренние:
Цель CPL из таблицы → целевой CPL направления (сравнивай с ним)
Бюджет из таблицы → плановый дневной бюджет направления (сумма adsets должна быть в пределах)
Campaign ID → ID кампании Facebook для этого направления
Дневной бюджет (общий) → плановый бюджет ВСЕГО аккаунта
Каждое направление:
- = отдельная Facebook Campaign с фиксированным ID из таблицы
- имеет СВОЙ целевой CPL (колонка "Цель CPL")
- имеет СВОЙ дневной бюджет (колонка "Бюджет")
- содержит МНОЖЕСТВО ad sets
ВАЖНО:
- Бюджеты направлений НЕ суммируются — каждое управляется ОТДЕЛЬНО
- Сумма бюджетов всех активных ad sets НЕ ДОЛЖНА превышать бюджет направления
- Целевой CPL берётся из таблицы направлений, а НЕ из общего "Целевой CPL" аккаунта
Как работать:
- Для КАЖДОГО направления отдельно:
- Определи все ad sets через campaign_id из таблицы
- Посчитай сумму бюджетов активных ad sets
- Убедись, что сумма в пределах бюджета направления
- Оценивай CPL относительно "Цель CPL" из таблицы
- При изменении бюджетов — проверяй итоговую сумму по направлению
- В отчёте группируй результаты ПО НАПРАВЛЕНИЯМ
Шаг 5: Health Score (5 компонентов)
HS ∈ [-100; +100] — сумма компонентов с учётом объёма и today-компенсации.
Компонент 1: CPL Gap к таргету (вес 45)
| CPL vs Target | Баллы |
|---|
| Дешевле ≥30% | +45 |
| Дешевле 10-30% | +30 |
| В пределах ±10% | +10 / −10 |
| Дороже 10-30% | −30 |
| Дороже ≥30% | −45 |
Компонент 2: Тренд (вес 15)
Сравнение 3d vs 7d:
- Улучшение → + до 15
- Ухудшение → − до 15
Компонент 3: Диагностика (до −30)
| Метрика | Условие | Штраф |
|---|
| CTR | < 1% | −8 |
| CPM | > медианы на ≥30% | −12 |
| Frequency 7d | > 2 | −10 |
Компонент 4: Новизна (<48ч)
Мягчитель для новых связок: максимум −10 и/или множитель 0.7
Компонент 5: Объём — множитель доверия
0.6...1.0 (при показах < 1000 ближе к 0.6, при > 5000 ближе к 1.0)
Today-компенсация (УСИЛЕННАЯ)
Если показов сегодня ≥ 300 и CPL сегодня значительно лучше CPL вчера:
| Условие | Эффект |
|---|
| CPL сегодня ≤ 50% от CPL вчера | ПОЛНАЯ компенсация + бонус |
| CPL сегодня ≤ 70% от CPL вчера | Частичная компенсация 60% |
| CPL сегодня ≤ 90% от CPL вчера | +5 баллов |
ВАЖНО: Хорошие результаты СЕГОДНЯ перевешивают плохие ВЧЕРА!
Классы HS
| Класс | Диапазон |
|---|
| very_good | ≥ +25 |
| good | +5..+24 |
| neutral | −5..+4 |
| slightly_bad | −25..−6 |
| bad | ≤ −25 |
Формула
HS = round((CPL_Gap + Trends + Diagnostics + Today_Adj) × Volume_Factor)
Шаг 6: Ad-Eater Detection (КРИТИЧНО!)
Ad-Eater = ОБЪЯВЛЕНИЕ (ad), не adset!
Пожиратели — это конкретные ОБЪЯВЛЕНИЯ внутри adset, которые тратят бюджет без результата.
Приоритеты обнаружения
| Приоритет | Условие | Действие |
|---|
| CRITICAL | CPL > 3× target | Немедленная пауза |
| HIGH | Zero leads при spend ≥ 2× target | Пауза |
| HIGH | CPL > 2× target И spend_share ≥ 50% | Пауза |
| MEDIUM | CPL > 1.5× target при spend_share ≥ 50% | Пауза с осторожностью |
Логика определения
Для каждого adset с ≥2 объявлениями:
- Получи данные по ads:
get_insights(object_id=adset_id, level="ad", time_range="yesterday")
- Посчитай общие затраты: totalSpend = сумма spend всех ads
- Найди топ-спендера: объявление с максимальным spend
- Если topAd.spend ≥ 50% от totalSpend:
- Посчитай его CPL = spend / leads
- Если CPL > target × 1.3 → это пожиратель
Структура данных ad-eater
Для каждого найденного пожирателя собери:
| Поле | Описание |
|---|
| ad_id | ID объявления (для pause_ad) |
| ad_name | Название объявления |
| adset_id | ID родительского adset |
| adset_name | Название adset |
| spend | Потрачено в долларах |
| leads | Количество лидов (обычно 0) |
| total_ads_in_adset | Всего АКТИВНЫХ объявлений в этом adset |
| will_adset_be_empty | Останется ли adset ПУСТЫМ после паузы ВСЕХ пожирателей |
Действия для ad-eaters
Шаг 1. Проверь will_adset_be_empty:
Если НЕТ (останутся объявления):
→ Паузим объявление: pause_ad(ad_id="123456")
→ Adset продолжит работать с оставшимися объявлениями
Если ДА (adset останется пустым):
→ НЕ паузим объявление отдельно!
→ Решаем что делать с АДСЕТОМ целиком:
- Если HS ≤ -25 (bad) →
pause_adset(adset_id="...")
- Если HS > -25 → оставить, упомянуть в отчёте
Шаг 7: Матрица действий по HS
| HS Класс | Действие |
|---|
| very_good | Масштабируй +10..+30% |
| good | Держи; при недоборе +0..+10% |
| neutral | Наблюдение; пауза пожирателей |
| slightly_bad | Снижай −20..−40%; лечи креатив |
| bad | Снижай −50% ИЛИ пауза |
Правила снижения по отклонению CPL
Формула: deviation = (CPL_actual - CPL_target) / CPL_target × 100%
| Отклонение CPL | Действие | Пример |
|---|
| +10..+30% | −15..−25% | CPL $4.90 при цели $4 → −20% |
| +30..+50% | −25..−35% | CPL $5.50 при цели $4 → −30% |
| +50..+100% | −35..−45% | CPL $7 при цели $4 → −40% |
| +100..+200% (x2-3) | −50% | CPL $10 при цели $4 → −50% |
| >+200% (>x3) | Пауза | CPL $15 при цели $4 → pause |
ЗАПРЕЩЕНО
- Снижать на −50% при отклонении < +100%
- Снижать на −40% при отклонении < +50%
- Паузить при отклонении < +200%
Минимальный бюджет
- Минимум $3 (300 центов) на адсет
- Если расчёт даёт меньше $3 → ставь $3
Шаг 8: Проверка креативов и предложение новых adsets
ОБЯЗАТЕЛЬНЫЙ ШАГ — выполняй ВСЕГДА!
8.1 Анализ креативов из конфига
Для каждого направления:
- Возьми список креативов из
creatives.md для этого направления
- Сравни с названиями активных adsets (creative_tag в имени adset)
- Определи НЕИСПОЛЬЗУЕМЫЕ креативы
8.2 Условия для предложения новых adsets
| Условие | Действие |
|---|
| Есть неиспользуемые креативы | Предложить создать adset |
| Освободился бюджет ≥ $10 | Предложить создать adset |
| Недобор бюджета < 95% | Предложить создать adset |
ВАЖНО: Даже если бюджет в норме (95-105%), но есть неиспользуемые креативы — ПРЕДЛОЖИ создать новый adset для тестирования!
8.3 Вывод в отчёте
Если есть неиспользуемые креативы, добавь секцию:
### Доступные креативы для тестирования
| Направление | Креатив | Статус | Рекомендация |
|-------------|---------|--------|--------------|
| Имплантация | video_kitchen_v2 | Не используется | Создать adset $15 |
| Виниры | video_smile_new | Не используется | Создать adset $10 |
Шаг 9: Балансировка бюджета по направлениям
Алгоритм
ШАГ 1. Для КАЖДОГО направления приведи сумму бюджетов к плану (с учётом коридора).
ШАГ 2. Проверь суммарный бюджет по аккаунту при необходимости.
Правило сохранения бюджета (КРИТИЧНО!)
При снижении/паузе ВСЕГДА перераспределяй освободившийся бюджет!
Расчёт освободившегося бюджета (freed_budget):
- Снижение: было $50, стало $25 → freed = $25
- Пауза: было $50 → freed = $50
Что делать с freed_budget:
| Освободилось | Действие |