Why Did Google Ads Disapprove My Landing Page? Fixing "Destination Not Working" and "Circumventing Systems"
Your ads stopped overnight and the only explanation is four words in a tooltip. Here is how to reproduce what the crawler saw, and fix the specific cause rather than guessing.

Two disapprovals account for most of the panic in a paid search account. Destination not working means Google's crawler could not reach or render your page. Circumventing systems means Google believes you are showing it something different from what you show visitors. The first is a technical fault. The second is a policy accusation, and it escalates to account suspension far faster.
Both come with almost no detail in the interface. The work is reproducing what the crawler saw, because it is almost never what you see when you open the page yourself.
Part 1 — "Destination not working"
This is a crawl failure, not a judgement. Google tried to fetch the final URL and got something it could not use. There are six realistic causes, in rough order of frequency.
1. robots.txt blocks AdsBot
This is the one people never suspect, because the page loads perfectly in a browser. Google's landing page crawler is AdsBot-Google, and it has an unusual rule: it ignores the User-agent: * wildcard entirely. A site-wide disallow does not block it. But an explicit rule does:
# This BLOCKS your ads — remove it User-agent: AdsBot-Google Disallow: / # This is fine — AdsBot ignores the wildcard User-agent: * Disallow: /checkout/
Check for AdsBot-Google, AdsBot-Google-Mobile and AdsBot-Google-Mobile-Apps by name. These lines usually arrive from a security plugin or a copied robots.txt rather than a deliberate decision.
2. Geo-blocking or firewall rules
If your WAF, CDN or hosting panel restricts traffic by country or rate-limits unfamiliar user agents, the crawler gets a 403 while you get a 200. Cloudflare's bot fight mode, aggressive Sucuri rules and "block all traffic outside India" settings all produce this. Allowlist the Google crawler IP ranges, or exempt the AdsBot user agents from the challenge.
Reproduce it by requesting the page with the crawler's user agent from outside your network:
curl -A "AdsBot-Google (+http://www.google.com/adsbot.html)" \
-o /dev/null -s -w "%{http_code} %{redirect_url}\n" \
https://example.com/landing-page3. Redirect chains and loops
Every hop between the click and the page is a failure point. A chain like http://example.com → https://example.com → https://www.example.com → https://www.example.com/lp/ is three redirects before anything renders, and it frequently drops the tracking parameters on the way. A loop — apex redirecting to www while www redirects back — fails outright.
curl -sIL https://example.com/lp | grep -iE "^(HTTP|location)"
Aim for at most one redirect. Fix the canonical host once at the edge rather than chaining rules across .htaccess, the CDN and the application.
4. SSL faults
An expired certificate, a certificate that does not cover the exact hostname, or a missing intermediate chain. Browsers often paper over a missing intermediate using a cached copy; automated crawlers do not, so the page can look fine to you and fail for Google. Test the full chain, not just the padlock.
5. The page renders nothing without JavaScript
Single-page applications that ship an empty <div id="root"> and build the page in the browser are fragile here. The crawler may time out before the bundle executes, and see a blank document. If your landing page is a React or Vue app, prerender it to static HTML, or serve the campaign page from a static template.
6. Slow server response
A time-to-first-byte above a few seconds under crawler load reads as unreachable. This is usually a cold-start or a database query on an uncached page. The infrastructure guide covers diagnosing TTFB, DNS and handshake latency separately, which matters because the fixes are completely different.
Part 2 — "Circumventing systems"
This policy covers anything that makes the review process see something other than reality. It is written broadly on purpose, and enforcement is automated, so a genuinely innocent implementation can trip it. These are the accidental triggers we see most.
| Trigger | What it looks like to Google | Fix |
|---|---|---|
| Geo or IP personalisation | Crawler from a US IP gets different content than an Indian visitor | Serve the same core content everywhere; personalise below the fold, not the offer |
| User-agent branching | Bot receives a simplified page | Remove UA-based rendering entirely, or return identical content |
| Cookie-gated content | Crawler has no cookie, sees an empty page or a consent wall | Render the page content behind the banner, not instead of it |
| Redirect on parameter | ?gclid= sends traffic somewhere else | The final URL must be the page the visitor lands on |
| Aggressive interstitial | Content hidden behind a full-screen pop-up on load | Delay the pop-up, or remove it on paid landing pages |
| Domain mismatch | Display URL domain differs from final URL domain | They must share the same root domain |
There is also a legitimate-practice trap: link cloaking and click-tracking redirectors. If your click goes through a third-party tracker that rewrites the destination, Google sees a redirect chain ending somewhere it did not approve. Use the platform's own tracking template and {lpurl} parameters instead of an external redirector.
A working diagnostic sequence
- Copy the final URL from the disapproved ad — not the display URL, and not what you think it is.
- Fetch it with curl and record the status code and every redirect hop.
- Repeat with the AdsBot user agent. Compare.
- Check
robots.txtfor an explicit AdsBot rule. - Verify the SSL chain resolves without a cached intermediate.
- Load the page with JavaScript disabled. Is the offer still there?
- Confirm the privacy policy and contact links resolve to real pages.
- Only then appeal, naming the change you made.
Steps 2 through 7 are mechanical checks against a URL — redirect chains, status codes, SSL chain, robots directives, JavaScript dependency, required legal pages. An automated audit runs all of them at once and tells you which failed, which is considerably faster than working through curl flags while a campaign is down.
Scan the disapproved URL and get the redirect chain, SSL status, robots directives, required-page checks and ad policy compliance in one pass.
Diagnose my landing pageAfter the fix
Resubmit through the ad's own review request rather than raising a support ticket; the automated review usually re-runs within a day. If the same disapproval returns, something you changed did not take effect at the edge — a CDN cache still serving the old robots.txt is the usual culprit. Purge the cache and re-test with curl before appealing a second time.
For the longer term, the fix is process rather than debugging. Running the destination checks as a pre-flight step before each campaign launch — the sequence in the pre-launch checklist — moves these failures from "campaign is down, everyone is on a call" to "caught in QA".
