---
name: run-post-peak-season-normalization
description: >-
  Cleans up a Google Ads account one to two weeks after a seasonal peak (Black Friday, Christmas,
  any dated sale): mines the post-event search terms report for stale seasonal queries still
  eating budget, builds a reusable seasonal negative-keyword shared set and links it to affected
  campaigns, verifies labeled seasonal keywords are actually paused, and exports the year-over-year
  numbers and learnings so next season starts from data instead of memory. Run it after the
  immediate revert steps of plan-and-execute-seasonal-adjustments are done. Do not use it for the
  peak build-up or day-of reversion itself (plan-and-execute-seasonal-adjustments), for routine
  query mining outside a season (analyze-search-term-reports), or for diagnosing a post-peak
  performance drop (investigate-performance-anomalies).
---
# Post-Peak Cleanup and Seasonal Retrospective

## Purpose
After a peak event ends, residual seasonal searches ("black friday deals", expired coupon codes,
gift-deadline queries) keep matching your ads for weeks and convert at close to zero. This skill
cuts that waste with a reusable seasonal negative list, confirms every temporary seasonal element
is off, and captures a numbers-backed retrospective so next year's planning phase has a real
baseline instead of recollections.

## When to run
- 7-14 days after a seasonal sale or holiday event ended.
- The immediate revert (budgets, targets, seasonal ads) from the peak playbook is complete.
- Before the account returns to its standard optimization cadence.

## When NOT to run
- The event is still ahead or running, that whole lifecycle belongs to
  plan-and-execute-seasonal-adjustments.
- You want general, non-seasonal query hygiene, use analyze-search-term-reports.
- Performance dropped post-peak and you suspect something beyond seasonal query decay, use
  investigate-performance-anomalies first.

## Prerequisites
- The change log from the peak period: what was raised, added, or enabled (budgets, targets,
  keywords, extensions, feed edits), including the label or naming tag used for seasonal keywords.
- At least 7 days of post-event data accumulated.
- Access to the affected Google Ads account via VigilDog; Merchant Center access on the human side
  if Shopping feed titles were modified.

## Procedure
1. Consult `gads_policy_guardrail` before the first Google Ads write of this session.
2. Pull the post-event query data. Call `gads_get_search_terms_report` for Search campaigns (and
   again for Shopping) with a date range starting the day after the event ended, covering 7-14
   days. Sort by cost descending.
3. Classify wasted queries. Flag terms whose cost is nontrivial and conversions are zero or near
   zero, in four buckets:
   - Event-name terms (the sale name itself, alone or combined with products).
   - Timing/informational queries (people asking when the event is or was).
   - Dead-offer terms (specific discount percentages or promo codes that no longer exist).
   - Deadline-dependent terms (gift and last-minute queries after shipping cutoffs passed).
   Present the candidate list with cost/conversion evidence; the user confirms relevance calls on
   anything borderline.
4. Build the seasonal negative list. Use `gads_create_shared_negative_set` to create a clearly
   named shared set (include the event and year, e.g. a "seasonal, <event>" naming pattern).
   Preview first (validate_only=true default); apply only after explicit user approval.
5. Load the negatives with `gads_add_keywords_to_shared_set`: phrase match for the broad event
   patterns, exact match for specific dead-offer strings. Preview first, apply only after user
   approval.
6. Activate the list by linking it to every affected campaign with
   `gads_link_shared_set_to_campaign`. Preview first, apply only after user approval. Record that
   deactivation before next season means unlinking this set, never deleting it.
7. Verify seasonal shutdown with `gads_run_gaql_query`:
   - All keywords carrying the seasonal label/tag are PAUSED.
   - No seasonal-only ad groups remain ENABLED.
   - Seasonal promotion/callout/sitelink assets have passed their end dates or been removed.
   If anything is still live, pause it via the appropriate write tool, preview first, apply only
   after user approval.
8. HUMAN STEP (outside VigilDog): revert Merchant Center changes, remove seasonal prefixes from
   product titles in the supplemental feed, clear leftover seasonal image attributes, and confirm
   sale-price annotations expired. Allow 24-48 hours of processing, then spot-check a handful of
   products in the Merchant Center UI.
9. Assemble the retrospective data. Use `gads_run_gaql_query` to pull daily account and campaign
   metrics covering pre-peak, peak, and post-peak windows (cost, conversions, value, CPC, CTR,
   impression-share loss splits), then write it out with `sheets_export_report` as next year's
   baseline. Name the export with the event and year.
10. HUMAN STEP (outside VigilDog): the user completes the qualitative half of the retrospective, which offers worked or flopped, how competitors behaved on impression share, whether budgets
    capped out, what to change next time. Append their answers to the exported sheet along with
    the tactical specifics: exact budget levels, target adjustments, seasonality-adjustment
    percentages used, the seasonal keyword list, and measured wasted spend by query bucket.

## Decision rules
- Start this skill about one week after the event: earlier and the stale-query patterns have not
  formed; later and you are paying for them.
- Negate seasonally, not permanently. If the event recurs, wasted-query terms go into the
  unlinkable seasonal shared set, a permanent campaign-level negative will silently block next
  year's revenue.
- Phrase match for pattern-level negatives (event names), exact match for one-off strings
  (specific codes/percentages). Exact-only lists leak; phrase-only lists overblock.
- A query qualifies as waste when it has spent meaningfully since the event ended with ~0
  conversions AND its intent depends on the event being live. High-cost zero-conversion terms
  without seasonal intent belong to analyze-search-term-reports instead.
- Do the retrospective even for a small event or one you sat out; documented competitor and cost
  observations are the cheapest planning input you will ever collect.
- Attach the seasonal negative list at the shared-set level, not as per-campaign negatives, one link/unlink per campaign per year beats re-entering hundreds of terms.
- If PMax also matched stale seasonal queries, the same shared set applies where account-level
  negative support allows; otherwise flag those terms for the PMax optimization skill.
- Budget the whole pass at 2-4 hours: query mining 1-2h, negative build under 30 minutes,
  retrospective 1-2h. Anything longer usually means diagnosing instead of cleaning.

## Common failure modes
- Skipping the pass entirely and letting event-name queries drain budget into January. The fix is
  calendar-driven: schedule this skill when the peak plan is written, not after.
- Deleting or permanently keeping the seasonal negative list. Both lose you money, one next
  year, one now. Unlink after cleanup? No: link now, unlink shortly before the next event.
- Trusting that scheduled end dates handled everything. Verify with the label query in step 7;
  a forgotten seasonal RSA or keyword group is common.
- Shopping titles still carrying the event name weeks later because the supplemental feed was
  never reverted; VigilDog cannot see or fix this, so the human step must be explicitly confirmed.
- Writing a retrospective with adjectives but no numbers. Next year's planning needs exact
  budgets, targets, and adjustment percentages, export them while they are one query away.

## Related skills
- plan-and-execute-seasonal-adjustments, the upstream lifecycle; run its cleanup phase first,
  and feed this retrospective into its planning phase next year.
- analyze-search-term-reports, general-purpose query mining outside the seasonal window.
- run-a-daily-account-health-check, resume the normal cadence after this cleanup and watch for
  stabilization over 2-4 weeks.
