Blocking Competitor Ads Worked Better After I Stopped Trusting the Filter
How AdSense Actually Decides What Ads Show Up
Let’s just say that the idea of a competitive ad filter sounds a lot more reassuring than it behaves. If you’ve been manually adding domains into the AdSense competitive ad filter tool hoping to block off-brand clickbait or keep rival companies from siphoning away your leads—congrats, you’ve probably wasted a lot of effort.
AdSense doesn’t really use your block list the way you think it does. Domain blocking during real-time bidding is a last-minute override, not a pre-filter. Ads still go through quality checks and relevance scoring first, and your site still participates in auctions with blocked advertisers. If you’ve got 20 blocks in there, but one of those ad slot auctions runs thin with demand, AdSense just… skips your noise.
I added my own consulting brand’s competitors thinking it would be a hard stop. Instead, those ads still showed briefly during refresh spikes. Inspecting the network waterfall confirmed: blocked bids still made it to rendering.
The Filter Doesn’t Work on Ad Tech Middlemen
This is the one that annoyed me the most. Many advertisers don’t serve under their own domains. They’ll use tracking wrappers, affiliate networks, or demand-side platforms that show up as generic intermediaries in your ad logs.
If you block competitoragency.com
, but the ad came via some DSP like adsupply-network.cool
, boom—it slips through. You won’t recognize it in publisher performance reports either because it’ll just say “Unnamed Advertiser” or the source exchange.
“If you aren’t blocking by account ID inside AdSense, you’re just whack-a-moling domains.”
– me, after three months of seeing the same stylistic ads with different landing URLs.
What’s worse: auto-mirroring ads, like when the same campaign gets cloned under a different subdomain for A/B testing, can completely invalidate your block list. You’re always one 301 redirect away from irrelevance.
Why Blocking a Competitor Can Tank Your RPM
Here’s where things got expensive. I blocked a mid-size course platform because we launched something in the same field. Suddenly, RPM dropped around 18% across two of our highest-converting content categories. Turns out, their bids were propping up the CPM floor during afternoon traffic drops.
When I dug into the AdSense revenue breakdown (which required downloading a CSV and pivoting with my nightmarish sheet setup), I spotted their ads registering high CTR but low conversion site-side. Because I wasn’t converting, I assumed the traffic wasn’t valuable. But they obviously were winning big clicks—which means blocking them let cheaper filler ads win.
We sometimes forget: AdSense’s smartest inventory is built ecologically. Remove a high-engagement (even if annoying) bidder, and you drain value for everyone on your page tree.
Blocking Ads Doesn’t Affect Ad Topics or Personalization
One afternoon, I had six tabs of Cat Video SEO open and realized three of them were triggering strangely high-spend dog toy ads in my own content previews. I had codesigned against pet industry targeting—but forgot that personalized ads ignore your block list completely unless the domain is specifically blacklisted.
If a user’s browsing history matches to interest segments in Google’s logged-in graph (or weirdly, even just YouTube watch behavior…), their ads overwrite your topical targeting. So even if you block a domain at the account or topic level, individual user affinity can override it. This is explained nowhere in the AdSense interface. I only confirmed it after tracking UID-based segments using Chrome DevTools.
This makes competitive filtering something like putting headphones on a toddler during a fireworks show. It might feel proactive, but things are gonna bleed through.
Undocumented Quirk: Blocks Don’t Always Apply to Auto Ads
I didn’t believe this was real until I tested it with cached preview links from Google Search Console. If you’re using AdSense Auto Ads (which injects ad units dynamically via JS based on page layout), domain blocks are applied after the layout AI decides where to insert them—not during bid selection. So the slot might get created, filled, and then nuked post-rendering.
This leads to flashes of white-space burnout where the ad tries to load, disappears, and eats space for a few hundred milliseconds. Caused tens of CLS violations in my Web Vitals report. To test it, I used the Chrome performance timeline and caught a blocked ad flicker rendering before being yanked mid-frame.
A Google thread confirmed it’s “expected behavior”; blockers are filters, not pre-disqualifiers. So yes, the ad literally arrives and then ghosts.
Trying to Block Via Page-Level Settings? Doesn’t Help
You can assign ad category restrictions or URL blocks via the AdSense > Sites > Page overrides feature. But this is mostly UI glitter. Most page-level settings only work if you’re running fixed <ins>
ad codes and aren’t using Auto Ads. And even then, they only limit category behaviors—not domain specificity.
Pro-tip: if your override panel doesn’t say “active” under enforcement, the settings just aren’t being applied. The actual config won’t error—you just won’t get what you expect. There’s no warning or tooltip that says you’re in a non-enforced state, which is wild UX considering you’re throttling monetizable space.
The One Time Blocking Competitors Worked: Direct Ad Buys
I’ll admit, there was one time where blocking did what I hoped. During a direct buy test using AdSense’s Custom Channel targeting (back when that was still functional), I saw a weird dip in direct CPM. After some digging, it looked like the DSP sourcing through that placement was losing bids to a surprisingly aggressive affiliate for a competitor’s white-labeled blog tool.
Blocked the domain, waited three days, and boom—they got priced out. RPM bounced back and the next best buyer stepped in at higher rates. I only caught it because I had campaign placement tracking open in a staging environment and noticed the ad slot behavior flipping midway through scroll events.
- Use referer analysis in your analytics backend to identify cloaked domains.
- Inspect ad wrapper HTML via Chrome DevTools to see original redirect targets.
- Don’t trust AdSense’s block filter to remove categories from Auto Ads—use manual injection for reliable tagging.
- Check CLS audits after aggressive blocking, especially on mobile. Look for layout shifts caused by pulled ad units.
- Use UTM-tagged landing pages in ad view logs to reverse-match competitive threats.
- Create custom channels per category and isolate RPM fluctuations when testing blocks.
- Track bid response logs via GPT tag debugging (if on Ad Manager) for timestamped domain matches.
I wouldn’t trust domain-level blocking alone—only in conjunction with granular auction data and padded fallback fill rates does it remotely behave as expected.
Ad Balance Tool Breaks Your Expectations Too
This one deserves a special mention. I toggled the Ad Balance slider down to 90% once, thinking I’d just trim the spammiest ads while keeping the decent bids. What actually happened was… the opposite. Top-converting units vanished. I didn’t know that the slider doesn’t block low-paying ads; it reduces the number of impressions served across all auctions, indiscriminately.
I found a support thread over at support.google.com/adsense buried under two years of silence. Turns out, unless you’re using category filtering, the Ad Balance tool randomly samples from the pool of available contestants—regardless of conversion performance.
So if your high-paying ads were also getting low CTRs (say, B2B leadgen banners that sit in sidebar slots), those are often the first to get drowned by the balancer. Basically, balancing favors cheap click-magnets over actual value. I reset it to 100%, RPM came back, bounce time normalized.