{"id":56482,"plugin_id":"plugin_asdk_app_69a1247fceb88191a0fde719fd50920d","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-27T00:05:41.968Z","digest":"e8daf35f98ef9107983cd636f207040dc67fe55a648e0ca8071307e96305fb38","against":null,"payload":{"description":"Find wasted ad spend from live data: zero-conversion campaigns and ads, expensive CPAs, budget traps, Google and Microsoft search terms to negate, and the monthly saving. Use for \"where am I wasting money\", \"which search terms should I exclude\", \"what should I pause\" on Google Ads, Microsoft Advertising, Meta and other ad platforms.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":242},{"relative_path":"assets/icon-small.png","size_in_bytes":2921},{"relative_path":"assets/negative_keyword_recommendations.md","size_in_bytes":3132},{"relative_path":"references/performance-marketer-guide.md","size_in_bytes":7119},{"relative_path":"scripts/search_term_auditor.py","size_in_bytes":6360}],"name":"wasted-spend-audit","skill_md_contents":"---\nname: wasted-spend-audit\ndescription: Find wasted ad spend from live data: zero-conversion campaigns and ads, expensive CPAs, budget traps, Google and Microsoft search terms to negate, and the monthly saving. Use for \"where am I wasting money\", \"which search terms should I exclude\", \"what should I pause\" on Google Ads, Microsoft Advertising, Meta and other ad platforms.\n---\n\n# Wasted spend audit\n\n## Workflows\n\n### Search term audit and negative keywords\n**When to use:** the user runs Google Ads or Microsoft Ads search campaigns and wants to find wasted spend on irrelevant queries, building a negative keyword list to upload to the platform.\n\n**Platforms typically involved:** Google Ads (search campaigns), Microsoft Ads. This workflow doesn't apply to social platforms.\n\n### Step 1 — Pull the search term report\n> Pull the search term report from [Google Ads / Microsoft Ads] for the last 30 days, including search term, matched keyword, campaign, ad group, clicks, cost, and conversions.\n\nFields: Google Ads `Searchterm` (with `Keyword`, `Matchtype`), Microsoft Ads `SearchQuery`. The search term report is the granular log of actual user queries that triggered the ads — distinct from the keyword list, which is what the user bid on. Mismatch between intent and actual query is where waste lives.\n\n### Step 2 — Audit the terms\nUse `scripts/search_term_auditor.py`. The script flags queries that:\n- Cost more than $X (configurable) with zero conversions\n- Have CPC more than 2x the campaign average\n- Match obvious irrelevance patterns (competitor brand names, \"free\", \"jobs\", \"career\", \"wikipedia\" depending on the user's industry context)\n\nThe user provides the irrelevance patterns; the script doesn't guess them. If the user doesn't have a list, suggest a starter set based on their industry and confirm.\n\n### Step 3 — Visualize the waste\nThe question the chart needs to answer: **how much money are these terms costing, and which patterns are the worst?**\n\nA horizontal bar chart of cost-per-term (top 20 worst offenders) is the most useful primary visualization. If the user has clearly grouped patterns (competitor names vs informational queries vs unrelated terms), a stacked bar chart by pattern type surfaces where the largest categories of waste live.\n\nA pie chart or treemap of cost by pattern type works only if there are ≤5 clear categories.\n\n### Step 4 — Build the negative keyword list\nUse `assets/negative_keyword_recommendations.md`. For each proposed negative keyword, the doc includes the match type recommendation (exact / phrase / broad), the rationale (cost incurred, related queries impacted), and the campaigns where the negative should be applied.\n\n### Step 5 — Output\nDefault delivery: the table as a spreadsheet ready for ad-platform upload, using the `xlsx` skill. Most ad platforms accept negative keyword bulk uploads in CSV/XLSX format. If the user prefers, deliver markdown inline.\n\n### Common variations\n- **Just one campaign** — filter to a single campaign in step 1.\n- **Smaller wins** — lower `--min-cost` below its $50 default (e.g. $20).\n- **Already-running negatives** — if the user provides their current negative keyword list, exclude those terms from the recommendations.\n\n---\n\n## Background\n\nChart choices, principles and gotchas for this area: [references/performance-marketer-guide.md](references/performance-marketer-guide.md).\n\n## Before you analyze\n\n- Load saved targets, budgets and known context with `manage_business_context` (`action: get`) and judge results against them, not generic benchmarks.\n- Query correctly: follow the `marketing-data-queries` skill for discovery, field IDs and platform quirks.\n- Check tracking first. If platform conversions and GA4 or backend numbers disagree by more than 20%, or spend continues with zero conversions, say so before any optimization advice.\n- Pull, then analyze, as separate steps. Run one heavy query at a time.\n- Evidence discipline: treat changes on fewer than ~10 conversions as noise, ignore items under 1,000 impressions, don't call learning-phase campaigns failures, check for shared budgets before budget advice, and re-pull before conceding a disputed number.\n- Answer shape: conclusion, business impact, next actions, then \"How I got this\" (one line per data pull).\n- Helper scripts in `scripts/` take a CSV and print a table. Run them if you can execute code; otherwise compute the same thing directly. Templates in `assets/` shape the final deliverable.\n\n## After the analysis\n\n- Analysis only recommends. If the user wants to act (pause, budget shift, negatives), use the `campaign-management` skill, with explicit approval for each change.\n- For a recurring or shareable result, offer once to publish it as a live Supermetrics Studio dashboard with `manage_dashboards` (static preview first, then the live upload).\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}