---
name: manage-demand-gen-and-video-placements
description: >-
  The deep placement audit for Demand Gen, Video, and (read-only) PMax: exports where ads actually showed, applies
  always-exclude rules (mobile app categories, parked/ad-farm domains, high-risk TLDs), evaluates individual sites
  and YouTube channels against statistical floors and quality signals, verifies brand-safety configuration, and
  maintains the account's exclusion lists. Use it monthly, two weeks after any upper-funnel launch, on account
  takeover, or whenever a CPA spike smells like junk inventory, and whenever the monthly optimization cycles
  escalate a placement finding. Do NOT use it for audience, creative, bidding, or budget work (that is
  run-demand-gen-optimization-cycle / run-video-campaign-optimization-cycle), and it does not launch campaigns
  (launch-a-demand-gen-campaign / launch-a-video-campaign). PMax placements can only be excluded at account level, this skill flags them; the shared-list application is a human step.
---
# Placement Audit and Exclusion (Demand Gen, Video, PMax)

## Purpose
Upper-funnel inventory decays by default: mobile games farm accidental clicks, parked domains soak impressions
with bot traffic, and spam YouTube channels monetize views nobody watches. This skill is the systematic sweep
that finds where the money actually went, excludes what fails the evidence bar, and keeps the exclusion
infrastructure (lists, brand-safety settings) applied across every campaign, including ones launched since the
last pass.

## When to run
- Monthly, as the deep companion to the Demand Gen and Video optimization cycles (they spot-check; this audits).
- Two weeks after launching any Demand Gen, Video, or PMax campaign, first junk accumulates fast.
- Immediately on inheriting an account: unmanaged accounts almost always carry months of placement rot.
- Ad hoc on a sudden Demand Gen/Video CPA spike or any brand-safety complaint.

## When NOT to run
- The problem is audiences, creative, bidding, or budget → `run-demand-gen-optimization-cycle` or
  `run-video-campaign-optimization-cycle`.
- No upper-funnel campaign live yet → `launch-a-demand-gen-campaign` / `launch-a-video-campaign` (set the
  brand-safety defaults at launch instead).
- You want positive content targeting (choosing where TO show), not exclusions, that is launch-time targeting
  work, not this audit.

## Prerequisites
- Active Demand Gen, Video, or PMax campaigns with 30+ days of data (14 days acceptable for the post-launch pass).
- Any existing placement exclusion lists and the standing domain blocklist, if the account keeps one.
- GA4 linked (optional but valuable, bounce/engagement per referring placement sharpens exclusion calls).
- A hard time-box: 90 minutes maximum. Placements below meaningful spend do not get investigated.

## Procedure
1. **Consult the policy guardrail.** Call `gads_policy_guardrail` before the session's first Google Ads write.
2. **Export the evidence.** Call `gads_get_placement_report` for the last 30 days, separately per campaign type
   (Demand Gen, then Video), sorted by cost descending, it covers websites, YouTube channels/videos, and apps.
   Add `gads_run_gaql_query` for the network split on Demand Gen campaigns (YouTube / Discover / Gmail / Display)
   and for PMax placement rows (`performance_max_placement_view`, impression-level only). Call
   `gads_get_pmax_channel_performance` for the PMax channel allocation picture.
3. **Apply the always-exclude rules (no performance data needed).**
   - Mobile apps: unless this is an app-install account, app placements are presumed waste (accidental taps in
     games and kids' apps). Exclude surfaced app placements via `gads_add_negative_placements`, preview
     (validate_only=true), apply only after user approval. Account-level app-CATEGORY exclusion is a HUMAN STEP
     (outside VigilDog), instruct the user to exclude all app categories account-wide so future campaigns inherit
     it.
   - Junk domains: exclude on sight, parked/ad-wall domains, random-character or keyword-stuffed hostnames, and
     bargain-TLD hosts (.click, .download, .bid, .win, .loan and similar) that correlate with ad arbitrage. Apply
     via `gads_add_negative_placements` (preview → approval) and append every find to the standing blocklist.
4. **Evaluate Display placements on the evidence bar.** Work the top 50 by spend from step 2, not the whole
   list. Enforce the data floors first (1,000+ impressions, 100+ clicks for any CPA verdict, 30+ days), then
   apply the signal table in Decision rules. Where GA4 is linked, pull bounce/engagement for high-spend
   placements via `ga4_run_report`, a 90%+ bounce placement is an exclusion even when its CTR looks fine.
   Execute all exclusions via `gads_add_negative_placements` (preview → approval), batched.
5. **Evaluate YouTube channels and videos.** Work the top 30 by spend. Quality signals that warrant exclusion:
   children's content when the product doesn't target parents (wrong audience and a compliance exposure);
   music/lyric loops and auto-generated spam channels (passive or fake attention); language mismatched to the
   target market; made-for-kids flagged videos. Flag-and-investigate signals: channels under ~90 days old pulling
   heavy impressions, upload-to-subscriber ratios past ~50:1, comments disabled with zero engagement. Keep and
   consider as managed placements: channels showing strong view rate plus conversions. Exclude via
   `gads_add_negative_placements` (preview → approval).
6. **Verify brand-safety configuration.** HUMAN STEP (outside VigilDog), the account/campaign content-suitability
   surfaces are UI-only. The user confirms: inventory type at the moderate tier minimum (restricted tier for
   premium/regulated brands; the widest tier is never acceptable, if found, change it today); sensitive
   categories excluded (tragedy/conflict, social issues, profanity, suggestive, shock); mature-audience label
   excluded, unlabeled content excluded for cautious brands. Then spot-check 3–5 of the top-impression sites from
   step 2 by actually visiting them: real editorial content, brand-appropriate, right language and geography.
7. **PMax review (flag, don't fight).** PMax placement data is impression-weighted with little click/conversion
   detail, and PMax accepts NO campaign-level placement exclusions, only account-level lists bite. So: scan the
   PMax placement rows for brand-unsafe sites, unwanted apps, and junk-pattern domains; add them to the flag list.
   Applying them through an account-level shared exclusion list is a HUMAN STEP (outside VigilDog), deliver the
   exact domain list. For accounts running several PMax campaigns, recommend automating the flagging (scripted
   scan of the placement view against the junk-domain patterns) rather than manual line reading.
8. **Maintain the exclusion infrastructure.** HUMAN STEP (outside VigilDog) for shared-list surgery: consolidate
   overlapping lists (brand-safety, app, performance-based, known-bad-domain lists; each holds up to 65,000
   entries), and, critically, verify every currently active Demand Gen and Video campaign has the relevant
   lists applied, including campaigns launched since the last audit. New campaigns silently missing the lists is
   the most common regression this skill catches.
9. **Document and trend.** Record: date, placements reviewed, exclusions added, campaigns touched, lists updated,
   next audit date. Compare against prior months: flagged-placement volume rising, junk-TLD impression share
   growing, or new-exclusion rate accelerating for 3+ consecutive months means the inflow itself is broken, investigate expansion/optimized-targeting settings and audience breadth in the optimization-cycle skills
   rather than mopping faster.

## Decision rules
- **Data floors (no exclusion below these, junk-pattern domains excepted):** 1,000+ impressions; 100+ clicks
  before any CPA/ROAS verdict; 30+ days of history.
- **Display signal table:** 1,000+ impressions with zero clicks → exclude (bot or invisible slot) · CTR above 10%
  → flag for manual review before excluding (accidental-click pattern, but verify) · CTR above 3% with 100+
  clicks and zero conversions → investigate, then decide · bounce above 90% (GA4) → exclude · CPA above 3x
  campaign average on 100+ clicks → exclude · CPA 1.5–3x average → monitor, not exclude · at/below average →
  keep, consider promoting to managed placement.
- **Exclusion level:** universally bad (junk domains, brand-unsafe) → account-level shared list; bad for one
  campaign's goal but plausibly fine elsewhere → campaign level; intra-campaign variance → ad group level. Default
  to the shared list, per-campaign copies of the same exclusion are unmaintainable.
- **PMax constraint:** account-level shared lists only; campaign-level placement exclusions do not exist for
  PMax. Judge PMax placements on brand safety and relevance, not on per-placement performance you mostly can't
  see.
- **Automation threshold:** several upper-funnel campaigns or ~$5k+/month of Demand Gen/Video spend justifies
  scripted flagging (zero-click scans, CTR outliers, CPA outliers, domain-pattern matches). Scripts flag; a human
  approves every exclusion, a promising new placement looks bad before it has data.
- **Scope control:** top 50 Display placements, top 30 YouTube placements, 90-minute ceiling. A placement with 10
  impressions is not worth a minute.

## Common failure modes
- **Trusting defaults on apps.** App inventory is never acceptable by default outside app-install campaigns;
  exclude the categories account-wide once and verify the exclusion survives.
- **Excluding on two days of data.** Early metrics on a fresh placement are noise; the floors exist to prevent
  strangling placements that would have performed.
- **Auditing only the top 10.** The long tail of small bad placements collectively outspends the visible
  offenders; the top-50 discipline exists for that reason.
- **Lists that stop being applied.** Every new campaign launch is a chance for exclusion lists to not be
  attached. Step 8's application check is the audit's highest-leverage minute.
- **One heroic cleanup, then nothing.** Junk inventory regenerates continuously; a quarterly purge loses to a
  monthly rhythm every time.
- **Trying to exclude at PMax campaign level.** It silently does nothing; only the account-level list route
  works.
- **Recurring junk treated as a mop-up problem.** If every month surfaces a fresh crop of the same category of
  junk, the source is targeting/expansion configuration, fix the tap, not the puddle.

## Related skills
- Fed by: `run-demand-gen-optimization-cycle` and `run-video-campaign-optimization-cycle`, their placement
  spot-checks escalate here.
- Launch-time counterparts: `launch-a-demand-gen-campaign` / `launch-a-video-campaign` set the brand-safety and
  exclusion baseline this skill then maintains.
- Adjacent: `run-pmax-ecommerce-optimization-cycle` for PMax issues beyond placements; `optimize-audience-performance`
  when junk inflow traces back to audience breadth.
