---
name: scaling-os
description: >-
  The operating guide for constraint-driven Google Ads scaling: state the goal as an equation,
  measure the gap, walk the account top-down to find the single layer currently limiting output
  (tracking integrity, business economics and capacity, post-click conversion, reach, message),
  commit one timeboxed fix cycle to that limiter, verify, and repeat. Use this FIRST when deciding
  WHAT to work on, at engagement start, when performance stalls or misses target, or whenever the
  next move is unclear, then hand off to the matching skill via gads_list_skills. Do not use it
  while already executing a specific procedure, for routine scheduled check-ins (that is
  run-a-weekly-performance-review / run-a-monthly-performance-review), or when the goal itself is
  undefined (run set-campaign-goals-and-kpis first). Diagnosis is read-only; all changes happen in
  the handed-off skill.
---
# Scaling OS, Constraint-Driven Account Operation

## Purpose

An account scales at the speed of its single tightest limiter, not at the speed of total effort
spent on it. Ten simultaneous changes produce movement nobody can attribute; one deliberate fix
against the binding limiter produces movement you can explain, repeat, and compound. This skill is
the routing layer of the VigilDog skill library: it turns "what should we do next?" into a named
limiter, then dispatches exactly one downstream procedure skill to remove it.

## When to run

- Start of an engagement or quarter, once goals and unit economics exist, to pick the first target.
- Performance has stalled or missed target for two consecutive review periods and the cause is unclear.
- A stakeholder asks for "more scale" or "better efficiency" and you must decide where the leverage is.
- A previous fix cycle just finished and settled, and it is time to choose the next limiter.
- You catch yourself (or the user) proposing three unrelated optimizations at once.

## When NOT to run

- No numeric goal exists yet, run set-campaign-goals-and-kpis; without a target, nothing can be "the" bottleneck.
- Unit economics are unvalidated, run calculate-and-validate-unit-economics; you cannot judge whether scaling is even safe.
- It is a routine scheduled check-in, run run-a-weekly-performance-review or run-a-monthly-performance-review.
- A specific procedure is mid-flight, finish or verify it; re-diagnosing mid-change reads transition noise as signal.
- Acute operational breakage (disapproved ads, billing stops), handle directly; triage beats diagnosis when the account is not serving.

## Prerequisites

- A written goal with target, deadline, and guardrails (output of set-campaign-goals-and-kpis).
- Break-even CPA/ROAS and margin figures (output of calculate-and-validate-unit-economics).
- Conversion tracking trustworthy enough to read, step 3a below verifies this before anything else is believed.
- At least 30 days of account history; low-volume accounts need 60-90 days for stable reads.

## Procedure

Diagnosis is entirely read-only. Writes happen only inside the handed-off skill, and before the
first Google Ads write of the session the model must consult gads_policy_guardrail. Every write in
any downstream skill goes preview (validate_only=true) -> explicit user approval -> commit.

1. **Confirm the goal is testable.** It needs an output metric, a number, a deadline, and a
   guardrail. If any is missing, stop and run set-campaign-goals-and-kpis, everything after this
   point compares reality against that target.

2. **Write the goal as an equation and compute the gap.** Decompose the output into volume x
   efficiency x value terms (e.g. revenue = clicks x CVR x AOV; deals = leads x lead-to-deal rate).
   Pull trailing 30- and 90-day actuals with gads_get_account_performance, and funnel/backend
   context with ga4_run_report. For each term record current value, required value, and the gap.
   The weakest term points at the layer to inspect first, but verify with step 3 before believing it.

3. **Walk the layers top-down.** Check in this order and stop at the first one that fails, that
   is your candidate limiter. Never skip ahead because a lower layer looks more interesting.

   a. **Tracking integrity, can the numbers be trusted?** Call gads_list_conversion_actions to
      audit which actions are primary and counting; call gads_run_gaql_query for daily conversion
      counts per action over 30 days (look for collapses, spikes, or duplicates); compare totals
      against ga4_run_report or backend figures. Discrepancy beyond ~20%, or an unexplained drop
      of 50%+, means tracking is the limiter, nothing below can be diagnosed on lying data.

   b. **Economics and capacity, should this account scale at all?** Compare current CPA/ROAS at
      current volume against break-even with margin data from unit economics. HUMAN STEP (outside
      VigilDog): confirm downstream capacity, can sales follow up, can fulfillment ship, does the
      offer hold at higher volume? If the business loses money per conversion or cannot absorb
      more volume, buying more traffic makes things worse, not better.

   c. **Post-click conversion, do clicks become conversions?** Pull CVR by campaign and device
      via gads_run_gaql_query and engagement/abandonment context via ga4_run_report. Judge against
      the account's own trailing 90-day band, not generic benchmarks. High-intent traffic with CVR
      in the bottom of the account's own range means the page or offer is the limiter. Check
      search-term quality first, junk queries masquerade as a landing-page problem.

   d. **Reach, are we in enough of the right auctions?** Pull impression share plus IS lost to
      budget and lost to rank via gads_run_gaql_query, and competitive position via
      gads_get_auction_insights. Good CVR but thin volume with high lost-IS means reach is the
      limiter; which kind of lost-IS decides the downstream skill (see Decision rules).

   e. **Message, does the ad attract the right people?** Only if all layers above pass: check CTR
      against the account's own history, Ad Strength via gads_get_ad_strength, and asset-level
      results via gads_get_rsa_asset_performance. Weak CTR on relevant queries, or one stale asset
      absorbing all serving, makes creative the limiter.

4. **Name exactly one limiter.** Write one sentence: "<metric> is <current> against <required>,
   which sits in the <layer> layer, so the limiter is <specific thing>." Every other issue noticed
   during the walk goes to a parked list (sheets_write_values, or the working notes) with metric,
   layer, and rough impact, kept, not acted on.

5. **Hand off to the matching procedure skill.** Call gads_list_skills and pick the one skill that
   removes the named limiter (mapping in Decision rules). Run that skill as written, it owns its
   own previews, approvals, and verification. Do not launch a second procedure skill in parallel
   on the same account.

6. **Timebox the fix cycle.** One to two weeks per cycle. During it, only two kinds of work are
   allowed: the limiter fix, and maintenance (reports, broken-link fixes, obvious negatives, small items that cannot contaminate the metric under test). Any larger idea goes to the parked
   list. HUMAN STEP (outside VigilDog): tell the stakeholder what the active limiter is and where
   their other requests sit in the queue, visible focus prevents drive-by priorities.

7. **Let the fix settle, then verify.** After the change lands, hold further major changes for at
   least one cycle length: Smart Bidding recalibrates over roughly 1-2 weeks and conversion lag
   delays the true read. Then re-pull the exact metrics from steps 2-3 with the same tools. The
   limiter counts as removed only when its metric holds improved across two consecutive review
   periods, one good week is weather, two is climate.

8. **Repeat from step 2.** Recompute the gap; the next weakest term is the next candidate.
   Removing one limiter routinely exposes the next one downstream (fixed tracking reveals a
   conversion problem; fixed conversion reveals a reach problem), that is the system working.
   Cadence: quick health scan daily, this diagnostic loop weekly-to-biweekly via
   run-a-weekly-performance-review, goal-level recalibration monthly and quarterly via
   run-a-monthly-performance-review and run-a-quarterly-business-review.

## Decision rules

- **Order is law.** tracking -> economics/capacity -> post-click conversion -> reach -> message.
  Never dedicate a fix cycle to a lower layer while a higher one is failing. Maintenance touches on
  lower layers remain fine.
- **Confirmation threshold.** A metric must breach its band in two consecutive review periods
  before it can be named the limiter. Sole exception: tracking failures, a tag that broke today
  gets investigated today, because every day of phantom data poisons every other read.
- **Tracking red lines.** Ads-vs-backend discrepancy > 20%; conversion count swing > 50% without a
  corresponding account change; conversions recorded on page load rather than the real event.
  Any of these => limiter is tracking, route to set-up-google-ads-conversion-tracking or
  implement-transaction-id-deduplication.
- **Reach sub-rule.** IS lost to budget > 10% on campaigns meeting their guardrails => budget-side:
  handle-budget-limited-campaigns or allocate-budget-across-campaigns. Lost-to-rank dominant =>
  quality/bid-side: improve-quality-score or calculate-bid-targets.
- **Layer-to-skill map (via gads_list_skills):** tracking =>
  set-up-google-ads-conversion-tracking / set-up-offline-conversion-tracking; economics =>
  calculate-and-validate-unit-economics (and a HUMAN business conversation); post-click conversion
  => audit-and-optimize-an-existing-landing-page / improve-landing-page-experience; reach => per
  the reach sub-rule, or scale-bids-and-budgets when guardrails have headroom; message =>
  rsa-testing-with-the-iteration-loop / write-compelling-rsas / run-a-creative-testing-cycle.
- **One limiter per account per cycle.** Across a portfolio, cap active fix cycles at what can be
  genuinely attended, a handful of accounts at a time, not all of them.
- **Step-change beats polish.** When two candidates compete, prefer the one with multiple-x
  potential (repairing measurement, feeding sales outcomes into bidding, replacing a homepage
  landing experience) over a 10-20% nudge (headline tweaks on an already-decent campaign). The fix
  you are avoiding because it is uncomfortable is frequently the real one.
- **Effort split.** Maintenance should stay around a third or less of account effort; if
  unfocused work not tied to the active limiter exceeds ~20% of time between reviews, the process
  has drifted, re-run this skill.
- **Settling time.** Minimum one cycle length of no-major-changes after each fix; extend when
  conversion lag exceeds 7 days or the sales cycle is long.
- **Volume floors for reads.** Below ~10 conversions/week, widen every window to 30-60 days before
  classifying anything; deciding off a thin week creates limiters that do not exist.

## Common failure modes

- **Shotgun optimization.** Changing ads, bids, pages, and audiences in the same week moves numbers
  without producing knowledge. The one-limiter rule exists precisely to keep cause attached to effect.
- **Comfort-zone diagnosis.** Practitioners find limiters in the layer they happen to be skilled
  at. The top-down walk with explicit thresholds is the antidote, the data picks the layer, not
  the preference.
- **Scaling into a wall.** Raising budgets while the business cannot absorb volume (slow follow-up,
  thin margins, stockouts) converts ad spend into damage. That is why economics/capacity is
  checked second, before any traffic push.
- **Reacting to one bad week.** Single-period dips are usually weather, seasonality, learning
  phases, delayed conversions. The two-period confirmation stops the whipsaw; the tracking
  exception stops the opposite failure of waiting on broken data.
- **Confusing settling noise with a new problem.** Metrics wobble after every real change. Reading
  that wobble as the next limiter leads to solving the same problem twice. Honor the settling window.
- **Polishing a vanity number.** "Improved ROAS" achieved by shrinking to brand-only traffic passes
  the metric and fails the goal. Every verification in step 7 checks the guardrails and volume
  floor alongside the headline metric.
- **Invisible focus.** When stakeholders cannot see the active limiter and the parked list, they
  inject requests that fragment the cycle. Making the queue visible turns "not now" into a shared
  conclusion rather than a fight.

## Related skills

- Run before this: set-campaign-goals-and-kpis, calculate-and-validate-unit-economics.
- This skill dispatches to (discover via gads_list_skills): set-up-google-ads-conversion-tracking,
  set-up-offline-conversion-tracking, implement-transaction-id-deduplication,
  audit-and-optimize-an-existing-landing-page, improve-landing-page-experience,
  handle-budget-limited-campaigns, allocate-budget-across-campaigns, calculate-bid-targets,
  improve-quality-score, scale-bids-and-budgets, rsa-testing-with-the-iteration-loop,
  write-compelling-rsas, run-a-creative-testing-cycle.
- Cadence partners: run-a-weekly-performance-review, run-a-monthly-performance-review,
  run-a-quarterly-business-review.
- For validating a fix as a controlled test: run-a-campaign-experiment; for queuing parked ideas
  formally: manage-experiment-backlog.
