Microsoft Ads Morning Brief
Produce a daily, prioritized account-health narrative for Microsoft Advertising campaigns with actionable items, budget pacing vs monthly target projection, bot traffic monitoring, and import drift detection.
Account Context
Read ${CLAUDE_PLUGIN_ROOT}/profile/account-profile.md at the start of every run.
If it exists:
- Use known account IDs -- skip
list_accountsdiscovery. - Apply KPI targets as anomaly detection thresholds (e.g., flag CPA > target CPA).
- Note active tests when interpreting performance shifts.
- Check watch list for follow-up items from prior sessions.
- Read Import Config for auto-import drift detection.
If it doesn't exist, fall back to
list_accountsand suggest runningplatform-setup.
Data Access
mcp__bing-ads__report: Generate performance reports (campaign, keyword, search query). Returns parsed CSV data as JSON.mcp__bing-ads__query: Query campaign structure (campaigns, ad groups, keywords, ads). Read-only.mcp__bing-ads__list_accounts: Validate account access and discover account IDs.
Use the report tool with report_type and date_range parameters. See references/bing-queries.md for report configurations.
Connection verification
- If the profile has account IDs, use them directly.
- Otherwise, run
mcp__bing-ads__list_accountsto discover accounts. - If it fails, report the connection failure and suggest running
platform-setup. - If auth fails with token error, note that Microsoft rotates refresh tokens and suggest re-running the OAuth flow.
Workflow
Phase 1: Collect data
Execute four data pulls from references/bing-queries.md:
- MB-1: Campaign performance report (30d, Daily aggregation).
- MB-2: Keyword performance report (Yesterday, Daily aggregation).
- MB-3: Campaign structure query for budget, status, and network settings.
- MB-4: Search query report (Yesterday) for bot traffic signal detection.
Run reports 1, 2, and 4 in parallel. Query 3 depends on account access confirmation.
Phase 2: Detect and rank anomalies
Use references/anomaly-formulas.md for exact formulas. The formulas are platform-agnostic -- they operate on metric values, not platform-specific fields.
For each campaign, for each metric (cost, conversions, CPA, CTR):
- Compute
baseline_7d= mean of last 7 days (excluding yesterday). - Compute
baseline_30d= mean of last 30 days (excluding yesterday). - Compute
deviation_pct=(yesterday - baseline_7d) / baseline_7d. - Compute
dollar_impact=yesterday_value - baseline_7d(for cost/CPA metrics). CTR is not dollar-denominated; use deviation_pct only. - Surface when BOTH:
|deviation_pct| > 0.20AND|dollar_impact| > $10. For CTR: surface when|deviation_pct| > 0.25(no dollar gate). - Rank all flagged items by
|dollar_impact|descending.
Cap output at 10 anomaly items to keep the brief actionable.
Phase 3: Bot traffic monitoring
Analyze yesterday's data for suspicious click patterns that indicate bot or invalid traffic:
- High click, zero conversion campaigns: Flag campaigns with clicks > 50 and conversions = 0 yesterday.
- Geographic anomalies: If geo data is available, flag unexpected spikes from geos not in targeting.
- Device anomalies: Flag campaigns where a single device type accounts for >80% of clicks with zero conversions.
- CTR outliers: Flag keywords or campaigns with CTR > 15% combined with zero conversions (likely click fraud).
Present bot traffic signals as a separate section. These are signals, not confirmations -- recommend checking Microsoft Advertising's Invalid Clicks report in the UI.
Phase 4: Import drift detection
If the account profile has Import Config data:
- Check if auto-import is enabled and the last known import date.
- Compare current campaign settings (from MB-3) against expected settings:
- MSAN distribution unexpectedly enabled (common auto-import side effect).
- Search partners unexpectedly enabled.
- Budget changes that don't match manual adjustments in the Decision Log.
- Flag any drift as a Watch item with the specific setting that changed.
If no Import Config exists, skip this phase.
Phase 5: Budget pacing assessment
Bing campaign budgets are retrieved via mcp__bing-ads__query (campaigns entity returns daily_budget).
For each campaign:
daily_budget= campaign daily budget from structure query.monthly_budget=daily_budget * 30.4.day_of_month= calendar day number.expected_mtd_spend=daily_budget * day_of_month.actual_mtd_spend= sum of daily cost for current month from MB-1.pacing_ratio=actual_mtd_spend / expected_mtd_spend.- Flag overpacing when
pacing_ratio > 1.10and underpacing whenpacing_ratio < 0.85.
Monthly target projection
If the account profile includes a Monthly Budget target:
total_mtd_spend= sum of all campaign MTD spend.projected_eom_spend=total_mtd_spend / day_of_month * days_in_month.budget_utilization=projected_eom_spend / monthly_budget_target.- Flag when projected spend exceeds target by >10% or falls below target by >15%.
Present both campaign-level pacing and account-level monthly projection.
Phase 6: Draft prioritized narrative
Structure output with three priority tiers:
Urgent: needs action today.Watch: monitor or schedule action.Healthy: stable areas.
Every item must include the likely cause and one concrete next action with a Microsoft Advertising UI path.
Output format
## Morning Brief - [Date]
### Account
- Microsoft Ads: [Account Name] ([Account ID]) - [N] campaigns active
**Overall:** [one-sentence account summary]
### Budget Pacing
| Campaign | Daily Budget | MTD Spend | Expected MTD | Pacing | Status |
|---|---:|---:|---:|---:|---|
**Monthly Projection:** $X,XXX projected vs $X,XXX target ([over/under] by X%)
### Bot Traffic Signals
| Campaign | Signal | Clicks | Conv | CTR | Recommended Check |
|---|---|---:|---:|---:|---|
(If no signals detected: "No suspicious click patterns detected yesterday.")
### Import Drift
- [drift findings or "No import drift detected."]
### Urgent
1. [Issue + dollar impact + recommended action + UI path]
### Watch
1. [Issue + dollar impact + recommended action + UI path]
### Healthy
- [stability observation]
### Notes
- Data freshness: Bing reports reflect data through yesterday's close.
- **Limitations**: No change event history available via API. No ad disapproval data in reports -- check Microsoft Advertising UI > Ad Extensions & Ads > Ads for editorial status. No impression share in standard reports -- use budget pacing as a proxy for coverage.
Guardrails
- Conversion lag: When yesterday conversions are >30% below 7d baseline, add a note that conversions typically backfill for 24-72 hours. Do not flag as "Urgent" unless the drop also appears in 2-day-old data.
- Bing data differences: Spend is already in dollars (no micros conversion). CTR is returned as a percentage string -- parse to float for math.
- No change events: Bing API does not expose account change logs. Note this limitation rather than omitting historical context.
- No disapproval data: Ad editorial status is not available via the reporting API. Note this in the output.
- No impression share: Standard Bing reports do not include impression share. Use budget pacing and spend-to-budget ratio as proxy signals for coverage gaps.
- Distinguish between "no issues found" and "insufficient data".
- Keep recommendations operational and specific with UI paths from
references/ui-paths.md. - Cap each priority section: max 5 Urgent, 5 Watch, 5 Healthy items.
- Read-only: This skill produces analysis and recommendations only. No account modifications are made.
Profile Maintenance
After completing analysis, if ${CLAUDE_PLUGIN_ROOT}/profile/account-profile.md exists:
- Update Watch List with any new anomalies flagged in this run.
- Update Active Tests if user mentioned starting or completing a test.
- Append to Decision Log if actions were taken (pauses, negatives added, etc.).
- Update "Last updated" date. Present proposed profile changes to the user before writing.
References
references/bing-queries.mdreferences/anomaly-formulas.mdreferences/ui-paths.md