Fix guides

googleadservices.com/pagead/conversion.js blocked: what it means and what to do

It depends on the message. ERR_BLOCKED_BY_CLIENT means an ad blocker in your own browser stopped it, and your visitors without one are fine. A Content Security Policy error or a consent tool that never releases the tag blocks it for everyone, and those are worth fixing today. Either way, conversion.js is Google Ads' old tag, so the lasting fix is to move to the Google tag.

Check your own site: the free scan tells you in about a minute whether this problem is on your page.

Which message do you see?

Open DevTools (F12 or Cmd+Option+I), go to the Console tab and reload the page. Then look at the Network tab filtered on conversion. The wording tells you what stopped the script:

  • net::ERR_BLOCKED_BY_CLIENT in the Network tab or the Console: a browser extension (an ad blocker or privacy extension) cancelled the request. See "An ad blocker in your browser".
  • Refused to load the script 'https://www.googleadservices.com/pagead/conversion.js' because it violates the following Content Security Policy directive: your own site's security header does not allow Google's domain. See "Your Content Security Policy".
  • A parser-blocking, cross site (i.e. different eTLD+1) script, https://www.googleadservices.com/pagead/conversion.js, is invoked via document.write: a warning from Chrome about how the old tag loads. See "Chrome's document.write warning".
  • No error, but the request never appears, or the script tag has type="text/plain": your consent tool is holding it back. See "Your consent tool".

An ad blocker in your browser

The common filter lists block googleadservices.com, so anyone running uBlock Origin, AdBlock Plus, Brave's shields or a similar tool never loads the conversion tag. If that is the only message, your site is working: test again in a private window with extensions off, and the request should go through.

You cannot make the tag work for visitors who block it, and you should not try to trick their blocker. What you can do is reduce how much the gap matters:

  • Enhanced conversions send a hashed email or phone number with the conversion, which helps Google match conversions that would otherwise be lost to cookie restrictions.
  • Offline or server-side imports (conversion imports from your CRM, or a server-side Google Tag Manager container) record sales from your own systems, not from the visitor's browser.
  • Google tag gateway serves Google's tag from your own domain. Google offers it officially, and it makes the tag more resilient to network-level blocking.

Your Content Security Policy

A Content Security Policy (CSP) is a header your site sends to tell browsers which domains may load scripts, images and requests. When googleadservices.com is missing, the browser refuses the script for every visitor, and the Console shows the directive that blocked it (usually script-src). This often happens right after a developer or a security plugin tightens the policy.

Google publishes the exact domains its tags need, per product, in its Content Security Policy guide for the Google tag (linked below). For Google Ads conversion tracking they include www.googletagmanager.com, www.googleadservices.com, googleads.g.doubleclick.net and www.google.com, spread across script-src, img-src, connect-src and frame-src. Copy the list for your setup from Google's guide: it is longer when you also use remarketing, GA4 or a regional Google domain, and it changes over time. Policies that use a nonce can allow the Google tag that way instead.

After you change the header, reload with the Console open: the "Refused to load" line should be gone and the request to /pagead/conversion/ should show status 200.

Chrome's document.write warning

The old snippet loads conversion.js with a plain <script> tag that writes into the page with document.write. Chrome warns that it may block such scripts for visitors on very slow connections (2G), to speed up the page. On a normal connection the script still loads, so the warning alone does not mean you are losing conversions today, but it is a sign the tag is the old one and should be replaced.

Your consent tool

Consent tools that block scripts automatically rewrite the tag to type="text/plain" until the visitor accepts the right category. That is correct before consent. It is a problem when the tag stays blocked after "accept": check which category the tag is filed under (often "marketing") and that the banner's accept button grants it.

With the modern Google tag, the better setup is Consent Mode v2: the tag loads for everyone, sends cookieless pings while consent is denied, and sends full conversions once the visitor accepts, so Google can model what consent costs you. The old conversion.js tag predates Consent Mode, so it is either blocked or not. See Consent Mode default is not set.

Replace conversion.js with the Google tag

If your site still has a snippet like this, it is the legacy Google Ads tag:

<script type="text/javascript">
  var google_conversion_id = 123456789;
  var google_conversion_label = "AbC-D_efG-h12_34-567";
  var google_conversion_value = 84.50;
</script>
<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js"></script>

Google replaced it with the Google tag (gtag.js) years ago. The current tag is the one Google documents for Consent Mode, enhanced conversions and transaction IDs. The same conversion with the Google tag:

<script async src="https://www.googletagmanager.com/gtag/js?id=AW-123456789"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'AW-123456789');
</script>
<!-- on the order confirmation page: -->
<script>
  gtag('event', 'conversion', {
    send_to: 'AW-123456789/AbC-D_efG-h12_34-567',
    value: 84.50,
    currency: 'EUR',
    transaction_id: '10045'
  });
</script>

Your conversion ID and label stay the same, so the conversion action in Google Ads keeps its history. In Google Tag Manager, use the Google Ads Conversion Tracking tag plus a Conversion Linker tag on all pages instead. Remove the old snippet once the new one records, or each order counts twice.

Check that it works

  1. Open the order confirmation page of a test order in a private window, with no extensions, and DevTools open.
  2. The Console should show no "Refused to load" or document.write lines for Google.
  3. In the Network tab, filter on pagead. There should be one request to /pagead/conversion/ with your label, a value, a currency_code and an oid, and no request for conversion.js.

The free scan does the same check on any page, and our guide on Google Ads conversions not recording covers what to look at in Google Ads itself.

Sources

Based on the platforms' public documentation; menus and names change, so check the linked pages if a step looks different.