You review. You approve exclusions. The script does the rest.
What this MCC script does
This script is built for MCC accounts and works across multiple child accounts. It:
- Reads your approvals from the existing queue tab
The only manual action is typing yes in column P (exclude). - Applies website placement exclusions
It adds approved website placements to a shared Placement Exclusion List in each labelled account. - Pulls fresh flagged placements for Demand Gen + Display, and rewrites the queue
It keeps your previous approvals by matching a unique row_key. - Keeps an audit log in history, without duplicates
It uses PropertiesService to de-dupe rows across runs, so history stays clean.
Important limitations. Mobile apps and YouTube
There are two important limitations to be aware of.
1) Mobile app placements
Google Ads Scripts cannot exclude mobile app placements via shared placement exclusion lists.
When the placement looks like an app, the script will skip it (to prevent “valid URL format” errors).
If you want to block apps, do it manually in Google Ads:
Insights and reports → Where and When your ads showed → Where ads showed
Then exclude the relevant apps or categories there.
2) YouTube placements
For Demand Gen and Display, scripts often return YouTube inventory as youtube.com rather than a specific channel or video. That means this workflow is great for website placements, but it’s not a reliable way to manage channel or video level exclusions.
If you want channel or video level exclusions, do it in the Google Ads UI placement report.
How the script flags placements
The script pulls placement performance from the last X days and flags rows if they match one or more conditions.
Default thresholds in your config:
- Impressions ≥ 200
Only look at placements with enough volume to judge. - Clicks < 10
Flags low engagement placements. - CTR < 1%
Flags placements with weak clickthrough. - Bad TLD list
Flags suspicious domains like .xyz, .icu, .click, etc.
You can tighten or loosen these depending on account size and volume.
Recommended thresholds
Use these as a starting point and adapt per account type.
For lead gen (most B2B)
- Impressions: 200
- Clicks: 10
- CTR: 1%
- Lookback: 30 days
For smaller accounts (low volume)
- Impressions: 100
- Clicks: 5
- CTR: 0.7%
- Lookback: 30 days
For bigger accounts (high volume)
- Impressions: 500
- Clicks: 20
- CTR: 1% to 1.5%
- Lookback: 14 to 30 days
Tip. Start conservative. You can always exclude more later, but restoring reach after aggressive exclusions is slower.
Step by step. How to set up the script
Step 1. Add the full script code
Create a new MCC level Google Ads Script and paste in the full code below.
Then scroll back up to the CONFIG section and update the values for your situation:
- SPREADSHEET_URL
- ACCOUNT_LABEL
- thresholds
- ENABLE_EMAIL_ALERTS and ALERT_EMAILS
View the script here
Step 2. Create an empty Google Sheet
Create a new sheet. Copy the URL and paste it into:
var SPREADSHEET_URL = “PASTE_YOUR_SHEET_URL_HERE”;
After the first run, the script will create these tabs:
- queue (your review list)
- history (audit log)
- allowlist (optional safety list)
- instructions (guide for your team)
Step 3. Label the accounts you want included
Apply this label to the child accounts you want the script to manage:
var ACCOUNT_LABEL = “MCC_placement_excluder”;
Only labelled accounts are processed.
Step 4. Configure thresholds and email alerts
In the config section, set:
- thresholds (impressions, clicks, CTR, lookback)
- your recipient email address
Step 5. Preview and run
- Click Preview first. Check the logs.
- Then run it.
After the run, open your Google Sheet and go to queue.
Your workflow. The only manual action
Open the queue tab. Review the placements. Then:
✅ Type yes in column P (exclude) for placements you want to block.
On the next script run, those approved placements get added to the account’s placement exclusion list:
Auto Excluded . Display + Demand Gen
Frequency. When should you schedule it?
A simple weekly rhythm works well.
Weekly, low effort
- Schedule the script for every Monday morning
- You review the queue list once per week
- You mark exclude = yes
- Next Monday run applies those exclusions and refreshes the queue
Twice per week, faster cleanup
- Schedule Monday and Thursday
- Review twice per week
How the Google Sheet tabs work
queue tab
This is the working list.
- Contains the flagged placements for review
- Approvals persist between runs via row_key
- Only edit column P (exclude)
history tab
This is an audit log. It is de-duped.
- You don’t need to edit it
- It helps you track what was flagged and when
allowlist tab
Optional. Add placements you never want excluded.
Add domains in column A, for example:
- youtube.com
- mail.google.com
- nytimes.com
instructions tab
A built-in guide your team can rely on. It includes the mobile app limitation and the one thing that matters: only column P.
Common questions and troubleshooting
Why do I still see youtube.com instead of channels or videos
For Demand Gen and Display, scripts often return YouTube inventory as youtube.com. If you need channel or video exclusions, use the Google Ads UI placement report.
Why didn’t a placement get excluded?
Most common reasons:
- It was an app placement and got skipped
- It wasn’t a valid domain format
- It’s on the allowlist
- The row was not marked yes in column P
- The account wasn’t labelled correctly
Need help implementing this?
If you want help setting this up across your MCC, or you want a more automated version (for example, auto excluding certain TLDs and patterns), reach out to us at hello@cobyagency.com.
FAQ
What is this MCC script for?
It helps you review flagged Demand Gen and Display placements across multiple child accounts and apply approved website exclusions via a shared Placement Exclusion List.
What’s the only manual step?
You review the queue tab and type yes in column P (exclude) for the placements you want to block.
Can this script exclude mobile app placements?
No. Google Ads Scripts can’t exclude mobile app placements through shared placement exclusion lists, so the script skips app-like placements to avoid errors.
Why does YouTube show up as youtube.com instead of channels or videos?
For Demand Gen and Display, scripts often return YouTube inventory as youtube.com rather than channel/video level detail. Use the Google Ads UI placement report if you need channel or video exclusions.
Where do approved exclusions get added?
Approved website placements get added to the account’s placement exclusion list: Auto Excluded . Display + Demand Gen
Why didn’t something get excluded even after a run?
Common causes include: it was an app placement (skipped), invalid domain format, it’s on the allowlist, the row wasn’t marked yes in column P, or the account label wasn’t applied correctly.