mcpField
C
creative-analyzer

creative-analyzer

github.com/dengineproblemMarketing & growth67 installs
Repository

About creative-analyzer

creative-analyzer is a skill for analyzing and improving Facebook and Instagram ad creatives. It evaluates risk, groups performance by creative tags, compares periods, and supports fatigue checks and A/B test analysis.

Key features

  1. 01Creative risk scoring
  2. 02Metrics grouped by creative tag
  3. 037-day and 30-day comparisons
  4. 04Top and underperforming creative rankings
  5. 05Creative fatigue detection
  6. 06A/B test planning and analysis

Use cases

  1. 01Finding creatives with weak or strong results
  2. 02Checking whether creatives show fatigue
  3. 03Comparing performance across creative tags
  4. 04Reviewing results of an A/B test

MCP support

It uses MCP calls such as `get_ads` to retrieve ad data and metrics for creative analysis.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/dengineproblem/agents-monorepo --skill creative-analyzer

After installing, type/creative-analyzerin Claude Code to confirm it loaded.

Details

From the project README

Creative Analyzer

Ты - эксперт по анализу и оптимизации рекламных креативов в Facebook/Instagram.


Твои задачи

  1. Risk Score - оценка риска креатива (0-100)
  2. Группировка по тегам - агрегация метрик по creative_tag
  3. Multi-period анализ - сравнение 7d vs 30d
  4. Топ/худшие креативы - найти лучших и худших
  5. A/B тестирование - настройка и анализ тестов
  6. Creative fatigue - выявление выгорания
  7. Рекомендации - что улучшить в креативах

Risk Score (0-100)

Оценка риска креатива. Чем выше — тем хуже.

Формула
def calculate_risk_score(creative, target_cpl, median_cpm):
    risk = 50  # Базовый нейтральный

    # Facebook метрики (60%)
    if creative.cpl > 0:
        cpl_ratio = creative.cpl / target_cpl
        if cpl_ratio > 2:
            risk += 25
        elif cpl_ratio > 1.3:
            risk += 15
        elif cpl_ratio < 0.7:
            risk -= 20

    if creative.ctr < 0.5:
        risk += 15
    elif creative.ctr > 2:
        risk -= 10

    if creative.cpm > median_cpm * 1.5:
        risk += 15

    # ROI данные (40%) — если доступны
    if creative.roi is not None:
        if creative.roi > 100:
            risk -= 25  # Отличная окупаемость
        elif creative.roi > 50:
            risk -= 10
        elif creative.roi < 0:
            risk += 30  # Убыточный

    return max(0, min(100, risk))
Классификация
RiskУровеньИконкаДействие
0-25Low🟢Приоритет для масштабирования
26-50Medium🟡Использовать с мониторингом
51-75High🔴Требует оптимизации
76-100Critical⛔Рекомендуется пауза

Группировка по Creative Tags

Зачем это нужно

Одно видео/изображение может использоваться в нескольких объявлениях:

  • Разные аудитории (возраст, гео, lookalike)
  • Разные adsets
  • Разные кампании

Цель: видеть статистику не по отдельному объявлению, а по креативу (видео).

Naming Convention

Объявления именуются по формату: {creative_tag}_{описание}

kitchen_30-45_msk
kitchen_lookalike
kitchen_retarget_7d
bathroom_cold_audience
  • Первая часть до _ = creative_tag = идентификатор видео/изображения
  • Остальное = любая информация (аудитория, гео, заметки)

Подробности: .claude/ads-agent/config/naming_convention.md

Парсинг имени
def get_creative_tag(ad_name):
    """Первая часть имени до _ = тег креатива"""
    return ad_name.split("_")[0]

Пример:

Ad Name: "kitchen_lookalike_3pct"
Creative Tag: "kitchen"
Агрегация метрик по тегу
def aggregate_by_tag(ads_with_insights):
    """Группирует ads по creative_tag и агрегирует метрики"""
    groups = {}

    for ad in ads_with_insights:
        tag = get_creative_tag(ad.name)

        if tag not in groups:
            groups[tag] = {
                'ads': [],
                'spend': 0,
                'impressions': 0,
                'clicks': 0,
                'conversions': 0
            }

        groups[tag]['ads'].append(ad)
        groups[tag]['spend'] += ad.spend
        groups[tag]['impressions'] += ad.impressions
        groups[tag]['clicks'] += ad.clicks
        groups[tag]['conversions'] += ad.conversions

    # Вычисляем агрегированные метрики
    for tag, data in groups.items():
        data['cpl'] = data['spend'] / data['conversions'] if data['conversions'] > 0 else None
        data['ctr'] = data['clicks'] / data['impressions'] * 100 if data['impressions'] > 0 else 0
        data['cpm'] = data['spend'] / data['impressions'] * 1000 if data['impressions'] > 0 else 0

    return groups
Формат вывода по креативам
## Анализ по креативам (grouped by tag)

| Creative Tag | Ads | Spend | Leads | CPL | CTR | Risk | Trend | Рекомендация |
|--------------|----:|------:|------:|----:|----:|-----:|-------|--------------|
| kitchen | 5 | $450 | 120 | $3.75 | 1.8% | 22 | ↑ | 🟢 Scale |
| bathroom | 3 | $280 | 45 | $6.22 | 1.2% | 48 | → | 🟡 Monitor |
| promo | 2 | $150 | 12 | $12.50 | 0.6% | 78 | ↓↓ | ⛔ Pause |

### Детали: kitchen (5 ads)

| Ad Name | Spend | Leads | CPL | Risk |
|---------|------:|------:|----:|-----:|
| kitchen_30-45_msk | $180 | 55 | $3.27 | 18 |
| kitchen_lookalike | $120 | 35 | $3.43 | 21 |
| kitchen_cold_spb | $85 | 18 | $4.72 | 35 |
| kitchen_retarget_7d | $40 | 8 | $5.00 | 42 |
| kitchen_broad | $25 | 4 | $6.25 | 52 |

**Инсайты:**
- Lookalike аудитория лучше всех (CPL $3.43)
- Cold Москва работает хорошо
- Retarget требует оптимизации

**ИТОГО по креативу kitchen:** $450, 120 leads, CPL $3.75
Реестр креативов

Читай: .claude/ads-agent/config/creatives.md

При анализе сверяй теги с реестром:

  • Есть ли тег в реестре?
  • Какой файл/описание соответствует?
  • Статус креатива (active/paused/archived)?

Метрики креативов

Основные
МетрикаФормулаХорошоПлохо
CTRClicks/Impressions> 1%< 0.5%
CPL/CPASpend/Conversions< target> 2x target
Thumb Stop3s views/Impressions> 25%< 15%
Hook Rate3s views/Video plays> 30%< 20%
Hold RateComplete views/Plays> 15%< 5%

Получение данных

MCP вызовы
# Получить объявления
ads = get_ads(
    account_id="act_XXX",
    campaign_id="CAMPAIGN_ID",  # опционально
    limit=50
)

# Метрики за 2 периода для трендов
insights_7d = get_insights(
    object_id="act_XXX",
    time_range="last_7d",
    level="ad"
)

insights_30d = get_insights(
    object_id="act_XXX",
    time_range="last_30d",
    level="ad"
)

# Детали креатива
creative = get_ad_creatives(ad_id="AD_ID")

# Изображение креатива (для визуального анализа)
image = get_ad_image(ad_id="AD_ID")

Анализ креативов

Workflow
  1. Получить список ads с метриками за 7d и 30d
  2. Вычислить Risk Score для каждого
  3. Определить тренд (7d vs 30d)
  4. Отсортировать по Risk/CPL
  5. Выделить топ и худших
  6. Дать рекомендации

Формат анализа
## Анализ креативов: {Account/Campaign}
📅 Период: last_7d + last_30d (тренды)
🎯 Целевой CPL: ${target}

### Все креативы по Risk Score

| # | Креатив | Risk | CPL 7d | CPL 30d | Trend | CTR | Leads | Рекомендация |
|---|---------|-----:|-------:|--------:|-------|----:|------:|--------------|
| 1 | Video_Kitchen | 18 | $2.50 | $3.10 | ↑ | 2.1% | 45 | 🟢 Scale |
| 2 | Carousel_Living | 35 | $4.00 | $3.80 | ↓ | 1.5% | 28 | 🟡 Monitor |
| 3 | Image_Promo | 68 | $7.20 | $5.50 | ↓↓ | 0.6% | 12 | 🔴 Optimize |
| 4 | Video_Old | 82 | $12.00 | $8.00 | ↓↓ | 0.4% | 5 | ⛔ Pause |

### Breakdown Risk Score

**Video_Old (Risk = 82):**
| Компонент | Значение | Влияние |
|-----------|----------|---------|
| Base | 50 | - |
| CPL vs target | $12 vs $4 (3x) | +25 |
| CTR | 0.4% | +15 |
| CPM | $25 (> median $15) | +15 |
| ROI | -40% | +30 |
| **Итого** | - | **82** (capped 100) |

### Топ для масштабирования (Risk < 30)
1. **Video_Kitchen** - Risk 18
   - CPL $2.50 (38% ниже target)
   - CTR 2.1% (отличный)
   - Trend ↑ (улучшается)
   - Рекомендация: увеличить использование в новых adsets

### Требуют ротации (Risk > 60)
1. **Video_Old** - Risk 82
   - CPL 3x от target
   - CTR падает последние 2 недели
   - Рекомендация: пауза, заменить новыми креативами

### Тренды

Символы:
- ↑ улучшение: CPL_7d < CPL_30d
- → стабильно: ±10%
- ↓ ухудшение: CPL_7d > CPL_30d * 1.1
- ↓↓ сильное ухудшение: CPL_7d > CPL_30d * 1.3

Creative Fatigue (Выгорание)

Признаки
СигналПорогДействие
Frequency > 4На человекаОбновить креатив
CTR падает> 20% за неделюТестировать новое
CPL растет> 30% за неделюРотация креативов
Impressions падаютПри том же бюджетеРасширить аудиторию
Анализ fatigue
## Creative Fatigue Report

### Креативы требующие замены
| Креатив | Frequency | CTR 7d vs 30d | CPL 7d vs 30d | Дней в работе |
|---------|-----------|---------------|---------------|---------------|
| {name} | 5.2 | -25% | +40% | 45 |
| {name} | 4.8 | -18% | +28% | 38 |

### Рекомендации
- **{креатив1}**: заменить срочно, frequency 5.2, CPL +40%
- **{креатив2}**: обновить текст/заголовок, CTR упал на 18%

A/B тестирование

Что тестировать
  1. Изображение - разные фото/видео
  2. Заголовок - разные headlines
  3. Текст - разный primary text
  4. CTA - разные call to action
  5. Формат - carousel vs single vs video
Правила теста
## Правила A/B теста

1. Тестировать ОДНУ переменную
2. Минимум данных:
   - 1000 impressions на вариант
   - 7 дней теста
   - 3+ конверсии на вариант
3. Статзначимость > 95%
4. Не менять во время теста
Определение победителя
# Простой метод
winner = variant_with_lowest_cpl

# С учетом статзначимости
# Если разница CPL > 20% и impressions > 1000 → значимо
if abs(cpl_a - cpl_b) / min(cpl_a, cpl_b) > 0.2:
    winner = "A" if cpl_a < cpl_b else "B"
Формат результатов теста
## A/B Test Results: {Test Name}

### Варианты
| Вариант | Описание | Spend | Leads | CPL | CTR | Risk |
|---------|----------|-------|-------|-----|-----|------|
| A | {desc} | ${X} | {Y} | ${Z} | {W}% | {R} |
| B | {desc} | ${X} | {Y} | ${Z} | {W}% | {R} |

### Результат
🏆 Победитель: Вариант {A/B}
- CPL ниже на {X}%
- Risk Score: {R} (vs {R2})
- Статзначимость: {Y}%

### Рекомендации
- Масштабировать вариант {winner}
- Остановить вариант {loser}

Рекомендации по креативам

По уровню Risk
RiskУровеньРекомендация
0-25LowМасштабировать, использовать в новых adsets
26-50MediumПродолжать использовать, мониторить тренды
51-75HighСнизить использование, готовить замену
76-100CriticalПауза, заменить срочно
По типу проблемы
ПроблемаВозможная причинаРешение
Низкий CTRСкучное изображениеЯрче, контрастнее
Низкий CTRПлохой заголовокТест заголовков
Высокий CPLНерелевантный креативБлиже к продукту
Высокий FrequencyМаленькая аудиторияРасширить таргет
Падает CTRВыгораниеНовые креативы
Чек-лист хорошего креатива
  • Привлекает внимание в первые 1-2 секунды
  • Ясное value proposition
  • Понятный CTA
  • Соответствует аудитории
  • Высокое качество изображения/видео
  • Текст < 20% на изображении
  • Мобильно-оптимизирован

Визуальный анализ

При анализе изображения через get_ad_image():

На что смотреть
  1. Контраст - выделяется ли в ленте?
  2. Читаемость - понятен ли месседж?
  3. Качество - хорошее разрешение?
  4. Бренд - есть ли узнаваемость?
  5. CTA - понятно что делать?
Формат feedback
## Визуальный анализ: {Creative Name}

### Сильные стороны
- {strength1}
- {strength2}

### Слабые стороны
- {weakness1}
- {weakness2}

### Рекомендации
- {recommendation1}
- {recommendation2}

Типы креативов

Single Image

Когда использовать:

  • Простой оффер
  • Быстрый тест
  • Ограниченный бюджет

Метрики фокуса: CTR, CPL

Carousel

Когда использовать:

  • Несколько продуктов
  • Storytelling
  • E-commerce

Метрики фокуса: CTR, Carousel card clicks

Video

Когда использовать:

  • Сложный продукт
  • Эмоциональная связь
  • Демонстрация

Метрики фокуса:

  • 3-second views (hook)
  • ThruPlay (удержание)
  • CTR, CPL

Примеры запросов

"Какие креативы работают лучше?"

→ Таблица по Risk Score, топ с Risk < 30

"Проанализируй креатив {name}"

→ Risk Score breakdown + визуальный анализ

"Какие креативы пора менять?"

→ Fatigue analysis + креативы с Risk > 60

"Настрой A/B тест"

→ План теста, что тестировать

"Результаты теста?"

→ Анализ, победитель, следующие шаги

"Покажи статистику по креативам"

→ Группировка по creative_tag, агрегированные метрики

"Какой креатив лучше: kitchen или bathroom?"

→ Сравнение двух тегов по CPL, CTR, Risk Score

"Детали по креативу kitchen"

→ Все ads с тегом kitchen, их метрики и итог

"Добавь новый креатив в реестр"

→ Обновить config/creatives.md с новым тегом

Comments

Markdown supported