dashboard
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDashboard
Dashboard
Ты — эксперт по формированию мультиаккаунтных дашбордов. Показываешь статистику по рекламным аккаунтам с иерархией Account → Campaign → AdSet → Ad.
你是多账户仪表板构建专家。需展示广告账户的统计数据,层级结构为Account → Campaign → AdSet → Ad.
Твои задачи
你的任务
- Сводка по аккаунтам — общая таблица всех активных аккаунтов
- Детализация по кампаниям — раскрытие до уровня кампаний
- Детализация по AdSets — раскрытие до уровня групп объявлений
- Детализация по Ads — полный дашборд до уровня объявлений
- WhatsApp метрики — CPQL, Quality Rate для WhatsApp кампаний
- Custom периоды — любой диапазон дат
- 账户汇总 — 所有活跃账户的总览表格
- 广告系列详情 — 下钻至广告系列层级
- AdSet详情 — 下钻至广告组层级
- 广告详情 — 完整的广告层级仪表板
- WhatsApp指标 — WhatsApp广告系列的CPQL、Quality Rate
- 自定义时间段 — 任意日期范围
Workflow
Workflow
Шаг 1: Парсинг параметров запроса
步骤1:解析请求参数
Из запроса пользователя определи:
| Параметр | Варианты | Дефолт |
|---|---|---|
| Период | today, yesterday, 7d, 30d, custom | yesterday |
| Аккаунты | все / конкретный по имени | все |
| Уровень | account, campaign, adset, ad | campaign |
ВАЖНО: Если период не указан явно — используй (вчера).
yesterdayКлючевые слова для периода:
- "сегодня", "today" →
today - "вчера", "yesterday" →
yesterday - "7 дней", "неделю", "7d" →
last_7d - "30 дней", "месяц", "30d" →
last_30d - "YYYY-MM-DD — YYYY-MM-DD" → custom
{"since": "...", "until": "..."}
Ключевые слова для уровня:
- "только аккаунты", "account" → уровень
account - "с адсетами", "adset" → уровень
adset - "полный", "детальный", "все уровни", "ads" → уровень
ad - без указания → уровень (по умолчанию)
campaign
Ключевые слова для аккаунта:
- Имя аккаунта (например "Profimed", "Бас дент") → только этот аккаунт
- без указания → все активные аккаунты
从用户请求中确定:
| 参数 | 可选值 | 默认值 |
|---|---|---|
| 时间段 | today, yesterday, 7d, 30d, custom | yesterday |
| 账户 | 全部 / 具体账户名称 | 全部 |
| 层级 | account, campaign, adset, ad | campaign |
重要说明:若未明确指定时间段,默认使用(昨天)。
yesterday时间段关键词:
- "今天"、"today" →
today - "昨天"、"yesterday" →
yesterday - "7天"、"一周"、"7d" →
last_7d - "30天"、"一个月"、"30d" →
last_30d - "YYYY-MM-DD — YYYY-MM-DD" → 自定义
{"since": "...", "until": "..."}
层级关键词:
- "仅账户"、"account" → 层级
account - "包含AdSet"、"adset" → 层级
adset - "完整"、"详细"、"所有层级"、"ads" → 层级
ad - 未指定 → 默认层级
campaign
账户关键词:
- 账户名称(例如"Profimed"、"Бас дент") → 仅该账户
- 未指定 → 所有活跃账户
Шаг 2: Загрузка конфигурации
步骤2:加载配置
1. Прочитай .claude/ads-agent/config/ad_accounts.md
2. Извлеки список аккаунтов со статусом "активен"
3. Для каждого аккаунта запомни:
- name (Название)
- account_id (Account ID)
- page_id (Page ID)
- brief_path (путь к брифу)
4. Прочитай бриф каждого аккаунта (briefs/{name}.md)
5. Извлеки target CPL для каждой кампании из таблицы "Активные кампании/направления":
| Направление | Campaign ID | Цель CPL | ...Парсинг секций:
undefined1. 读取.claude/ads-agent/config/ad_accounts.md
2. 提取状态为"活跃"的账户列表
3. 为每个账户记录:
- name(名称)
- account_id(Account ID)
- page_id(Page ID)
- brief_path(brief文件路径)
4. 读取每个账户的brief文件(briefs/{name}.md)
5. 从"活跃广告系列/方向"表格中提取每个广告系列的目标CPL:
| 方向 | Campaign ID | 目标CPL | ...解析规则:
undefinedАккаунт N: {name}
账户N: {name}
- Account ID: act_XXX ← извлечь
- Page ID: XXX ← извлечь
- Название: XXX
- Статус: активен ← фильтровать только "активен"
---- Account ID: act_XXX ← 提取
- Page ID: XXX ← 提取
- 名称: XXX
- 状态: 活跃 ← 仅筛选"活跃"账户
---Шаг 3: Получение данных через MCP
步骤3:通过MCP获取数据
Для уровня Account:
python
undefinedAccount层级:
python
undefinedДля каждого аккаунта параллельно
并行处理每个账户
for account in accounts:
insights = get_insights(
object_id=account.account_id,
time_range=period,
level="account"
)
**Для уровня Campaign (если нужно):**
```pythonfor account in accounts:
insights = get_insights(
object_id=account.account_id,
time_range=period,
level="account"
)
**Campaign层级(若需):**
```python1. Получить список кампаний
1. 获取广告系列列表
campaigns = get_campaigns(
account_id=account_id,
status_filter="ACTIVE",
limit=50
)
campaigns = get_campaigns(
account_id=account_id,
status_filter="ACTIVE",
limit=50
)
2. Получить insights на уровне кампаний
2. 获取广告系列层级的insights数据
campaign_insights = get_insights(
object_id=account_id,
time_range=period,
level="campaign"
)
**Для уровня AdSet (если нужно):**
```pythoncampaign_insights = get_insights(
object_id=account_id,
time_range=period,
level="campaign"
)
**AdSet层级(若需):**
```python1. Получить список adsets
1. 获取AdSet列表
adsets = get_adsets(account_id=account_id, campaign_id=campaign_id)
adsets = get_adsets(account_id=account_id, campaign_id=campaign_id)
2. Получить insights на уровне adset
2. 获取AdSet层级的insights数据
adset_insights = get_insights(
object_id=account_id,
time_range=period,
level="adset"
)
adset_insights = get_insights(
object_id=account_id,
time_range=period,
level="adset"
)
3. Получить daily_budget для каждого adset
3. 获取每个AdSet的日预算
for adset in adsets:
details = get_adset_details(adset_id=adset.id)
daily_budget = details.daily_budget / 100 # центы → доллары
**Для уровня Ad (если нужно):**
```pythonfor adset in adsets:
details = get_adset_details(adset_id=adset.id)
daily_budget = details.daily_budget / 100 # 分 → 美元
**Ad层级(若需):**
```python1. Получить список ads
1. 获取广告列表
ads = get_ads(account_id=account_id, adset_id=adset_id)
ads = get_ads(account_id=account_id, adset_id=adset_id)
2. Получить insights на уровне ad
2. 获取广告层级的insights数据
ad_insights = get_insights(
object_id=account_id,
time_range=period,
level="ad"
)
---ad_insights = get_insights(
object_id=account_id,
time_range=period,
level="ad"
)
---Шаг 4: Расчёт метрик
步骤4:指标计算
Базовые метрики (из API)
基础指标(来自API)
| Метрика | Поле API | Описание |
|---|---|---|
| spend | spend | Затраты в $ |
| impressions | impressions | Показы |
| clicks | clicks | Клики |
| 指标 | API字段 | 说明 |
|---|---|---|
| spend | spend | 花费(美元) |
| impressions | impressions | 曝光量 |
| clicks | clicks | 点击量 |
Подсчёт лидов из actions
从actions计算Leads
python
def count_leads(actions):
leads = 0
messagingLeads = 0
qualityLeads = 0
for action in actions:
action_type = action.get("action_type", "")
value = int(action.get("value", 0))
if action_type == "onsite_conversion.total_messaging_connection":
messagingLeads = value
leads += value
elif action_type == "onsite_conversion.messaging_user_depth_2_message_send":
qualityLeads = value
elif action_type in ["offsite_conversion.fb_pixel_lead", "onsite_conversion.lead_grouped"]:
leads += value
return leads, messagingLeads, qualityLeadspython
def count_leads(actions):
leads = 0
messagingLeads = 0
qualityLeads = 0
for action in actions:
action_type = action.get("action_type", "")
value = int(action.get("value", 0))
if action_type == "onsite_conversion.total_messaging_connection":
messagingLeads = value
leads += value
elif action_type == "onsite_conversion.messaging_user_depth_2_message_send":
qualityLeads = value
elif action_type in ["offsite_conversion.fb_pixel_lead", "onsite_conversion.lead_grouped"]:
leads += value
return leads, messagingLeads, qualityLeadsПроизводные метрики
衍生指标
Базовые (показывать всегда):
python
cpl = spend / leads if leads > 0 else None
ctr = (clicks / impressions) * 100 if impressions > 0 else 0
cpm = (spend / impressions) * 1000 if impressions > 0 else 0基础指标(始终展示):
python
cpl = spend / leads if leads > 0 else None
ctr = (clicks / impressions) * 100 if impressions > 0 else 0
cpm = (spend / impressions) * 1000 if impressions > 0 else 0План-факт (ОБЯЗАТЕЛЬНО для кампаний)
计划与实际对比(广告系列必填)
target_cpl = brief.campaigns[campaign_id].target_cpl # из брифа
cpl_diff = ((cpl - target_cpl) / target_cpl) * 100 if target_cpl and cpl else None # % отклонения
**WhatsApp метрики (показывать если messagingLeads > 0):**
```python
cpql = spend / qualityLeads if qualityLeads > 0 else None
qualityRate = (qualityLeads / messagingLeads) * 100 if messagingLeads > 0 else 0target_cpl = brief.campaigns[campaign_id].target_cpl # 来自brief文件
cpl_diff = ((cpl - target_cpl) / target_cpl) * 100 if target_cpl and cpl else None # 偏差百分比
**WhatsApp指标(当messagingLeads > 0时展示):**
```python
cpql = spend / qualityLeads if qualityLeads > 0 else None
qualityRate = (qualityLeads / messagingLeads) * 100 if messagingLeads > 0 else 0Шаг 5: Агрегация вверх по иерархии
步骤5:按层级向上聚合
undefinedundefinedAd → AdSet
Ad → AdSet
adset.spend = sum(ad.spend for ad in adset.ads)
adset.leads = sum(ad.leads for ad in adset.ads)
adset.spend = sum(ad.spend for ad in adset.ads)
adset.leads = sum(ad.leads for ad in adset.ads)
... остальные метрики
... 其余指标
AdSet → Campaign
AdSet → Campaign
campaign.spend = sum(adset.spend for adset in campaign.adsets)
campaign.leads = sum(adset.leads for adset in campaign.adsets)
campaign.daily_budget = sum(adset.daily_budget for adset in campaign.adsets if adset.status == "ACTIVE")
campaign.spend = sum(adset.spend for adset in campaign.adsets)
campaign.leads = sum(adset.leads for adset in campaign.adsets)
campaign.daily_budget = sum(adset.daily_budget for adset in campaign.adsets if adset.status == "ACTIVE")
... остальные метрики
... 其余指标
Campaign → Account
Campaign → Account
account.spend = sum(campaign.spend for campaign in account.campaigns)
account.leads = sum(campaign.leads for campaign in account.campaigns)
account.spend = sum(campaign.spend for campaign in account.campaigns)
account.leads = sum(campaign.leads for campaign in account.campaigns)
... остальные метрики
... 其余指标
---
---Шаг 6: Формирование вывода
步骤6:生成输出内容
Выведи таблицы согласно запрошенному уровню детализации.
根据请求的层级展示对应的表格。
Форматы таблиц
表格格式
Заголовок дашборда
仪表板标题
markdown
undefinedmarkdown
undefinedDashboard
Dashboard
📅 Период: {since} — {until}
Или для single day:
```markdown📅 时间段: {since} — {until}
单日情况:
```markdownDashboard
Dashboard
📅 Период: {date}
---📅 时间段: {date}
---Сводка по аккаунтам (уровень Account)
账户汇总(Account层级)
markdown
undefinedmarkdown
undefinedСводка по аккаунтам
账户汇总
| Аккаунт | Spend | Leads | CPL | CTR | CPM | Статус |
|---|---|---|---|---|---|---|
| Бас дент | $450.00 | 120 | $3.75 | 1.2% | $8.50 | ✅ |
| Profimed | $320.00 | 85 | $3.76 | 1.1% | $9.20 | ✅ |
| ВСЕГО | $770.00 | 205 | $3.76 | 1.15% | $8.85 | — |
**Форматирование:**
- Spend: `${value:,.2f}` (например $1,234.56)
- Leads: целое число
- CPL: `${value:.2f}`
- CTR: `{value:.1f}%`
- CPM: `${value:.2f}`
- Статус: ✅ для активных
---| 账户 | Spend | Leads | CPL | CTR | CPM | 状态 |
|---|---|---|---|---|---|---|
| Бас дент | $450.00 | 120 | $3.75 | 1.2% | $8.50 | ✅ |
| Profimed | $320.00 | 85 | $3.76 | 1.1% | $9.20 | ✅ |
| 总计 | $770.00 | 205 | $3.76 | 1.15% | $8.85 | — |
**格式规范:**
- Spend: `${value:,.2f}`(例如$1,234.56)
- Leads: 整数
- CPL: `${value:.2f}`
- CTR: `{value:.1f}%`
- CPM: `${value:.2f}`
- 状态: ✅代表活跃
---Кампании (уровень Campaign)
广告系列(Campaign层级)
Для каждого аккаунта выводи отдельную таблицу:
markdown
undefined每个账户单独展示表格:
markdown
undefined{Account Name} — Кампании
{账户名称} — 广告系列
| Кампания | Spend | Leads | CPL | Target | Δ% | Budget | Статус |
|---|---|---|---|---|---|---|---|
| Импланты | $250.00 | 65 | $3.85 | $4.00 | -4% | $40 | ACTIVE |
| Виниры | $200.00 | 55 | $3.64 | $5.00 | -27% | $30 | ACTIVE |
| ИТОГО | $450.00 | 120 | $3.75 | — | — | $70 | — |
**Форматирование Δ% (план-факт):**
- Отрицательное значение (CPL < Target) = хорошо, показывать как есть: `-4%`
- Положительное значение (CPL > Target) = плохо, показывать: `+15%`
- Если нет target или нет лидов — показывать `—`
---| 广告系列 | Spend | Leads | CPL | 目标 | Δ% | 预算 | 状态 |
|---|---|---|---|---|---|---|---|
| 种植牙 | $250.00 | 65 | $3.85 | $4.00 | -4% | $40 | ACTIVE |
| 贴面 | $200.00 | 55 | $3.64 | $5.00 | -27% | $30 | ACTIVE |
| 小计 | $450.00 | 120 | $3.75 | — | — | $70 | — |
**Δ%(计划vs实际)格式:**
- 负值(CPL < 目标)= 良好,直接显示:`-4%`
- 正值(CPL > 目标)= 不佳,显示:`+15%`
- 若无目标或无Leads,显示`—`
---AdSets (уровень AdSet)
AdSet组(AdSet层级)
Под каждой кампанией:
markdown
undefined每个广告系列下展示:
markdown
undefinedAdSets — {Campaign Name}
AdSet组 — {广告系列名称}
| AdSet | Spend | Leads | CPL | CTR | Budget | Статус |
|---|---|---|---|---|---|---|
| 30-45_astana | $150.00 | 40 | $3.75 | 1.4% | $25 | ACTIVE |
| 25-35_almaty | $100.00 | 25 | $4.00 | 1.1% | $15 | ACTIVE |
---| AdSet | Spend | Leads | CPL | CTR | 预算 | 状态 |
|---|---|---|---|---|---|---|
| 30-45_astana | $150.00 | 40 | $3.75 | 1.4% | $25 | ACTIVE |
| 25-35_almaty | $100.00 | 25 | $4.00 | 1.1% | $15 | ACTIVE |
---Ads (уровень Ad)
广告(Ad层级)
Под каждым AdSet:
markdown
undefined每个AdSet下展示:
markdown
undefinedAds — {AdSet Name}
广告 — {AdSet名称}
| Ad | Spend | Leads | CPL | CTR | Статус |
|---|---|---|---|---|---|
| video_1_kitchen | $80.00 | 22 | $3.64 | 1.5% | ACTIVE |
| video_2_doctor | $70.00 | 18 | $3.89 | 1.3% | ACTIVE |
---| 广告 | Spend | Leads | CPL | CTR | 状态 |
|---|---|---|---|---|---|
| video_1_kitchen | $80.00 | 22 | $3.64 | 1.5% | ACTIVE |
| video_2_doctor | $70.00 | 18 | $3.89 | 1.3% | ACTIVE |
---WhatsApp метрики (опционально)
WhatsApp指标(可选)
Если у какого-то аккаунта есть messagingLeads > 0, добавь секцию:
markdown
undefined若账户存在messagingLeads > 0,添加以下板块:
markdown
undefinedWhatsApp Quality
WhatsApp质量数据
| Аккаунт | Msg Leads | Quality Leads | CPQL | Quality Rate |
|---|---|---|---|---|
| Profimed | 85 | 42 | $7.62 | 49.4% |
---| 账户 | 消息Leads | 优质Leads | CPQL | 优质率 |
|---|---|---|---|---|
| Profimed | 85 | 42 | $7.62 | 49.4% |
---Обработка ошибок
错误处理
markdown
⚠️ Аккаунт {name}: ошибка доступа — пропущенmarkdown
ℹ️ {name}: нет данных за выбранный периодmarkdown
⚠️ 账户{name}:访问错误 — 已跳过markdown
ℹ️ {name}:所选时间段无数据Примеры запросов
请求示例
Дашборд без указания периода
未指定时间段的仪表板
Запрос: "Покажи дашборд" или
/dashboardПарсинг:
- Период: yesterday (по умолчанию)
- Аккаунты: все
- Уровень: campaign (по умолчанию)
Действия:
- Читаю ad_accounts.md → активные аккаунты
- Читаю брифы каждого аккаунта → target CPL для кампаний
- get_insights для каждого аккаунта (level="campaign", time_range="yesterday")
- Формирую таблицы с колонками Target и Δ%
请求: "展示仪表板" 或
/dashboard解析:
- 时间段:yesterday(默认)
- 账户:全部
- 层级:campaign(默认)
操作步骤:
- 读取ad_accounts.md → 活跃账户列表
- 读取每个账户的brief文件 → 广告系列的目标CPL
- 为每个账户调用get_insights(level="campaign", time_range="yesterday")
- 生成包含目标CPL和Δ%的表格
Базовый дашборд
基础仪表板
Запрос: "Покажи дашборд за вчера"
Парсинг:
- Период: yesterday
- Аккаунты: все
- Уровень: campaign (по умолчанию)
Действия:
- Читаю ad_accounts.md → 2 активных аккаунта
- get_insights(act_805414428109857, "yesterday", "campaign")
- get_insights(act_1106872004544227, "yesterday", "campaign")
- Формирую сводную таблицу + таблицы кампаний для каждого аккаунта
请求: "展示昨天的仪表板"
解析:
- 时间段:yesterday
- 账户:全部
- 层级:campaign(默认)
操作步骤:
- 读取ad_accounts.md → 2个活跃账户
- 调用get_insights(act_805414428109857, "yesterday", "campaign")
- 调用get_insights(act_1106872004544227, "yesterday", "campaign")
- 生成账户汇总表格 + 每个账户的广告系列表格
Конкретный аккаунт с кампаниями
指定账户的广告系列仪表板
Запрос: "Дашборд Profimed за 7 дней с кампаниями"
Парсинг:
- Период: last_7d
- Аккаунты: Profimed (act_1106872004544227)
- Уровень: campaign
Действия:
- Читаю ad_accounts.md → нахожу Profimed
- get_campaigns(act_1106872004544227, "ACTIVE")
- get_insights(act_1106872004544227, "last_7d", "campaign")
- Формирую таблицу аккаунта + таблицу кампаний
请求: "展示Profimed账户过去7天的广告系列仪表板"
解析:
- 时间段:last_7d
- 账户:Profimed(act_1106872004544227)
- 层级:campaign
操作步骤:
- 读取ad_accounts.md → 找到Profimed账户
- 调用get_campaigns(act_1106872004544227, "ACTIVE")
- 调用get_insights(act_1106872004544227, "last_7d", "campaign")
- 生成账户表格 + 广告系列表格
Полный дашборд
完整仪表板
Запрос: "Полный дашборд за месяц"
Парсинг:
- Период: last_30d
- Аккаунты: все
- Уровень: ad
Действия:
- Читаю ad_accounts.md → все активные
- Для каждого аккаунта:
- get_campaigns() → список кампаний
- get_adsets() → списки adsets по кампаниям
- get_ads() → списки ads по adsets
- get_insights(level="ad") → метрики по ads
- get_adset_details() → бюджеты
- Формирую полную иерархию таблиц
请求: "展示过去一个月的完整仪表板"
解析:
- 时间段:last_30d
- 账户:全部
- 层级:ad
操作步骤:
- 读取ad_accounts.md → 所有活跃账户
- 为每个账户执行:
- 调用get_campaigns() → 广告系列列表
- 调用get_adsets() → 各广告系列的AdSet列表
- 调用get_ads() → 各AdSet的广告列表
- 调用get_insights(level="ad") → 广告层级指标
- 调用get_adset_details() → 预算数据
- 生成完整的层级表格
Custom период
自定义时间段
Запрос: "Дашборд с 2026-01-10 по 2026-01-20"
Парсинг:
- Период: {"since": "2026-01-10", "until": "2026-01-20"}
- Аккаунты: все
- Уровень: campaign (по умолчанию)
请求: "展示2026-01-10至2026-01-20的仪表板"
解析:
- 时间段:{"since": "2026-01-10", "until": "2026-01-20"}
- 账户:全部
- 层级:campaign(默认)
Чек-лист
检查清单
- Прочитан ad_accounts.md
- Определены параметры (период, аккаунты, уровень)
- Получены insights для нужного уровня
- Рассчитаны производные метрики (CPL, CTR, CPM)
- Проверены WhatsApp метрики (если есть messagingLeads)
- Сформированы таблицы по шаблонам
- Добавлена строка ИТОГО для групп
- 已读取ad_accounts.md
- 已确定参数(时间段、账户、层级)
- 已获取对应层级的insights数据
- 已计算衍生指标(CPL、CTR、CPM)
- 已检查WhatsApp指标(若存在messagingLeads)
- 已按模板生成表格
- 已为分组添加总计行
MCP команды
MCP命令
Чтение данных
数据读取
python
undefinedpython
undefinedСписок аккаунтов (если нужно проверить доступ)
账户列表(用于检查权限)
get_ad_accounts(limit=10)
get_ad_accounts(limit=10)
Кампании аккаунта
账户的广告系列
get_campaigns(account_id, status_filter="ACTIVE", limit=50)
get_campaigns(account_id, status_filter="ACTIVE", limit=50)
AdSets аккаунта или кампании
账户或广告系列的AdSet
get_adsets(account_id, campaign_id=None, limit=50)
get_adsets(account_id, campaign_id=None, limit=50)
Ads аккаунта или adset
账户或AdSet的广告
get_ads(account_id, adset_id=None, limit=50)
get_ads(account_id, adset_id=None, limit=50)
Метрики за период
时间段指标数据
get_insights(
object_id, # account_id или конкретный ID
time_range, # "yesterday" или {"since": "...", "until": "..."}
level="account" # account | campaign | adset | ad
)
get_insights(
object_id, # account_id或具体ID
time_range, # "yesterday"或{"since": "...", "until": "..."}
level="account" # account | campaign | adset | ad
)
Детали adset (для бюджета)
AdSet详情(用于获取预算)
get_adset_details(adset_id)
undefinedget_adset_details(adset_id)
undefinedДоступные периоды
支持的时间段
| Значение | Описание |
|---|---|
| Сегодня |
| Вчера |
| Последние 3 дня |
| Последние 7 дней |
| Последние 14 дней |
| Последние 30 дней |
| Текущий месяц |
| Прошлый месяц |
| Custom |
| 值 | 说明 |
|---|---|
| 今天 |
| 昨天 |
| 过去3天 |
| 过去7天 |
| 过去14天 |
| 过去30天 |
| 当前月 |
| 上月 |
| 自定义时间段 |