Online Marketing Blog

A Comprehensive Guide To Tracking Google Ads Call Conversions Using Google Tag Manager

Earlier this month, Google released a much needed tracking feature in Google Ads. Website Call Conversions. We’ve been playing with it in beta for quite some time and I’m surprised that it didn’t get much fanfare. Google effectively destroyed the Google Ads call tracking industry. We have clients who, overnight, saved thousands of dollars/euros a day in call tracking fees. If you speak to your customers by phone at any stage of the buying cycle, you need this. This is not Google Ads call extensions (although they are required, see below) or click to call; this is actual call tracking.  So how does it work? Easy. Wherever your phone number appears on your website, Google will display that phone number as normal. However, if that visitor came from Google Ads, Google will replace that number with a custom number that it ties to the visitor (and keyword/ad combination). Google then forwards that number on to your regular number. So how do we set this up? Surprisingly, there has been a lot of confusion over this. In this article, I’ll go through each step and then show you how to implement this manually or by using Google Tag Manager (because who’s not using GTM these days?).


image of where adwords forwarding number appears The tracking phone number or “the forwarding number” is displayed anywhere you place the code to dynamically generate it. Think of it as a magic widget. You copy and paste the widget code that Google provides and wherever that code is placed, the tracking number displays. If the user didn’t come from Google Ads, your default number displays.  There are some occasions where the number will not display however.

  • The display network (display network only campaigns)
  • Outside of an Google Ads “interaction”
  • Ads with low traffic

These have caused some confusion. The first is pretty obvious, dynamic numbers won’t be displayed on the Google display network. Also, if your visitor doesn’t click on an Google Ads ad, they won’t see it. Finally, if your ad doesn’t receive an undisclosed minimum traffic volume during a 4 week period, it wont show either. This brings us to the most important point of this article.


This has caused a lot of confusion, even with myself. You can’t just set up the “dynamic number” on your website, it needs to have a call extension or a click to call extension associated with it. After hours of frustration when first setting these up, and official confirmation from within Google, this actually makes sense. If you don’t associate the call conversion with a call extension, you are likely to get a fragmented visit. So, with all that in mind, let’s get to the setup.


Before you will even be able to see the call conversion in your account conversions section, you need to add at least one call extension. If you don’t have any call extensions yet, you won’t see the call tracking conversion option that we’ll need later on. If your business takes phone calls, you’re crazy not to be using call extensions anyway so now is a good time to start. You can either create a new call extension or edit any existing one. Go to any campaign and select the extensions tab. Click the red “+Extension” or edit an existing call extension. You should see this. image of the adwords edit call extension menu It’s vitally important that you do this once, that you select the “A Google Forwarding Number” in the “Show my ad with” option and that you enter your country and your business phone number and not the country of your target audience. Many hours have been wasted trying to get call tracking working because the necessity of this step is not documented by Google (that I could find). I’ve just saved you a lot of frustration! Here’s a quick walkthrough.

Get the Flash Player to see this Google Ads tutorial about building your keyword list.


So now we can get down to the real meat of the setup. The next step, we need to set up the actual conversion event in the conversions section of your Google Ads account. This is done exactly like you would any other type of conversion. In your Google Ads account go to Tools ->Conversions and click the red “+ CONVERSION” button to create a new conversion. call-1 As the conversion name type “Calls from website” and select “Calls to a Google forwarding number on your website” as the source and click the “Save and continue” button. call-2 On the next screen, select a conversion value, window, category and call length and click “Save” call-3 Select “I make changes to the code” and copy the generated code. Keep the code handy, you’ll need it soon. call-4 Obviously these options are custom to your business and your business needs. If you’re selling insurance, a converted phone call might be a minimum of 5 minutes to you. If you’re selling a phone directory service, a 20 second call might be all you need. Likewise with the value of the conversion here. This is up to you and how you determine the value of a call. I would encourage you to enter something real here. Don’t use “1” or leave it blank. Work out the average value of each of your phone calls or use a points based system. Like other Google Ads conversion values, this too can be populated dynamically using either server side scripting or Google Tag Manager. I wont be covering that in this article.


So now onto the real magic. This can be a little bit challenging. ***bonus*** As long as the demand isn’t too high and as long as you’ve made an effort yourself, we’ll assist, for free, anyone who needs this part done for them. Just get in touch. From here you have two options: If you are not using Google Tag Manager you need to copy the javascript code you generated in step 2 above and put it into your website <head> tag, enclosed in a <script></script> tag.

(function(a,e,c,f,g,b,d){var h={ak:"996234153",cl:"RguGCL6AgVYQqaeF2wM"};a[c]=a[c]||function(){(a[c].q=a[c].q||[]).push(arguments)};a[f]||(a[f]=h.ak);b=e.createElement(g);b.async=1;b.src="//";d=e.getElementsByTagName(g)[0];d.parentNode.insertBefore(b,d);a._googWcmGet=function(b,d,e){a[c](2,b,h,d,null,new Date,e)}})(window,document,"_googWcmImpl","_googWcmAk","script");

You also need to add the following javascript to your <body> tag: onload=”_googWcmGet(‘number‘, ‘X-XXX-XXX-XXXX’)” (where the X’s represent your regular/default office number) so it will look like below. Remember, “number” is the class of the element that holds the phone number in the html code like <span class=”number“>X-XXX-XXX-XXXX</span>.

<body onload="_googWcmGet('number', 'X-XXX-XXX-XXXX')">

If you are using Google Tag Manager, things are a little trickier but well worth putting in the effort to configure. It is assumed that you have the Google Tag Manager code snippet added to all pages on your website. Using this method, you don’t have to edit the code on your site at all. You’ll need to follow the below instructions exactly.

  1. Log into Google Tag Manager
  2. In the Google Tag Manager UI, create a new Custom Html tag and name it “Call from website”
  3. Set the firing rule to “All pages”
  4. Paste the javascript code you generated in step 2 above into the HTML text area enclosed in <script></script> tag. –
  5. Before the closing </script> tag add the following javascript: jQuery(document).ready(function() { _googWcmGet(‘number’, ‘X-XXX-XXX-XXXX’); });

So the whole code will look like this:

(function(a,e,c,f,g,b,d){var h={ak:"996234153",cl:"RguGCL6AgVYQqaeF2wM"};a[c]=a[c]||function(){(a[c].q=a[c].q||[]).push(arguments)};a[f]||(a[f]=h.ak);b=e.createElement(g);b.async=1;b.src="//";d=e.getElementsByTagName(g)[0];d.parentNode.insertBefore(b,d);a._googWcmGet=function(b,d,e){a[c](2,b,h,d,null,new Date,e)}})(window,document,"_googWcmImpl","_googWcmAk","script");

jQuery(document).ready(function() {
_googWcmGet('number', 'X-XXX-XXX-XXXX');

You need the jquery javascript library included on your site for this to work. Whether you are using the regular method or our custom Google Tag Manager method, you need to define your phone number on your site in this format: <span class=”number“>X-XXX-XXX-XXXX</span>. So every instance of your business number on your site in this format will be replaced with the Google forwarding number. That’s it. Pretty painless right? Now, at long last, you can now track all phone calls as conversions and not just mobile click to call ads. The call tracking loop has finally been closed. So what’s next? Well, viewing and optimizing your call conversions of course!


Once your call conversions start rolling in, you can see the conversions in the conversions page in Google Ads. But that’s not really very useful. Fortunately, you can now add all your fancy new call tracking metrics throughout your reports. Simply add the columns as outlined in the video below.

Track phone impressions, calls, and phone-through rate

You can see the phone impressions, phone calls, and phone-through rate by adding special columns to the statistics table of your campaign or ad group.

  • Phone impressions are the number of times your ad was shown with a Google forwarding phone number.
  • Phone calls are counted when calls to your custom Google forwarding phone number are received, either through a call button or through manual dialing.
  • The phone-through rate (PTR) is the number of phone calls received (the figure in the “Phone calls” column) divided by the number of times your phone number is shown (what’s shown in the “Phone impressions” column).


Now that you can see all sorts of useful metrics like call start time, end time, status (missed or received), duration, caller area code, phone cost, call type etc., you can really start to optimize your call conversion rate. This is especially exciting for those of you who usually close sales over the phone (you can use the likes of HubSpot to score these leads too!). The best thing about this new call conversion tracking? You can utilize all of the wonderful and powerful advanced and custom bid strategy features like ROAS bidding, enhanced CPC bidding and of course, everyone’s favourite… Conversion Optimizer ;)


So there you have it. The conversion leak has finally been plugged. It’s an exciting time, especially if you’re a digital marketing agency! If you’ve been wondering how to set this up in Google Tag Manager, now you know. If you’re having difficulty and would like some free help setting this up, please get in touch and I’ll be happy to help walk you through it (GTM implementation only). Any questions? Feel free to reach out on social media (we’ve removed our comment section for now) or drop us an email.

  1. Xavi Says:
    September 22nd, 2014 at 6:39 pm

    Finally got this working. Thank you for the code. It would be nice if GTM supported this natively. I guess that both product teams have different release cycles.

    The power of Google Tag Manager never ceases to amaze me. Adwords call tracking has changed everything for us in short space of time.

  2. Dave Davis Says:
    September 23rd, 2014 at 2:41 am

    Hi Xavi.
    Completely agree. I reckon it won’t be long before we see native support. In fact, I don’t think it will be long before we see native support for many of the new AdWords features, including Google shopping.

    Exciting times ahead!

  3. Chris Easler Says:
    September 24th, 2014 at 4:41 pm

    Great writeup! Question: Have a client where on his site the number is: +1 XX XXX-XXXX or XXX.XXX.XXXX (dots in between the number on the site instead of dashes).

    Do we need to change the X-XXX-XXX-XXXX

    Leaving out the dashes or can we leave it the same and it still work? Or if a client has their site’s number as, do we need to change the X-XXX-XXX-XXXX to XXX.XXX.XXXX

    for it to work?

    AKA: Do we need to do anything to the X-XXX-XXX-XXXX number for these two types of numbers? Thanks!

  4. Arnold Majlath Says:
    September 25th, 2014 at 4:14 pm

    Hi Chris,

    You don’t need to change anything on the site. Whatever is in the span tag it will be replaced.

    In the _googWcmGet() function you need to use a number you defined in the call extension in AdWords. You can use dots instead of dashes, it will work.

  5. Chris Says:
    September 27th, 2014 at 8:05 pm

    Dave & Arnold,

    Thanks for all your help. I’m going to take you guys up on your offer of setting this up for GTM. I think I’m 97% there but need a little help on the last 3%. Please shoot me a direct email and I’ll be happy to send over screenshots code, etc. Thanks!

  6. Dave Davis Says:
    October 1st, 2014 at 5:12 am

    Hi Chris.
    Can you please get in touch using the contact form and we’ll get you sorted with call tracking with GTM (if you haven’t sorted it already). Cheers.

  7. Chris Easler Says:
    October 1st, 2014 at 1:12 pm

    Thanks! Sent form in a few days ago. I’m sure you guys are slammed as we are with work ; )

  8. Michael Zandstra Says:
    October 14th, 2014 at 3:52 pm

    For those not using jQuery; loading the entire jQuery library just to use document.ready is a absurd.

    A much better option would be to get that function from somewhere else (see or use the native DOMContentLoaded if you’re project doesn’t require support for browsers < IE 9.

  9. Laura Badovinac Says:
    November 15th, 2014 at 7:16 pm


    Thank you so much for this great tutorial! This is going to be so helpful in terms of tracking leads for my father’s business. I wanted to see if you might help me as I followed all the steps and then clicked on the lowest CPC ad to try and test but it didn’t seem to work.

    I am at a loss for what the problem could be.


  10. Bar Twito Says:
    November 18th, 2014 at 11:54 pm


    Thank you for posing this. Your post is the only one out there that offers a way to implement gtm with call extension. Couple of questions/issues
    1)i am getting a JavaScript Compiler Error at line 3, character 49: Parse error. Character ‘‘’ (U+2018) is not a valid identifier start char. This is the code i am trying to add:

    (function(a,e,c,f,g,b,d){var h={ak:”992092416″,cl:”OnxNCM3h11cQgMKI2QM”};a[c]=a[c]||function(){(a[c].q=a[c].q||[]).push(arguments)};a[f]||(a[f]=h.ak);b=e.createElement(g);b.async=1;b.src=”//”;d=e.getElementsByTagName(g)[0];d.parentNode.insertBefore(b,d);a._googWcmGet=function(b,d,e){a[c](2,b,h,d,null,new Date,e)}})(window,document,”_googWcmImpl”,”_googWcmAk”,”script”);
    jQuery(document).ready(function() { _googWcmGet(‘number’, ‘X-XXX-XXX-XXXX’); });

    2)Just to clarify that i should change “X-XXX-XXX-XXXX” on jQuery to the actual google forwarding extension and that on the website we should have the same exact number (and format) under a span tag



  11. Arnold Majlath Says:
    November 21st, 2014 at 9:00 pm

    Hi Bar,

    Can you please show me the page where you’re getting the JS error?

    Yes, the phone number should be the same (and same format) as the one defined in AdWords.


  12. Bar Twito Says:
    November 21st, 2014 at 9:08 pm

    The error came when i input the code below with the j query you had here.

    (function(a,e,c,f,g,b,d){var h={ak:”992092416″,cl:”RJceCOSz2FcQgMKI2QM”};a[c]=a[c]||function(){(a[c].q=a[c].q||[]).push(arguments)};a[f]||(a[f]=h.ak);b=e.createElement(g);b.async=1;b.src=”//”;d=e.getElementsByTagName(g)[0];d.parentNode.insertBefore(b,d);a._googWcmGet=function(b,d,e){a[c](2,b,h,d,null,new Date,e)}})(window,document,”_googWcmImpl”,”_googWcmAk”,”script”);

    Ended up using the code you had on the example and change the ak and cl number to match the code above but i’m not sure it’s working.
    The page is



  13. Bar Twito Says:
    November 21st, 2014 at 10:05 pm

    I am getting the error when trying to update tag under GTM. “i am getting a JavaScript Compiler Error at line 3, character 49: Parse error. Character ‘‘’ (U+2018) is not a valid identifier start char.”

  14. Arnold Majlath Says:
    November 24th, 2014 at 9:58 am

    Hi Bar,

    You have a syntax error in your markup in both instances of the phone number.

    <span class=”number”>
    <span class=””number””>

    Both should be:

    <span class=”number”>

    Please let me know if changing these resolves the issue.


  15. Bar Twito Says:
    November 24th, 2014 at 3:05 pm


    Thank you for helping out. I think that the word press visual composer is changing the code when i insert it. On a different note – i am trying to solve the issue in the actual GTM. I follow the instructions and getting this error “JavaScript Compiler Error at line 3, character 49: Parse error. Character ‘‘’ (U+2018) is not a valid identifier start char.”

    When placing this code under Custom HTM Tag
    function(a,e,c,f,g,b,d){var h={ak:”992092416″,cl:”OnxNCM3h11cQgMKI2QM”};a=a||function(){(a.q=a.q||[]).push(arguments)};a[f]||(a[f]=h.ak);b=e.createElement(g);b.async=1;b.src=”//”;d=e.getElementsByTagName(g)[0];d.parentNode.insertBefore(b,d);a._googWcmGet=function(b,d,e){a(2,b,h,d,null,new Date,e)}})(window,document,”_googWcmImpl”,”_googWcmAk”,”script”);
    jQuery(document).ready(function() { _googWcmGet(‘number’, ‘X-XXX-XXX-XXXX’); });

    I changed the “xxx-xxx” to the actual number and still getting the error.



  16. Bar Twito Says:
    November 24th, 2014 at 8:34 pm


    Thanks again for taking the time helping me. I will change on the website but the main issue is that i am getting that error when i am trying to add the below and a custom HTML under GTM:
    (function(a,e,c,f,g,b,d){var h={ak:”992092416″,cl:”OnxNCM3h11cQgMKI2QM”};a=a||function(){(a.q=a.q||[]).push(arguments)};a[f]||(a[f]=h.ak);b=e.createElement(g);b.async=1;b.src=”//”;d=e.getElementsByTagName(g)[0];d.parentNode.insertBefore(b,d);a._googWcmGet=function(b,d,e){a(2,b,h,d,null,new Date,e)}})(window,document,”_googWcmImpl”,”_googWcmAk”,”script”);
    jQuery(document).ready(function() { _googWcmGet(‘number’, ‘X-XXX-XXX-XXXX’); });



  17. Nathan Weinberg Says:
    November 26th, 2014 at 1:54 am

    Dave, this is the code I put in Tag Manager:

    script // /script

    I tried the XXX part with a 1 in the beginning (X-XXX-XXX-XXXX), without, with the actual phone number instead of Xs, and nothing worked. What am I missing?

    You can delete my earlier comment; it appears your moderation system dropped the code due to the SCRIPT tags.

  18. Adam Powell Says:
    December 26th, 2014 at 7:49 am

    Great Article!

    Why do you include CDATA comments?

    It’s been so long since I have seen them used that I’m wondering if there’s a reason (other than XML validation) that you are using them.

    Is there something about GTM or this method that requires their use?

  19. Arnold Majlath Says:
    January 3rd, 2015 at 7:14 pm

    Hi Adam,

    You’re right, CDATA comments are not needed, I removed them from the article. We have the code on the websites and in GTM without them. Thanks for spotting it.

  20. Chris Says:
    January 14th, 2015 at 5:48 pm

    This article was great and it helped me catch some things I didn’t really understand trying to set this up following Google’s online instructions.

    I do want to make sure I understand the phone number entries in the code however.

    When I created my campaign call extension I used my main company phone number (i.e. 123-456-7890) where phone number was required next to the Country. I selected to show ads with “A Google forwarding number”.

    Was that correct? Or was I supposed to setup some kind of forwarding number first and use that in this box?

    My current setup is…

    code: { _googWcmGet(‘bizphone’, ‘123-456-7890’); }

    website: (123) 456-7890)

    That seems wrong but I am not clear.

    Am I good or did I miss something?

  21. Josh S. Says:
    March 5th, 2015 at 5:35 pm

    Does this still work with GTM v2? I set this up in a dozen different permutations, but every time the “gwcm” cookie is created (by any call to _googWcmGet), the very next page load results in ERR_TOO_MANY_REDIRECTS redirect crash. Only by deleting the “gwcm” cookie can the page be loaded again. Happens consistently.

    Google Support is telling me “only the tracking snippet can be inserted using Tag Manager. The custom portion is a pixel tag and has to be added to each page and cannot be added using tag manager.”

    by “custom portion” he means the callback and the call to _googWcmGet

  22. Bipin Singh Says:
    March 9th, 2015 at 11:16 am

    Hi Dave,

    Nice article. Its really helpful coz i use GTM for almost all the clients.

    I think your example refers to US number format 1-862-234-8578 but suppose I have client from UK and it has a different number format like this +44 (0) 20-7724 3100. What should i do i this case?

    Please suggest

  23. RMO Says:
    March 13th, 2015 at 12:33 pm

    Hi Bar,

    Could you try to change the characters ‘ ’ into ‘ ?

    My error was solved after changing this.

  24. RMO Says:
    March 23rd, 2015 at 10:20 pm

    Sorry, i see now that the character ‘ is being replaced. It must be: U+0027 according to

  25. Jason James Says:
    April 24th, 2015 at 2:31 pm

    We found there was an issue with using this method when you want to use Google Tag Manager to replace both the number and a tel: link within a href or when you wanted to replace more than one number on the page.

  26. Jonathan Sackheim Says:
    June 10th, 2015 at 8:38 pm

    I too am getting the “Error at line 5, character 13: Parse error. Character ‘‘’ (U+2018) is not a valid identifier start char” error when trying to publish the container in Google Tag Manager. Not sure what’s up. Any suggestions? I think I followed the steps exactly.

  27. Lori Says:
    July 29th, 2015 at 9:47 pm

    I was thrilled to find this article as perhaps I could finally sort this out. The new campaign I created to test this did not have a call extension. Sadly, still can’t get it working. Google support tells me the tag manager is not “compatible” with call tracking. I can’t seem to find evidence that it is working.

  28. David Harcourt Says:
    September 16th, 2015 at 3:20 am

    It would be great to find a solution that is more versatile like something uses. You simply put in the number you want to ‘swap’ and it does the rest of the work. Adjusts for using periods or dashes in the number and maybe even displaying the number in different id’s. It doesn’t care about the id, or any css, just the number you want to target (swap) on the webpage.

    How is it that’s possible, but Google’s seems so convoluted and difficult?

  29. Olly Says:
    January 5th, 2016 at 10:59 am

    Hi Josh, did you manage to resolve this? We’re also having the redirect issue.