How to Set up Google Ad Precautionary Tracking Script

This article covers the steps required to set up the Google Ad Precautionary Tracking Script, a fail-safe mechanism designed to ensure accurate attribution data when the UTM template fails. This script tracks all clicks on a specific link and sends the data to Google Analytics. The only customization needed is updating the URL for the tracking page to match the one used by your website.

Step 1: Visit Your Google Ad Account

  • Log in to your Google Ad account.

Step 2: Navigate to Scripts in Google Ads

  • Click on Tools and Settings.

  • Select Bulk Actions.

  • Click on Scripts.

Please Note: If you cannot find this option, switch to advanced view to see the Tools and Settings option.

Step 3: Add the Script

  • Remove any predefined code in the script editor.

  • Copy and paste the following script:

info icon
function main() { var TrackingTemplate = "{lpurl}?utm_source=adwords&utm_medium={AdName}&utm_campaign={CampaignName}&utm_content={AdGroupName}&utm_keyword={keyword}&utm_matchtype={matchtype}&campaign_id={campaignid}&ad_group_id={adgroupid}&ad_id={creative}"; var CAMPAIGNCONTAINS = ""; var ADGROUPCONTAINS = ""; var STATUS = "ENABLED"; if (TrackingTemplate.search(/{AdGroupName}|{CampaignName}|{AdName}/g) == -1) { Logger.log("Enter at least one of the {CampaignName} or {AdGroupName} or {AdName} parameter in the tracking template"); return } if (TrackingTemplate.search("{AdGroupName}") > 0) { var adgroupIterator = { hasNext: function() { return false } } if (_ADGROUP_CONTAINS == "" && CAMPAIGNCONTAINS == "") { adgroupIterator = AdsApp.adGroups().withCondition("Status = " + STATUS).get(); } else if (_ADGROUP_CONTAINS == "" && CAMPAIGNCONTAINS !== "") { adgroupIterator = AdsApp.adGroups().withCondition("CampaignName contains '" + CAMPAIGNCONTAINS + "'").withCondition("Status = " + STATUS).get(); } else if (_ADGROUP_CONTAINS !== "" && CAMPAIGNCONTAINS !== "") { adgroupIterator = AdsApp.adGroups().withCondition("CampaignName contains '" + CAMPAIGNCONTAINS + "'").withCondition("Name contains '" + ADGROUPCONTAINS + "'").withCondition("Status = " + STATUS).get(); } else if (_ADGROUP_CONTAINS !== "" && CAMPAIGNCONTAINS == "") { adgroupIterator = AdsApp.adGroups().withCondition("Name contains '" + ADGROUPCONTAINS + "'").withCondition("Status = " + STATUS).get(); } if (!adgroupIterator.hasNext()) { Logger.log("No Campaigns/Adgroups matched with this condition"); return } while (adgroupIterator.hasNext()) { var adgroup = adgroupIterator.next(); var adgrouptemplate = TrackingTemplate.replace(/{AdGroupName}/g, adgroup.getName().replace(/\s/g, '%20')) if (TrackingTemplate.search("{CampaignName}") > 0) { adgrouptemplate = adgrouptemplate.replace(/{CampaignName}/g, adgroup.getCampaign().getName().replace(/\s/g, '%20')) } if (TrackingTemplate.search("{AdName}") > 0) { var adsIterator = adgroup.ads().get(); while (adsIterator.hasNext()) { var ad = adsIterator.next(); var adType = ad.getType(); var headline = ""; if (ad.getHeadline()) { headline = ad.getHeadline(); } else if(ad.isType().expandedTextAd()) { headline = ad.asType().expandedTextAd().getHeadlinePart1(); } else if(ad.isType().gmailImageAd()) { headline = ad.asType().gmailImageAd().getName(); } else if(ad.isType().gmailMultiProductAd()) { headline = ad.asType().gmailMultiProductAd().getHeadline(); } else if(ad.isType().gmailSinglePromotionAd()) { headline = ad.asType().gmailSinglePromotionAd().getHeadline(); } else if(ad.isType().html5Ad()) { headline = ad.asType().html5Ad().getName(); } else if(ad.isType().imageAd()) { headline = ad.asType().imageAd().getName(); } else if(ad.isType().responsiveDisplayAd()) { headline = ad.asType().responsiveDisplayAd().getShortHeadline(); } else if(ad.isType().responsiveSearchAd()) { var headlines = ad.asType().responsiveSearchAd().getHeadlines(); if (headlines && headlines[0].text) { headline = headlines[0].text; } } Logger.log("Headline text : " + headline); if (headline) { adgrouptemplate = adgrouptemplate.replace(/{AdName}/g, headline.replace(/\s/g, '%20')) } else { adgrouptemplate = adgrouptemplate.replace(/{AdName}/g, ad.getId()) } } } adgroup.urls().setTrackingTemplate(adgrouptemplate); Logger.log(adgroup.getCampaign().getName() + " => " + adgroup.getName() + " => " + adgrouptemplate) } } }

Step 4: Finalize the Script

  • After closing the script editor, rename the script to something recognizable.

  • Change the frequency from the list to Hourly.

FAQ's

Q: If I have another script, will it affect it?

A: Yes, scripts can override each other as they affect UTM parameters.

Q: Why do I need to authorize it?

A: Authorization is necessary because the script is implemented on your Google Ad Account. It is essential to check the preview before running it to ensure it shows most campaigns as successful with the landing page found.

Did this answer your question?
😞
😐
😁