---
name: improve-ad-relevance
description: >-
  Repairs the ad relevance component of Quality Score by fixing the structural mismatch between an ad group's
  keywords and its RSA copy: it audits whether one ad can honestly cover the group's intent, splits and re-routes
  traffic when it cannot, selectively promotes high-volume queries for tighter alignment, and rewrites copy so the
  keyword theme is woven naturally across multiple headlines and at least one description. This is foundation
  repair, not creative testing. Run it when the ad relevance label reads below average, or ads across ad groups
  feel interchangeable. It is normally dispatched from improve-quality-score; message competitiveness afterwards is
  improve-expected-ctr, landing page problems are improve-landing-page-experience, and ongoing creative rotation is
  rsa-testing-with-the-iteration-loop.
---
# Repair Ad Relevance

## Purpose
The ad relevance rating is Google's read on whether an ad meaningfully answers the intent behind a keyword. When it
is weak, the cause is nearly always structural, an ad group holding two intents that no single ad can serve, or
copy that never mentions what the user actually searched. This skill fixes the container first (split, route,
promote), then the copy (semantic anchoring distributed across assets), and only then hands the ad group onward for
competitiveness work.

## When to run
- Ad relevance = below average on keywords with meaningful impressions (typically routed here by
  `improve-quality-score`).
- Ads read as generic or interchangeable across different ad groups.
- High-volume queries in the ad group are nowhere reflected in the ad copy.

## When NOT to run
- Ad relevance is fine but expected CTR is below average → `improve-expected-ctr` (competitiveness, not alignment).
- The landing page label is the weak one → `improve-landing-page-experience`.
- You want systematic asset rotation and testing → `rsa-testing-with-the-iteration-loop` (and do not start it until
  relevance is repaired, tests on a broken foundation measure noise).
- The whole campaign structure needs review, not one ad group → `review-and-optimize-campaign-structure`.

## Prerequisites
- One target ad group per run (fix one theme, validate, replicate, not a mass pass).
- Baseline: the ad group's keywords, current RSA assets, 30–90 days of search terms, and impression data.
- The quality component labels accessible (pulled in step 1).

## Procedure
1. **Pull the diagnostic set.** `gads_get_keyword_performance` for the ad group sorted by impressions;
   `gads_run_gaql_query` on the ad group's criteria for `quality_info` fields (ad relevance label per keyword);
   `gads_run_gaql_query` on the ad group's ads for current headlines/descriptions;
   `gads_get_search_terms_report` for the ad group, last 30 days (90 if thin).
2. **Run the coverage audit.** Take the top 10 keywords by impressions and ask: could one RSA serve all of them
   with no headline feeling generic or mismatched for any? Pass → structure is sound, go to step 6. Fail →
   identify what diverges: funnel stage (definitions vs. pricing), audience, product variant, or mere phrasing.
3. **Check intent-to-message fit.** Classify the dominant keyword intent (informational / comparison / purchase)
   and compare against the ad's register: learners need guidance framing, comparers need differentiators and
   proof, buyers need offer, speed, and a direct CTA. Misaligned copy with sound structure → flag for step 6
   rewrite. Mixed intents in one group → that is a step-2 failure; handle structurally.
4. **Prefer dynamic features over splitting when divergence is shallow.** Synonym, modifier, or location
   divergence can usually be absorbed by keyword insertion, per-keyword customizers, or keyword-level final URLs
   without fragmenting data (route to `set-up-keyword-level-ad-customizers` where customizers fit). Funnel-stage
   or audience divergence almost always requires a real split.
5. **Split and route where required.** After `gads_policy_guardrail` (before the session's first Google Ads
   write): create the new theme-specific ad group via `gads_create_ad_group`, move the divergent keywords in via
   `gads_add_keywords` and pause them in the old group, and, critically, block the old group from stealing the
   traffic back by adding the split-off theme as negatives in the old ad group via `gads_add_negative_keywords`
   (e.g., splitting a trail-specific theme out of a generic shoes group means the old group gets the trail word as
   a negative). Every write previews first (validate_only default) and commits only after explicit user approval.
   Without the routing negatives, the aged ad group keeps winning the internal auction and the new one starves.
6. **Promote sparingly for alignment.** From the search terms pull, consider promoting only high-signal queries
   (≥50 impressions, lower for thin groups) that add keyword-insertion value or deserve their own quality
   diagnostics while sharing the same ad and page, full framework in `promote-search-terms-to-keywords`. Skip
   close variants; they fragment data and improve nothing.
7. **Rewrite for distributed relevance.** Generate candidate copy via `gads_generate_rsa_copy` seeded with the ad
   group's keyword theme, then apply via `gads_update_ad` (preview → approval → commit). Rules: the keyword theme
   (or a close variant) appears naturally in the lead headline AND is echoed across several other headlines, Google assembles combinations, and signals concentrated in one headline leave most combinations generic. Choose
   keyword insertion for long predictable keyword lists, static keyword-anchored headlines for branded, sensitive,
   or awkward-length terms, or a mix. At least one description carries the core phrase while adding new substance
   (proof, benefit, context), descriptions extend the promise, they do not restate headlines in other words.
8. **Validate on the lagging clock.** CTR should firm up within 7–14 days if alignment improved (compare
   like-for-like, bids and competition also move CTR). The ad relevance label itself follows at 14–30 days via
   the same `gads_run_gaql_query` pull. Done = label off below-average and holding for 14 consecutive days, plus
   routing negatives in place for any split. "Average" is an acceptable resting state, squeeze toward
   above-average only if cheap; otherwise move to `improve-expected-ctr`.

## Decision rules
- **Structure before copy, always.** Copy rewrites on a two-intent ad group are wasted work.
- **Split test:** one ad honestly covers all top-10 keywords → no split. Divergent funnel stage or audience →
  split. Divergent phrasing only → dynamic features, no split.
- **Never split past the point of specific ads.** The floor is: if offer, CTA, or intent differs between keyword
  sets, they cannot share a group; if none differ, they must.
- **Routing negatives are mandatory on every split**, the old group has history and will otherwise keep the
  traffic.
- **Promotion filter:** ≥50 impressions AND (insertion value OR diagnostic value) AND same ad + same page;
  otherwise skip. Needs a different ad → that is a split, not a promotion.
- **Semantic distribution:** theme in the lead headline + echoed in several more, naturally; one description
  carries the phrase. Forced repetition in every asset is stuffing, not relevance.
- **Validation windows:** CTR 7–14 days, label 14–30 days, done at 14 stable days.

## Common failure modes
- **Polishing copy on a mixed-intent group.** The label stays low because no copy can match two intents; run the
  coverage audit first, every time.
- **Splitting without routing negatives**, the most common silent failure: the new group gets impressions in the
  single digits while the old one keeps serving generic ads to the split-off queries.
- **Over-splitting on phrasing variants,** producing micro ad groups that starve Smart Bidding; dynamic features
  exist precisely for shallow divergence.
- **Keyword-stuffing every headline.** Combinations of ten near-identical headlines read worse than generic copy;
  distribution must stay natural, with benefit/proof/CTA assets intact.
- **Judging in three days.** The label is a lagging indicator; premature verdicts trigger churn that resets the
  clock.
- **Running creative tests simultaneously.** Structural noise confounds every test read; finish here first.

- **Fixing many ad groups in one pass.** Without the one-theme-validate-replicate rhythm, half-finished
  structural changes pile up and no single fix ever gets a clean read.
- **Forgetting that DKI inserts the keyword, not the query.** If the keyword list lags real phrasing, inserted
  headlines stay stale, which is why the limited promotion step precedes the copy rewrite.

## What done looks like
- The ad group passes the one-ad coverage question on its top keywords.
- Routing negatives protect every split; the new group is accruing its own impressions.
- The keyword theme appears in the lead headline, echoes naturally elsewhere, and one description carries it.
- Ad relevance label at average or better for 14 consecutive days, then move to `improve-expected-ctr`.

## Related skills
- Dispatched by: `improve-quality-score` (component router).
- Run after this: `improve-expected-ctr` (competitiveness on the repaired foundation), then
  `rsa-testing-with-the-iteration-loop` (ongoing testing).
- Supporting: `promote-search-terms-to-keywords` (step 6 in full), `set-up-keyword-level-ad-customizers`
  (dynamic-feature alternative to splitting), `improve-landing-page-experience` (third component).
