Google Ads Morning Brief
Produce a daily, prioritized account-health narrative for Google Ads campaigns with actionable items and budget pacing vs monthly target projection.
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.
Connection verification
- If the profile has account IDs, use them directly.
- Otherwise, run
mcp__google-ads__list_accountsto discover accounts. - If it fails, report the connection failure and suggest running
platform-setup.
Workflow
Phase 1: Collect data
Execute 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).
Run queries 1-4 first. Query 5 can run in parallel since it has no dependency on the others.
Phase 2: Detect and rank anomalies
Use references/anomaly-formulas.md for exact formulas.
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: Budget pacing assessment
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.
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 4: 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.
Output format
## Morning Brief - [Date]
### Account
- Google Ads: [Account Name] ([Customer 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%)
### Urgent
1. [Issue + impact + recommended action]
### Watch
1. [Issue + impact + recommended action]
### Healthy
- [stability observation]
### Notes
- Data freshness and known caveats
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.
- 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.
- Read-only: This skill produces analysis and recommendations only. No account modifications are made. Recommended actions include Google Ads UI paths where applicable.
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/anomaly-formulas.mdreferences/google-reporting.md