Centralized Brand Safety: Building an Account-Level Exclusion Workflow for Agencies
Agency guide: build an account-level placement exclusion workflow with templates, GAQL queries and bulk scripts for Google Ads in 2026.
Hook: One centralized switch to stop brand-safety fires — for all clients, at scale
Agencies waste hours toggling exclusions campaign-by-campaign, juggling client approvals and hunting for rogue placements in Performance Max, YouTube, Display and Demand Gen. In 2026, with Google Ads offering account-level placement exclusions, that manual grind is no longer defensible. This guide gives an agency-ready workflow, governance templates, and ready-to-run bulk scripts so you can roll out, audit and automate account-level exclusions across multiple client accounts without breaking automation or reporting.
The opportunity in 2026: Why account-level exclusions matter now
Late 2025 and early 2026 accelerated two trends that make this workflow essential:
- Google’s account-level exclusions (announced Jan 15, 2026) let advertisers block placements once and apply them across Display, YouTube, Demand Gen and Performance Max — a direct response to advertiser demand for stronger guardrails around automated buying.
- Automation-first campaign types (Performance Max, automated bidding and audience optimization) increase efficiency but reduce per-campaign controls; account-level governance preserves automation benefits while protecting brand safety.
For agencies, the combination means: fewer configuration errors, faster client approvals and simpler audits — but only if you implement a repeatable, auditable workflow and the right automation.
Quick overview: The account-level exclusion workflow
At a glance, your agency should formalize this 6-step flow across the manager account (MCC) and client accounts:
- Discovery — detect risky placements and build candidate lists.
- Triage & policy — classify risk level, assign owner, gather evidence (screenshots, timestamped metrics).
- Approval — client sign-off using a standardized template or auto-approval SLA.
- Implementation — apply account-level exclusions with bulk scripts and track changes.
- Validation — confirm spend stops and update dashboards and logs.
- Monitoring & review — scheduled audits, metrics-based triggers to add/remove exclusions.
Step 1 — Discovery: Find candidate placements fast
Start with data-driven discovery, combining placement performance with signals that flag brand risk (e.g., sudden spikes in impressions on low-conversion placements, high bounce rates or third-party brand-safety feeds).
GAQL query to surface top placements (last 30 days)
SELECT
placement_view.resource_name,
placement_view.url,
metrics.impressions,
metrics.clicks,
metrics.conversions,
metrics.cost_micros
FROM placement_view
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
LIMIT 1000
Run that via the Google Ads API for each client to get the highest-impression placements. Then join that with:
- Third-party brand-safety feeds (e.g., IAB categories, brand-safety vendors).
- In-house heuristics (CTR drops >50% month-over-month, sudden viewability drops, suspicious app placements).
- User reports and client escalations.
Step 2 — Triage & classification
Create a simple triage matrix and tag candidates:
- High risk — obvious safety violations, immediate account-level exclusion recommended.
- Medium risk — context-dependent; review with creative teams or client.
- Low risk / monitor — keep under watch, auto-remove if metrics improve.
Capture evidence: URLs, screenshots, impression and spend snapshots, relevance notes. Store everything in a central audit bucket (we recommend BigQuery or an S3 bucket indexed by client ID and date). For discovery at scale, pair GAQL outputs with a diagnostic pipeline like the SEO/diagnostic toolkits you already use so audits are reproducible.
Step 3 — Approval & governance
Establish an Account-Level Exclusion Policy that clients sign once per account and that defines:
- Decision ownership (agency lead, client brand safety owner)
- Approval SLA (e.g., auto-apply after 48 hours unless client objects)
- Rollback policy (how and when exclusions can be removed)
- Audit & reporting cadence (weekly automated reports, monthly reviews)
Tip: Use an opt-in workflow where clients can request a stricter “Block-First” posture for high-risk verticals (healthcare, finance, kids).
Step 4 — Implementation: Bulk scripts and templates
This is the heart of the guide. Below are tested templates and a recommended Python script using the Google Ads API. The script reads a CSV of placements and applies account-level exclusions for each client under your Manager account.
CSV template: account_exclusions.csv
manager_customer_id,client_customer_id,placement_url,reason,source,requested_by,requested_at
Columns explained:
- manager_customer_id: your agency MCC ID
- client_customer_id: the Google Ads customer ID for the client account
- placement_url: the exact URL or app package to exclude
- reason: short reason e.g., "brand_safety:inaccurate_content"
- source: discovery method e.g., "GAQL:top_placements", "client_report"
- requested_by: owner email
- requested_at: ISO timestamp
Python: Bulk apply account-level exclusions (outline)
This script assumes you have a configured google-ads client library and manager credentials that can impersonate client accounts. It uses batch mutate operations so you can safely run large CSVs.
#!/usr/bin/env python3
# bulk_account_exclusions.py
# Requirements: google-ads (Python library), credentials with manager access
from google.ads.googleads.client import GoogleAdsClient
import csv
import time
CLIENT_CONFIG_PATH = 'google-ads.yaml'
CSV_FILE = 'account_exclusions.csv'
def apply_exclusions():
client = GoogleAdsClient.load_from_storage(CLIENT_CONFIG_PATH)
with open(CSV_FILE, newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
customer_id = row['client_customer_id']
placement = row['placement_url']
reason = row['reason']
# NOTE: Replace `CustomerNegativeCriterionService` below with the
# exact service name for account-level placement exclusions in your
# API version. This is a conceptual example — test on a sandbox.
service = client.get_service('CustomerNegativeCriterionService')
operation = client.get_type('CustomerNegativeCriterionOperation')
# Build the negative placement (this pseudo-structure will vary with API)
negative_criterion = operation.create
negative_criterion.placement.url = placement
negative_criterion.type_ = client.get_type('CriterionTypeEnum').CriterionType.PLACEMENT
try:
response = service.mutate_customer_negative_criteria(
customer_id=customer_id,
operations=[operation]
)
print(f"Applied exclusion for {customer_id} -> {placement}")
except Exception as e:
print(f"ERROR applying {placement} to {customer_id}: {e}")
time.sleep(0.2) # rate-limit friendly
if __name__ == '__main__':
apply_exclusions()
Important notes:
- Test in a sandbox or single client before running across your book of business.
- Use batch operations / BatchJobService for very large lists to minimize RPC overhead and get observability into failures.
- Always persist the response resource names and mutation timestamps to an audit table (BigQuery recommended).
Google Ads Scripts (Manager-level) quick example
If you need a lightweight alternative and prefer Google Ads Scripts, run a manager script that iterates client accounts and calls an account-level exclusion API. Below is a conceptual skeleton — adapt to the exact Ads Scripts API methods available in your environment.
// manager_exclusions.gs
function main() {
var csv = UrlFetchApp.fetch('https://your-storage/account_exclusions.csv').getContentText();
var rows = Utilities.parseCsv(csv);
rows.shift(); // remove header
var accountIds = {}; // group rows by client ID
rows.forEach(function(r){
var client = r[1];
accountIds[client] = accountIds[client] || [];
accountIds[client].push({placement: r[2], reason: r[3]});
});
for (var clientId in accountIds) {
MccApp.select(MccApp.accounts().withIds([clientId]).get().next());
var exclusions = accountIds[clientId];
exclusions.forEach(function(ex) {
// Conceptual: call the account-level exclusion function available
// in Ads Scripts. Replace with the actual API call/method.
AdsApp.currentAccount().createAccountLevelPlacementExclusion(ex.placement);
});
}
}
Because Ads Scripts capabilities evolve, treat this as a conceptual shortcut. The Python Google Ads API approach gives you more control and auditability. For live moderation or evidence capture in approval flows, consider on-device AI integrations that reduce latency and preserve privacy.
Step 5 — Validation: Confirm the exclusion took effect
After applying exclusions, validate programmatically and visually:
- Run a GAQL query for the placement to confirm impressions go to zero for new time slices.
- Check the mutate response and record the resource name and timestamp in your audit table.
- Use small-sample ad groups to attempt a test impression (if safe) to ensure blocking is working.
Step 6 — Monitoring, audits & rollback
Automate ongoing monitoring so exclusions remain effective and are regularly reviewed:
- Weekly dashboard: Exclusions applied per account, spend prevented, number of hits prevented. Use observability playbooks that cover visual audio dashboards and traces for ad serving (observability playbook).
- Trigger-based additions: if a placement shows >X impressions and <Y conversions across 7 days, consider auto-blocking as "medium risk" — design thresholds with rate-limit and cost-aware tiering in mind.
- Quarterly review: re-evaluate low-risk blocks for removal to minimize overblocking.
Always support a rollback mechanism: store previous state before mutation. Your mutation pipeline should write a JSON snapshot of existing account-level exclusion lists before each update so you can revert with a single job. If you use edge sync patterns for offline operators, see guidance on edge-sync and low-latency workflows.
Governance templates: SLA, audit log, and client-facing language
Client approval snippet
We recommend applying account-level placement exclusions to protect brand safety across Display, YouTube, Demand Gen and Performance Max. By approving, you authorize [Agency] to implement exclusions based on performance and risk indicators. Auto-apply SLA: 48 hours.
Audit log fields (recommended)
- mutation_id
- manager_customer_id
- client_customer_id
- placement_url
- operation (ADD / REMOVE)
- requested_by
- approved_by
- timestamp
- evidence_link
- rollback_snapshot_id
Real-world example: How one mid-size agency saved 120 hours a month
Case summary (anonymized): a 35-client agency historically spent 8–12 hours per client per month managing campaign-level placement blocks. After moving to an account-level exclusion policy and automating with the scripts above, they:
- Reduced manual configuration time from ~350 to ~10 hours monthly
- Cut misconfiguration incidents by 92%
- Improved client satisfaction due to faster response times and a clear audit trail
Key enablers: manager-level automation, approval SLA, and a BigQuery audit table that reconciled every applied exclusion with the original evidence. For governance and AI-safety layers that stop noisy automation from creating extra work, see governance tactics.
Advanced strategies and 2026 trends to adopt
- Signal-driven auto-blocking: Use a scoring model that weighs third-party brand-safety feeds, placement performance, and client sensitivity to auto-suggest or auto-apply exclusions.
- Privacy-aware logging: With global privacy controls (post-2024 cookieless shifts), store identifiers hashed and keep accessible evidence rather than raw PII.
- Human-in-the-loop for media buys: Use an approval microservice where high-risk flags create a Slack/Teams alert complete with evidence and one-click approve/deny actions that trigger your API job. For low-latency decisioning and evidence capture, pair this with on-device moderation guidance (on-device AI).
- Looker Studio dashboards: Expose exclusion state, prevented spend and top blocked placements by client — an essential part of monthly governance reports. See observability practices here: edge visual & audio observability.
Common pitfalls and how to avoid them
- Overblocking — don’t blanket block entire domains without business rationale; measure impact and have rollback windows.
- Missing audit trails — always record who requested, who approved and the evidence. Without it client trust erodes fast.
- Ignoring automation limits — Google Ads API rate limits and account quotas matter. Use batch jobs and latency budgeting and exponential backoff.
- Not testing — always validate in a staging client or a single low-spend account before global rollout.
Checklist to launch in 30 days
- Week 1: Build CSV template, set up Google Ads API access, and create BigQuery audit dataset.
- Week 2: Run discovery GAQL queries for top 10 clients and assemble candidate lists.
- Week 3: Implement Python bulk script and run one pilot client; confirm validation steps.
- Week 4: Roll out across remaining clients, enable dashboards and weekly monitoring alerts.
Final takeaways
Account-level placement exclusions are a watershed capability in 2026 — but the technical feature alone won’t protect your clients. Agencies win by pairing the Google Ads capability with a repeatable workflow: data-driven discovery, clear governance, fast approvals, auditable automation and ongoing monitoring. Use the CSV and script templates above as a starting point, and invest in logging and rollback mechanisms. For more on cost-aware tiering and scraping-friendly patterns (useful when you’re ingesting third-party brand-safety feeds), see this guide: cost-aware tiering & indexing.
Call to action
Ready to implement account-level exclusions across your book of business? Download our agency toolkit (CSV templates, Python script, GAQL queries and governance checklist) or book a 30-minute implementation review with our team to adapt this workflow to your stack. If you need quick observability and incident runbooks for your rollout, pair this with a hosted diagnostic toolkit to validate behaviour across accounts: SEO diagnostic & hosted tunnels.
Related Reading
- Next‑Gen Programmatic Partnerships: Deal Structures, Attribution & Seller‑Led Growth (2026)
- Stop Cleaning Up After AI: Governance tactics marketplaces need to preserve productivity gains
- How to Audit Your Tool Stack in One Day: A Practical Checklist for Ops Leaders
- Edge Visual Authoring, Spatial Audio & Observability Playbooks for Hybrid Live Production (2026)
- From Onesies to Big Butts: The Role of Absurd Visual Choices in Indie Game Viral Success
- Smart Plug Safety Certifications: What Homeowners Must Look For
- How Retail Changes Affect Baby Product Availability: What New Store Openings and Leadership Moves Mean for Parents
- DIY Cocktail Kit for Two: Building a Romantic Bar Cart with Liber & Co.
- Best Portable and 3‑in‑1 Wireless Chargers for Multi-Day Hikes and Hotel Stays
Related Topics
just search
Contributor
Senior editor and content strategist. Writing about technology, design, and the future of digital media. Follow along for deep dives into the industry's moving parts.
Up Next
More stories handpicked for you