Case Study: Bot-Only Server Errors Killing Google Ads | Ritner Digital
Case Study

Your Site Works.
Google Disagrees.

Two client websites worked perfectly for humans. Google Ads still shut their campaigns down. The fix wasn't copy or targeting—it was developer hours diagnosing what Google's bot actually saw.

Human visitor
browser — user
$ curl -A "Mozilla/5.0" site.com
Connecting...
HTTP/2 200 OK
Content-Type: text/html
Page rendered ✓
✓ STATUS: Page loads perfectly
Google AdsBot
crawler — adsbot
$ curl -A "AdsBot-Google" site.com
Connecting...
HTTP/1.1 500 Internal Server Error
Content-Length: 0
Page blocked ✗
✗ ADS DISAPPROVED: Destination error
The Invisible Problem

Same Server. Different Responses.

Your server decides what to show based on who's asking. When it treats Google's crawler differently from a real visitor, your ads get killed—and you'll never see it in your browser.

🖥️ Your Web Server
Server checks User-Agent header…
👤 Human Browser Request
✓ HTTP 200 — Page Loads
vs
🤖 Google AdsBot Request
✗ HTTP 500 / 404 — Blocked
Know Your Crawler

What Is Google AdsBot & Destination Requirements?

Before you can fix the problem, you need to understand what Google actually does when it reviews your landing page.

🤖

Google AdsBot

AdsBot is Google's automated crawler that visits your landing page every time you run an ad. It checks that the page loads, returns a valid HTTP status code, and matches what you promised in the ad. It does not use a normal browser—it sends a request with its own User-Agent string and evaluates the raw server response.

If AdsBot gets a 404, 500, redirect loop, or blocked response, your ad is disapproved—even if the page loads perfectly when you visit it yourself.

📋

Destination Requirements

Google's Destination Requirements policy requires that your landing page is functional, accessible, and matches the ad's content. Violations include: pages that don't load, error pages, sites under construction, pages that block Google's crawler, and URLs that redirect to unexpected destinations.

The challenge: Google's disapproval message is intentionally vague. It won't tell you the specific server error—only that the destination "isn't working."

Read Google's Official Policy →
The Fixes

Two Clients. Two Invisible Failures.

Click each case to see the full diagnosis: what happened, why, and exactly how we fixed it.

Symptom

Ads Disapproved — "Destination Not Working"

Client's Google Ads were suddenly disapproved under Destination Requirements. The site loaded instantly in every browser we tested. No errors, no redirects, no warnings.

Diagnosis

AdsBot Was Receiving a 404 Error Page From 2021

We simulated AdsBot's request using its User-Agent string and discovered the server was serving legacy static 404 error pages—but only to bots. Human browsers were routed to the live WordPress site. The caching layer was splitting traffic by user agent.

# Simulating AdsBot request
$ curl -H "User-Agent: AdsBot-Google" https://client-site.com/

HTTP/1.1 404 Not Found
Content: <!-- Legacy error page from 2021 -->
Root Cause

Nginx + Plesk Caching Conflict

A caching conflict between Nginx (the web server) and Plesk (the server management panel) was routing certain user agents to stale, cached error files instead of the live WordPress content. The cache had never been properly purged after a server migration.

Fix Applied

Cache Purge + Nginx Reconfiguration

Cleared server-side caches
Removed legacy error files
Reconfigured Nginx routing
Verified AdsBot receives 200 OK
Result

Ads Approved. Campaigns Restored.

# After fix
$ curl -H "User-Agent: AdsBot-Google" https://client-site.com/

HTTP/2 200 OK
Content-Type: text/html; charset=UTF-8
✓ Full page access confirmed
Symptom

Same Story — Ads Disapproved, Site "Works Fine"

A second client hit the exact same wall. Their landing page loaded perfectly in every browser. Google Ads disapproved it for Destination Requirements. No visible errors anywhere.

Diagnosis

AdsBot Was Getting a 500 Internal Server Error

The landing page returned a 500 error exclusively for Google AdsBot. The site's security firewall was flagging AdsBot as suspicious and blocking the request before the page could even begin to render.

# Simulating AdsBot request
$ curl -H "User-Agent: AdsBot-Google" https://client-site.com/landing

HTTP/1.1 500 Internal Server Error
Connection: close
Root Cause

PHP 8.1 Compatibility + Firewall Bot-Validation

The site's security firewall had bot-validation logic that was incompatible with PHP 8.1. When AdsBot hit the page, the firewall's validation script threw a fatal error—crashing the page before it could load. Human browsers bypassed this check entirely.

Fix Applied

Firewall + PHP Reconfiguration

Reconfigured security headers
Adjusted firewall bot-validation
Resolved PHP 8.1 conflicts
Verified AdsBot receives 200 OK
Result

Ads Approved. Revenue Restored.

# After fix
$ curl -H "User-Agent: AdsBot-Google" https://client-site.com/landing

HTTP/2 200 OK
Content-Type: text/html; charset=UTF-8
✓ Full page access confirmed
Tech Deep Dive

The Technology Behind the Problem

These aren't obscure tools—they're the backbone of most web hosting. Here's what they are and how they caused these failures.

⚙️
Nginx

Nginx (pronounced "engine-x") is a web server—the software that sits between the internet and your website. When someone visits your URL, Nginx is the first thing that receives the request and decides what to send back. It's used by over 30% of all websites worldwide, including Netflix, Airbnb, and WordPress.com.

In this case: Nginx's caching layer was storing old error pages and serving them to bots while routing human visitors to the live site. The cache rules were splitting traffic based on the User-Agent header—something that's invisible unless you specifically test for it.
Think of Nginx like a receptionist at a building. It checks who you are, where you're going, and routes you accordingly. In this case, the receptionist was sending Google's bot to the wrong floor—a stale error page from years ago—while sending human visitors to the right office. Fixing it meant updating the routing rules and clearing out the cached directions.
🖥️
Plesk

Plesk is a server management panel—a visual dashboard that lets you manage websites, email, databases, and security settings on a web server without writing command-line code. It's one of the most popular hosting control panels alongside cPanel, used by hosting companies to give customers a GUI for their server.

In this case: Plesk's built-in caching and Nginx proxy settings were configured in a way that conflicted with WordPress's own caching. The result: a caching layer that served different content depending on how the request came in—and bot requests got the stale, broken version.
Plesk is like the building's management office. It controls the HVAC, security, lighting—all the infrastructure. When Plesk's Nginx settings and WordPress's caching both tried to manage the same traffic, they created a conflict. Plesk cached an old error page and kept serving it to bots long after the real site was live and working. The fix involved clearing Plesk's cache and aligning its proxy settings with the live WordPress configuration.
Outcome

Results That Matter

200
HTTP Status Restored
📢
Ads Live
Campaigns Reactivated
💰
$0
Ad Copy Changes Needed
<48h
Time to Resolution
Self-Diagnosis

Does This Sound Like You?

Check every symptom that applies. If you check two or more, there's a good chance Google is seeing something you're not.

Your ads are disapproved but the landing page loads fine in your browser
You see "Destination not working" errors in Google Ads
Ads were approved before but suddenly stopped without changes
You've resubmitted ads multiple times with no luck
Your site recently had a server migration or hosting change
You use a security firewall or bot-protection plugin
Your hosting uses Nginx, Plesk, cPanel, or similar infrastructure
Common Questions

Frequently Asked Questions

Yes—and it happens more often than most advertisers realize. Google Ads approvals are based on what AdsBot sees, not what you see. A page can load flawlessly for users while returning a 404, 500, or blocked response to Google's crawler.

Bot-only errors happen when a server, firewall, or caching layer treats automated crawlers differently than human visitors. That can include serving cached error pages only to bots, blocking bots via security rules, or returning different HTTP status codes based on user agent. They're invisible unless you specifically test for them.

Destination Requirement disapprovals are intentionally broad. Google typically doesn't surface detailed server or firewall errors in the ad interface. Without reviewing server logs or simulating AdsBot requests, it's nearly impossible to identify the exact cause from Google Ads alone.

Not reliably. These issues live at the server, firewall, and caching level—outside the scope of standard Google Ads management. Fixing them requires reviewing server logs, diagnosing bot-specific responses, and adjusting Nginx, PHP, and security configurations.

Potentially, yes. If Google AdsBot is blocked or served errors, other Google crawlers (like Googlebot) may be affected too. Left unresolved, these issues can impact ad approvals, Quality Score, crawlability, and indexing behavior.

We use server-side testing and AdsBot simulations to replicate Google's crawler behavior, including user-agent–specific requests, HTTP status code verification, and firewall/caching response analysis. This lets us confirm whether AdsBot receives a valid HTTP/2 200 OK and full page access.

Yes. At Ritner Digital, we combine paid media management with developer support to diagnose and resolve issues that prevent ads from running—even when everything looks "fine" on the surface. Reach out if you're dealing with unexplained ad disapprovals.

Think Google Sees Something You Don't?

We don't guess—we diagnose. Developer-level investigation into what Google's bot actually encounters when it hits your landing page.

Get a Free Diagnosis