How to setup Google Ads

- How to set utm parameters
- Attribution reporting in HighLevel
- How to push it - workflow and triggers

Google ads are a fantastic way to generate leads for clients right away.

Steps to get Started for Google Ad Reporting and Attribution Reporting with Google Ad and Google Analytics.

Step 1 : Visit Google Ads to get started with setting your account

Create your Google Ad account to set up the ad and integrate it with HighLevel.

Step 2 : Select the Goal of your Ad and choose the type of Ad

We have chosen the Create a campaign without a goal’s guidance and Search Option in campaign type. 

Next it will ask us what the result of this ad will be. We have chosen website visits, and you'll want to enter the urls fo pages that have HighLevel Chat widgets, Forms, Surveys, etc.

Step 3: Selection of Budget and Bidding Options

Select the budget of your ad campaign based on your performance you would like to achieve.


Step 4.1  : Campaign Settings like Network, Location, Language and Audience Segment

In Network, we choose Search Network and configure your geo and language targeting.


Step 4.2 Set the Advance UTM Parameters

After configuring the language settings, there will be an option for advanced settings. This step is very important in order to accurately track & attribute leads.

In Tracking Template, add the URL of the campaign followed by a string of UTM parameters as defined below.

If the campaign url is: 

So the final Tracking Template will look like this:{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}


You can find other optional UTM Parameters in this Guide from Google.

Once this is completed, we need to go to Tools and Settings. (Marked in red in navigation bar)

After clicking Tools and Settings > Bulk Actions > Scripts

Next we need to remove the predefined code and add this script:

Please note: This script acts as a fail safe should the UTM parameters not be in correct place. 

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 _CAMPAIGN_CONTAINS = "";
    var _ADGROUP_CONTAINS = "";
    var STATUS = "ENABLED";

    if ({AdGroupName}|{CampaignName}|{AdName}/g) == -1) {
        Logger.log("Enter at least one of the {CampaignName} or {AdGroupName} or {AdName} parameter in the tracking template");
    if ("{AdGroupName}") > 0) {
        var adgroupIterator = {
            hasNext: function() {
                return false
        if (_ADGROUP_CONTAINS == "" && _CAMPAIGN_CONTAINS == "") {
            adgroupIterator = AdsApp.adGroups().withCondition("Status = " + STATUS).get();
        } else if (_ADGROUP_CONTAINS == "" && _CAMPAIGN_CONTAINS !== "") {
            adgroupIterator = AdsApp.adGroups().withCondition("CampaignName contains '" + _CAMPAIGN_CONTAINS + "'").withCondition("Status = " + STATUS).get();
        } else if (_ADGROUP_CONTAINS !== "" && _CAMPAIGN_CONTAINS !== "") {
            adgroupIterator = AdsApp.adGroups().withCondition("CampaignName contains '" + _CAMPAIGN_CONTAINS + "'").withCondition("Name contains '" + _ADGROUP_CONTAINS + "'").withCondition("Status = " + STATUS).get();
        } else if (_ADGROUP_CONTAINS !== "" && _CAMPAIGN_CONTAINS == "") {
            adgroupIterator = AdsApp.adGroups().withCondition("Name contains '" + _ADGROUP_CONTAINS + "'").withCondition("Status = " + STATUS).get();

        if (!adgroupIterator.hasNext()) {
            Logger.log("No Campaigns/Adgroups matched with this condition");
        while (adgroupIterator.hasNext()) {
            var adgroup =;
            var adgrouptemplate = TrackingTemplate.replace(/{AdGroupName}/g, adgroup.getName().replace(/\s/g, '%20'))
            if ("{CampaignName}") > 0) {
                adgrouptemplate = adgrouptemplate.replace(/{CampaignName}/g, adgroup.getCampaign().getName().replace(/\s/g, '%20'))

            if ("{AdName}") > 0) {
                var adsIterator =;
                while (adsIterator.hasNext()) {
                  var ad =;
                  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())
            Logger.log(adgroup.getCampaign().getName() + " => " + adgroup.getName() + " => " + adgrouptemplate)

Next it will ask you to authorize the new script and then we need to Preview the script to check if it is running properly by clicking run on the script.

After closing, we need to change the name of the script and change the frequency to Hourly.

Step 5 : Setup the Keywords 

We need to enter a web page URL and 4-5 keywords related to your webpage like chat widget, form, survey etc.

Keywords are words or phrases that are used to match ads with the terms people are searching for. Keywords can be added in the following format:

keyword = Broad match

"keyword" = Phrase match

[keyword] = Exact match

After entering the keywords, the next step is to set-up the Ad details. Create your headlines (approx. 4-5 headlines are recommended) and add relevant description.

Please add the string of UTM Parameters that you created above here as well and test if the UTM Parameters are working. It should show that they are able to find the landing page.

UTM Parameters from above - {lpurl}?utm_source=adwords&utm_medium={_adgroup}&campaign_id={campaignid}&utm_content={creative}

Step 6 : Add Extension

Extensions expand your ad with additional information, giving people more reasons to choose a business. These may increase an ad's clickthrough rate by several percentage points. By adding more content to your ad, extensions give your ad greater visibility on the search results page. 

Step 7 : Make your Ad live 

In order to send your ad live, you need to add some predefined budget.

Step 8 : Set up the Google Analytics

Create Account for the website to track all the details. With the changes in Google Analytics with G4, HighLevel will be making changes in coming releases. Until then, you would be required to use the old configuration. Follow these quick steps.

  • Go to Google Analytics and Sign-in into your account

  • Go to Admin > Add Account or Property (As per the new G4 changes, it will not allow us to create Views which will be used to connect in HighLevel)

  • While Creating the Property, add the property name and configure the Time Zone & Currency options.

  • Clickn "Show Advanced Options", toggle on "Create a Universal Analytics Property", and select "Create a Universal Analytics Property only"

  • Click Next and setup other things that are mentioned in the details. Once this is completed, you will get the Tracking ID which you need to add in HighLevel.

Step 9: Select the Google Ad account in HighLevel Integration

After logging into HighLevel, navigate into the sub-account you'd like to connect and go to Settings > Integrations. Select Google and connect a Google account, then a Google Analytics account and then a Google Ads account. 

Once this is done, you can navigate to Reporting and select the Google Ads tab, where you should begin to see the details of the Campaigns, Ad Groups, and Ads. 

This is how it will show in your Google Ads Account.


And this is how it will show in Google Ads Reporting in HighLevel.

Step 10 : Setup Workflows to connect the Google Analytics 

Inside High Level Workflows, create a new workflow from scratch. 

Set the input Trigger to be Form Submissions, Survey Submission to match whatever you set up in the Ad configuration. Followed by loop the Google Ads and add the relevant parameter of Tracking ID and other things according to your requirements.