---
name: plan-and-execute-seasonal-adjustments
description: >-
  End-to-end management of a Google Ads account through a dated peak event (Black Friday,
  Christmas, an industry sale): builds the year-over-year baseline with gads_run_gaql_query,
  stages seasonal keywords, promotion/sitelink/callout assets ahead of review deadlines, raises
  budgets and loosens bid targets at event start (gads_update_budget,
  gads_set_campaign_bidding_strategy), monitors live capture, and reverts everything within three
  days of the event ending. Start it 6-8 weeks out. Do not use it for the retrospective and
  post-event query cleanup one to two weeks later (run-post-peak-season-normalization), for
  non-seasonal growth pushes (scale-bids-and-budgets), or for everyday budget rebalancing
  (allocate-budget-across-campaigns).
---
# Prepare, Run, and Revert a Seasonal Peak

## Purpose
Peak events compress a quarter's opportunity into days, and the two classic ways to lose it are
being unprepared (assets stuck in review, budgets capped on the big day) and being sloppy
afterwards (inflated budgets and loosened targets left running into normal demand). This skill
manages the full arc, baseline, build, execute, revert, with every account change staged ahead
of deadlines and unwound on a fixed timer, so automated bidding stays stable on both sides of the
peak.

## When to run
- A confirmed peak event is 6-8 weeks away and the business will run offers or expects a demand
  surge.
- At least one prior year (or comparable period) of data exists to baseline against.
- The immediate post-event days, for the built-in reversion phase.

## When NOT to run
- The event ended 1-2 weeks ago and you need query cleanup plus the retrospective, that is
  run-post-peak-season-normalization.
- You want a durable, non-calendar growth push, use scale-bids-and-budgets.
- You are redistributing budget between campaigns in normal conditions, use
  allocate-budget-across-campaigns.

## Prerequisites
- Prior-year daily performance data for the equivalent period (pullable via VigilDog).
- The confirmed commercial plan: offer type, discount depth, promo calendar, and an approved peak
  budget. HUMAN STEP (outside VigilDog) to obtain, VigilDog cannot decide the offer.
- Current daily budgets and tCPA/tROAS targets for all active campaigns, recorded so reversion
  has exact restore values.
- Seasonal keyword list from last year, or fresh seasonal keyword research.

## Procedure
Consult `gads_policy_guardrail` before the first Google Ads write of the session. Every write
below is previewed first (validate_only=true default) and applied only after explicit user
approval.

**Baseline (6-8 weeks out)**
1. Pull last year's equivalent window with `gads_run_gaql_query`: daily campaign metrics, cost, clicks, CTR, average CPC, conversions, conversion value, conversion rate, and both
   impression-share-lost columns (budget and rank). Exclude brand campaigns from the main cut and
   read them separately.
2. Split those days into three bands, the two weeks before the event, the event itself, and the
   week after, and compute band averages. The peak-versus-before deltas quantify what the season
   does to CVR, CPC, and volume. Note that Performance Max exposes no auction/impression-share
   data at campaign level; read PMax at spend/conversion/ROAS level only.
3. Set the peak plan with the user: peak-period targets (typically 10-20% looser than standard),
   peak daily budgets (last year's spend plus the growth goal; sanity check that daily budget is
   at least 5-10x target CPA), an event revenue goal, and a CPC ceiling (prior-year peaks usually
   ran 25-50% above normal CPC). Record current budgets/targets as the restore point.

**Build (2-6 weeks out)**
4. HUMAN STEP (outside VigilDog): seasonal landing pages built and speed-tested; Merchant Center
   feed work for Shopping/PMax, seasonal title terms via supplemental feed (3-5 business days
   processing), sale-price annotations (base price must have been stable ~45-60 days), and
   Merchant Center promotions with hard end dates.
5. Stage seasonal keywords ~3 weeks out with `gads_add_keywords` (and re-enable last year's
   paused ones). Tag every seasonal keyword with a shared label or naming convention so the whole
   set can be paused in one filtered pass later. Preview first, apply only after user approval.
6. Stage seasonal assets ~2-3 weeks out, each with explicit start/end dates:
   - `gads_create_promotion_extension` carrying the event occasion and the offer.
   - `gads_create_sitelink` pointing at deal/category pages.
   - `gads_create_callout` for urgency and value messages.
   Seasonal RSAs, images, and video are handled by the creative skills; coordinate so ad review
   finishes in time. Submit everything at least 2-3 business days before the event, review
   queues are slow exactly when you need them fast. Preview first, apply only after user
   approval.

**Execute (event window)**
7. HUMAN STEP (outside VigilDog): if the event is a sharp 1-7 day spike, configure a seasonality
   bid adjustment in the Google Ads UI (bid strategy advanced controls) sized to the expected
   CVR lift (CVR historically doubles → +100%), dated to the exact event window. VigilDog has no
   tool for this control. Never stretch an existing adjustment's dates, create a fresh one.
8. Raise budgets at event start with `gads_update_budget` to the approved peak levels. For PMax,
   step up gradually (about 20-30% per day), a sudden jump pushes spend into low-intent
   placements. Preview first, apply only after user approval.
9. Adjust targets only for multi-week ramps: `gads_set_campaign_bidding_strategy` to lower tROAS
   or raise tCPA by 10-20%, ideally tiered into 2-3 campaign groups by margin/priority. For short
   spikes, leave targets alone, the seasonality adjustment from step 7 covers it; doing both
   double-counts the lift. Preview first, apply only after user approval.
10. Monitor live with `gads_run_gaql_query`: CPC is the primary real-time signal (conversions
    lag); check budget-lost impression share frequently on the peak day, any budget loss on peak
    day is revenue left on the table; compare pacing against plan and shift budget intraday from
    laggards to leaders via `gads_update_budget` (preview → approval → apply).

**Revert (0-3 days after)**
11. Restore budgets to the recorded pre-peak values via `gads_update_budget` (PMax stepped down
    gradually) and targets via `gads_set_campaign_bidding_strategy` if they were changed. Preview
    first, apply only after user approval.
12. Pause the labeled seasonal keyword set via `gads_pause_keyword` and confirm via a label-
    filtered `gads_run_gaql_query` that none remain enabled. Seasonal assets should expire on
    their end dates; verify, and update any stragglers via `gads_update_campaign`-adjacent asset
    tooling as needed. Preview first, apply only after user approval.
13. HUMAN STEP (outside VigilDog): for sharp spikes, add a data exclusion in the bid strategy
    advanced controls covering the event window so automated bidding does not learn from
    anomalous days, include the conversion-lag tail (a 3-day sale with a 5-day conversion window
    means excluding roughly 8 days), and keep exclusions short (about 3 days typical, 7 max).
    Also revert Merchant Center feed changes. Then schedule
    run-post-peak-season-normalization for 1-2 weeks out.

## Decision rules
- Sharp event (1-7 days) → seasonality bid adjustment, targets untouched. Multi-week ramp →
  targets loosened 10-20% starting 2-4 weeks out, no seasonality adjustment. Never both at once.
- Separate seasonal campaigns only when the promotion has a genuinely different audience or
  economics; otherwise run seasonal copy inside existing campaigns and keep their bidding
  history.
- Peak daily budget floor: 5-10x target CPA per campaign; below that, automated bidding starves.
- PMax budget moves in either direction: ~20-30% per day, never a single jump.
- No discount does not mean no participation: shipping, bundles, and added-value angles convert
  seasonally without margin erosion, decide in the offer-validation step, not by default.
- All seasonal elements carry explicit end dates at creation time; reversion should be mostly
  verification, not work.

## Common failure modes
- Assets submitted the day before the event and stuck in review through the peak. Stage
  everything 2-3 business days early; feed changes a week early.
- Peak settings left live after the event: loosened targets plus normal demand equals a quietly
  terrible week. The revert steps run on a 0-3 day timer regardless of how busy the week was.
- Budget exhausted in the ramp-up so the peak day itself is capped, pace conservatively before,
  front-load the event day.
- Doubling the lift by combining a seasonality adjustment with loosened targets, then wondering
  why CPCs exploded.
- Skipping the restore-point recording in step 3, making reversion guesswork.

## Related skills
- run-post-peak-season-normalization, mandatory follow-up 1-2 weeks after the event.
- scale-bids-and-budgets, the non-seasonal version of raising volume.
- allocate-budget-across-campaigns, cross-campaign budget logic used during intraday shifts.
- set-up-ad-extensions, mechanics for the asset types staged in the build phase.
- run-a-daily-account-health-check, run daily through the peak window.
