Free · No signup

Google Ads placement exclusion list generator

Drop in your GDN or PMAX placement report. Get a spend breakdown, a list of placements worth a second look, and a deduplicated exclusion list you can paste straight into Google Ads. Your file never leaves your browser.

Drop your placement report here

or browse — .xlsx or .csv, English or German exports

Nothing is uploaded — the file is read in your browser

Don't have a report to hand?

How to export your placement report

  1. 1In Google Ads, open Reports → Predefined reports → Other → Campaign URL performance.
  2. 2Set the date range to at least the last 90 days. A short window hides the long tail, which is exactly where the junk lives.
  3. 3Download as .csv or .xlsx. Both work, in any account language.
  4. 4Drop the file above. Nothing uploads — parsing happens in your browser.

What it checks

Every signal below is computed from your spreadsheet and the shape of the domain name. None of them require visiting a website, which is why this can run for free in your browser — and also why none of them is proof of anything on its own.

Spend concentration
How much of your budget sits in the top 10, 50, 100 and 500 placements — and how much hides in the long tail below them.
Spend without conversions
Placements that cost real money and returned nothing. Usually the largest single bucket in an unaudited account.
Impossible engagement
A display click-through rate several times your account average, or thousands of impressions without a single click. The strongest invalid-traffic signals in a real report.
Paid clicks, nothing back
Real spend and real clicks with no conversions at all, measured against the typical spend on your own account rather than a fixed number.
Risky TLDs and clickbait vocabulary
.top, .xyz, .icu and words like viral, buzz, shocking or secret. Weighted as hints, never enough to flag on their own.
Conversions clear a placement
A placement that converts is not flagged for how its domain looks. Odd-looking names that are demonstrably working are left alone.

What each signal means

Signals from your own numbers carry the most weight. Domain-name patterns count for less, because a name is only a hint. Nothing is flagged on one weak signal, and a placement that converts is never flagged on its name alone.

From your performance data

Implausible CTR
Display click-through rates are tiny — people rarely click banners on purpose, and most accounts sit well under 1%. When a placement shows several times your account average, it almost never means genuine interest. It usually means the ads sit where they get hit by accident, squeezed against a menu or a close button on mobile, or that something automated is clicking them. You paid for every one of those clicks. This is the single most reliable invalid-traffic signal in a placement report.
Never clicked
Your ad was shown over a thousand times on this placement and not clicked once. A low rate is normal; zero at that volume usually means the ad was never really visible — stacked behind other ads, pushed below the fold, or served to software rather than people.
Paid traffic, no conversions
Real clicks and real money, no conversions recorded. This one needs judgement rather than a reflex. It is entirely normal for upper-funnel and awareness campaigns, for products with a long consideration cycle, or where this placement simply is not where the decision happens — and it looks identical to a genuinely worthless placement. Check your campaign type, attribution window and conversion tracking before excluding anything on this signal alone.
Very expensive conversions
The placement does convert, but each conversion costs more than four times your account average. On a small-volume placement a single cheap conversion would swing that, so treat it as a prompt rather than a verdict.

From the domain name — hints only

Risky TLD
Endings like .top, .xyz, .icu, .buzz, .fun and .click are cheap to register in bulk, which makes them heavily over-represented on made-for-advertising sites. Plenty of legitimate sites use them too.
Clickbait wording
viral, buzz, trending, shocking, unbelievable, secret, exposed, revealed, omg, wow, insane, banned — vocabulary built to provoke a click rather than describe content.
Money and health lures
getrich, easymoney, jackpot, payday, cryptoprofit on one side; weightloss, miraclecure, detox, antiaging, ketodiet on the other. The two classic arbitrage verticals.
Content-farm verticals
Ringtone, wallpaper, quotes and status-video sites. These exist almost entirely to serve ads, and they show up constantly in display placement reports.
Job and exam alert farms
Job-alert and exam-result aggregators are one of the largest MFA categories by volume, particularly in South Asian traffic.
Download and streaming farms
Free-download, full-movie and cracked-APK aggregators carry extremely high ad density.
Gossip and celebrity
Celebrity and gossip aggregators are a long-running pageview arbitrage vertical.
News-farm pattern
A news-style word only counts when it appears alongside another tell, such as a risky TLD or heavy hyphenation. "News" on its own is far too common on legitimate publishers to mean anything.
Listicle names
Names built around ranked lists — top10, best-of, 7-ways — are typical of pageview arbitrage.
Structural oddities
Three or more hyphens, very long names, deep subdomains of a larger network, or an internationalised (punycode) domain of the kind used to imitate known brands.
The ruleset is open
Every signal, weight and threshold above is published as an open specification, along with anonymised statistics from real accounts: mfa-placement-signals. The parser that reads your file is open source too: google-ads-placement-report. You can check our reasoning rather than take it on trust.
What is deliberately not a signal
Numbers in a domain name. An earlier version treated digits as suspicious and flagged perfectly good sites for it — 11880.com is a well-known German directory service, and plenty of legitimate German sites end in 24. A number tells you nothing about quality, so it now counts for nothing.

Your cost data stays on your machine

There is no upload. The parser is JavaScript that runs in your browser tab, and the file is read with the standard FileReaderAPI — it never touches our servers, is never stored, and is gone when you close the tab. Open your browser's Network tab while you use it and you will see no request carrying your data. We record only an anonymous count of how many placements were analysed, so we know the tool is being used. Placement names, domains and spend figures are not part of that.

Questions

Is my placement report uploaded anywhere?

No. The file is parsed by JavaScript running in your own browser tab. It is never sent to our servers, never stored, and never seen by us. You can confirm this by opening your browser devtools Network tab while using the tool — there is no upload request. This matters because placement reports contain your cost data.

Where do I get a placement report in Google Ads?

In Google Ads go to Reports → Predefined reports → Other → Campaign URL performance. Set the date range to at least the last 90 days, then download as CSV or Excel. That export contains one row per placement with impressions, clicks, cost and conversions.

Does it work with Performance Max and Demand Gen reports?

Yes. Performance Max placement reports only contain impressions, with no cost or clicks, so the tool recognises them and ranks placements by impressions instead of spend. Demand Gen and Display reports from "Where ads showed" work like any other placement report. It also shows how much of your spend, or of your impressions, went to mobile apps.

Does it work with non-English Google Ads accounts?

Yes. Google Ads localises both column names and number formats. The tool recognises English, German, Spanish, French and Italian column headings, and detects whether your account exports 1.234,56 or 1,234.56 so totals are not misread by a factor of a thousand.

What do the red flags actually mean?

Each placement gets a weighted score. Signals from your own performance data carry the most weight — implausible click-through rates, thousands of impressions with no clicks at all, and real spend with clicks but no conversions. Domain-name patterns like risky TLDs and clickbait vocabulary count for less, because a name is only a hint. Nothing is flagged on a single weak signal, and a placement that converts is not flagged on its name at all. High means several lines of evidence agree; medium means it is worth a look.

Can this tell me if a site is made-for-advertising?

No, and it does not claim to. The tool never visits any site — it only reads your spreadsheet. Detecting MFA sites, ad density, AI-generated content or brand-safety problems requires actually fetching and analysing each page. That is what the DisplayGG scorer does; this tool is the free first pass that tells you where your money went.

How do I apply the exclusion list?

Copy the output, then in Google Ads go to Tools → Shared library → Placement exclusion lists → + New list. Paste one domain per line and save. Apply it at the account level so it covers every Display and PMAX campaign automatically, including ones you create later.

Then what?

This tool tells you where your money went. It cannot tell you which of those sites are actually junk — that needs each page fetched and scored for MFA patterns, ad density, and brand safety. Start with the guide to account-level exclusions, or run the list through the scorer.

Running YouTube as well? Screen a YouTube placement list — same idea, channel names instead of domains, Google Ads or DV360.