Paid Search Morning Brief
Produce a daily, prioritized account-health narrative across Google Ads and Bing Ads paid search campaigns with actionable items.
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.
If it doesn't exist, fall back to
list_accountsand suggest runningplatform-setup.
Data Access
Google Ads
mcp__google-ads__query: Execute GAQL SELECT queries and return structured rows.mcp__google-ads__list_accounts: Validate account access before reporting when customer scope is unclear.
Use GAQL templates from references/gaql-queries.md directly with mcp__google-ads__query.
Bing Ads
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.
Platform detection
- Try
mcp__google-ads__list_accountsfirst. If it succeeds, include Google data. - Try
mcp__bing-ads__list_accounts. If it succeeds, include Bing data. - If only one platform responds, run the brief for that platform alone. Do not error on a missing platform.
- If neither responds, report the connection failure and suggest running
platform-setup.
Workflow
Phase 1: Collect data
Google Ads (five queries from references/gaql-queries.md)
- Campaign daily performance (30d).
- Budget pacing and impression share (yesterday snapshot).
- Disapproved ads.
- High-spend, zero-conversion keywords (yesterday).
- Recent account changes (last 24h).
Bing Ads (three reports from references/bing-queries.md)
- Campaign performance report (Last30Days, Daily aggregation).
- Keyword performance report (Yesterday, Daily aggregation).
- Campaign structure query (campaigns entity) for budget and status context.
Run Google and Bing data collection in parallel where possible.
Phase 2: Detect and rank anomalies
Use references/anomaly-formulas.md for exact formulas. The formulas apply identically to both platforms — they operate on metric values, not platform-specific fields.
For each campaign (Google and Bing), 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, across both platforms.
Cap output at 10 anomaly items to keep the brief actionable.
Phase 3: Budget pacing assessment
Google Ads
Google Ads daily budgets are daily targets, not monthly caps.
For each campaign:
daily_budget= campaign daily budget converted to dollars.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 Query 1.pacing_ratio=actual_mtd_spend / expected_mtd_spend.- Flag overpacing when
pacing_ratio > 1.10and underpacing whenpacing_ratio < 0.85.
Bing Ads
Bing campaign budgets are retrieved via mcp__bing-ads__query (campaigns entity returns daily_budget). Apply the same pacing formula using daily spend from the campaign performance report.
Phase 4: Draft prioritized narrative
Structure output as a unified cross-platform brief:
Urgent: needs action today (any platform).Watch: monitor or schedule action.Healthy: stable areas.
Every item must include the platform label (Google / Bing), the likely cause, and one concrete next action.
Output format
## Morning Brief - [Date]
### Platforms
- Google Ads: [Account Name] ([Customer ID]) - [N] campaigns active
- Bing Ads: [Account Name] ([Account ID]) - [N] campaigns active
**Overall:** [one-sentence cross-platform summary]
### Urgent
1. **[Google/Bing]** [Issue + impact + recommended action]
### Watch
1. **[Google/Bing]** [Issue + impact + recommended action]
### Healthy
- **[Google/Bing]** [stability observation]
### Notes
- Data freshness and known caveats per platform
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. Applies to both platforms.
- Mention change-event delay (~3 min lag for Google) and timestamp cut-off.
- Distinguish between "no issues found" and "insufficient data".
- Keep recommendations operational and specific.
- Cap each priority section: max 5 Urgent, 5 Watch, 5 Healthy items.
- Bing token rotation: If
mcp__bing-ads__list_accountsfails with auth error, note that Microsoft rotates refresh tokens and suggest re-running the OAuth flow. - Single-platform graceful: If one platform is not configured, produce the brief for the available platform without error messaging. Only mention the missing platform in a Notes footer.
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/gaql-queries.mdreferences/bing-queries.mdreferences/anomaly-formulas.mdreferences/google-reporting.md