---
name: review-and-optimize-ad-extensions
description: >-
  Monthly maintenance pass over the extension (asset) layer: audits every campaign against minimum coverage,
  pulls 30-60 days of asset-level performance, flags underperformers against hard thresholds (zero clicks,
  clicks without conversions, CPA or ROAS far off the campaign average, stale offers, dead links), removes the
  flagged ones, and deploys fresh replacements built on different angles. Use it on the monthly optimization
  cadence, after any offer or seasonal change, or quarterly to evaluate extension types not yet in use. Do not
  use it for the initial extension build on a new account or campaign, that is set-up-ad-extensions, and do
  not use it to rework ad copy itself (write-compelling-rsas or rsa-testing-with-the-iteration-loop).
---
# Audit, Prune, and Refresh Ad Extensions

## Purpose
Extensions decay: offers expire, pages move, messaging goes stale, and weak assets keep serving because
nobody looks. This skill is the recurring inspection that keeps the extension layer earning its screen space, verify coverage, measure each asset against the campaign it serves, cut what drags, and replace with a
genuinely different angle rather than a reworded version of what just failed.

## When to run
- Monthly, as part of the standing optimization cadence, once at least 30 days of asset data exist.
- Immediately after an offer ends, a promotion changes, or a seasonal shift makes messaging stale.
- Quarterly, as an expansion review: which applicable extension types is the account still not using?
- After `set-up-ad-extensions` completed 30+ days ago and the new assets need their first evaluation.

## When NOT to run
- The account or campaign has no extensions yet, run `set-up-ad-extensions` to build, then return here.
- The diagnosis points at ad copy, not assets (weak headlines, poor relevance), `write-compelling-rsas`
  or `rsa-testing-with-the-iteration-loop`.
- Less than 30 days of data on the current assets, judging early produces churn, not improvement.

## Prerequisites
- 30+ days of asset performance history.
- Campaign-level averages for CPA (and ROAS where value-based) to compare assets against.
- Current offer calendar from the user, you cannot flag "expired offer messaging" without knowing what
  expired.

## Procedure
1. **Coverage audit.** Call `gads_list_extensions` and `gads_list_assets`, mapping assets to their
   association level (account / campaign / ad group). For every active campaign check the floor: 4+
   sitelinks, 4+ callouts, at least one structured-snippet header with 3+ values. Flag shortfalls, and note
   campaigns leaning entirely on inherited account-level assets where campaign-specific versions would
   be more relevant.
2. **Pull performance.** Use `gads_run_gaql_query` against the asset performance data for the last 30–60
   days: impressions, clicks, CTR, conversions, cost, conversion value, segmented by asset type and
   grouped per campaign. Compute each campaign's average CPA/ROAS and each asset type's average CTR
   as the comparison baselines.
3. **Classify each asset** with the thresholds in Decision rules. Output a flagged list with the reason per
   asset. Also compare CTR on impressions where extensions showed against impressions without, if
   decorated impressions perform *worse*, the asset content itself is hurting and belongs on the list.
4. **HUMAN STEP (outside VigilDog): link check.** Click through every sitelink destination (or have the user
   do it), any 404 or redirect-to-irrelevance is an automatic flag.
5. **Consult `gads_policy_guardrail`** if this is the session's first Google Ads write, then **remove flagged
   assets** with `gads_remove_extension`. Remove rather than pause, a removed asset frees its slot for a
   replacement. Preview first (validate_only default), show the user the removal list with reasons, apply
   only after explicit approval.
6. **Build replacements** (each write previews first, commits after user approval):
   - `gads_create_sitelink`, new destination or new framing; never re-ship the text that just failed, and
     never point two sitelinks at one URL.
   - `gads_create_callout`, pull from claim categories the current set lacks (credibility, value-add,
     speed, risk removal).
   - `gads_create_promotion_extension`, for the *current* offer, end date set.
   - `gads_create_price_extension`, `gads_create_call_extension`, `gads_create_image_extension`, where
     the coverage audit or expansion review calls for them.
7. **HUMAN STEP (outside VigilDog): automated asset settings.** Review the auto-generated sitelinks,
   callouts, and snippets in the UI. Before disabling any auto asset, check whether it outperforms your
   manual ones, if it does, steal its angle into a manual replacement first, then disable.
8. **Quarterly expansion pass.** From step 1's inventory, list applicable-but-unused types (price for tiered
   offerings, promotion during sale seasons, call where phones convert, image where good visuals exist,
   location for physical premises) and deploy them at campaign level with the create tools above.
9. **Log and schedule.** Record what was removed, why, and what replaced it. New assets get 30 days
   before their first judgment; put the next monthly pass on the calendar.

## Decision rules
Flag an asset for replacement when any of these hold over a 30+ day window:
- **Zero clicks** despite the asset serving, it contributes nothing.
- **100+ clicks and zero conversions**, engagement without outcomes is paid-for distraction.
- **Asset CPA more than 2× the campaign average**, inefficient relative to its context.
- **Asset ROAS below half the campaign average** (value-based campaigns).
- **Asset CTR below half the average for its type**, weak engagement relative to peers.
- **Copy references an ended offer**, replace immediately, regardless of metrics.
- **Destination broken or irrelevant**, fix the URL or replace the asset.

Other rules:
- New or replacement assets are evaluated only after 30 days of serving.
- Coverage floor per campaign: 4 sitelinks / 4 callouts / 1 snippet header with 3+ values; campaign level
  preferred over account inheritance for relevance.
- Replacements must change the *angle*, not just the wording, a failed trust claim is not fixed by
  rephrasing the same trust claim.
- If extension-decorated impressions underperform undecorated ones, treat the whole asset set for that
  campaign as suspect, not just the worst single asset.
- **Volume floor for judgment:** an asset with only a handful of impressions in the window is "no data yet",
  not "failing", leave it for another cycle rather than churning it.
- **Seasonal assets:** remove seasonal promotions when the season ends and recreate them fresh next year;
  a dormant asset left in place is exactly the stale-offer risk this skill exists to catch.
- **Account-level assets need account-level judgment:** an inherited asset weak in one campaign but strong
  in aggregate stays; flag it against its overall numbers, or override it at campaign level only for the one
  campaign where it misfires.

## Common failure modes
- **Set-and-forget decay.** Extensions run untouched for quarters; the monthly cadence is the entire
  defense.
- **Pausing instead of removing.** Paused assets sit on the slot; removal is what opens room for the
  replacement.
- **Rewording the loser.** A failed message gets a synonym pass and fails again; force a different claim
  category.
- **Judging a week-old asset.** Early volatility masquerades as signal; hold the 30-day line.
- **Disabling an auto asset that was quietly winning.** Check its numbers first and harvest the angle.
- **Expired promotions surviving because nobody owned the calendar.** End dates at creation plus this
  monthly pass close the gap.
- **Removing before replacements are ready.** The purge dropped a campaign below the coverage floor and
  it ran days with thin ads. Build replacement drafts before approving removals, and apply both in the same
  session.

## Related skills
- `set-up-ad-extensions`, upstream initial build; run it when whole types are missing rather than weak.
- `write-compelling-rsas`, when the misalignment is between ad copy and extensions, rebuild the ad side.
- `rsa-testing-with-the-iteration-loop`, the parallel cadence for the ad assets themselves.
- `resolve-ad-disapprovals`, if replacements fail policy review.
- `run-a-monthly-performance-review`, this skill slots naturally into that wider monthly review as the
  extension-layer segment.
