A quick and easy way to test your GAQL queries

Here’s a scenario you might recognize. Google Ads script in the old script environment: works like a charm. Same script in the new environment: throwing errors all over the place, and/or simply timing out.

In these cases, there’s a big chance the issue is caused by some old AWQL queries that need to be migrated to the new GAQL format.

Migrating these queries takes some trial and error, and testing GAQL queries from within your code might just feel too cumbersome.

If you recognize what I am talking about, you might want to check out this (free) tool by our PPC friends at TrueClicks: https://gaql.app/

The tool allows you to perform GAQL queries on live Google Ads accounts that you have access to. Within seconds, you’ll see a table with the results of your query, which you can also export as an Excel file.

NOTE: The tool does require access to your account data.

Happy querying!

– Nils

annual reminder

Remember that agency/freelancer who did an audit on your account a year ago? 

That person just might still be able to access your data.

Annual reminder: Go check on all the people who have access to your Google Ads account(s)!

Here’s your how-to guide:
https://support.google.com/google-ads/answer/6372672?hl=en#:~:text=Sign%20in%20to%20your%20Google,then%20enter%20their%20email%20address

PRO TIP: Schedule this task as as a yearly “Custom recurrence” event in your calendar.

– Nils

trick to prevent Google from overspending/wasting budget that is ‘left on the table’

Last January, we talked about what happens to your monthly spend when you change your daily budget. (Link provided below for your convenience.)

Today, I came across an excellent post on LinkedIn by Google Ads legend Mike Rhodes. He shares a great little trick to prevent Google from overspending/wasting budget that is ‘left on the table’:

Link to post: https://www.linkedin.com/posts/websavvy_googleads-ppc-adwords-activity-7004553961143775232-Up2m

– Nils

PS: Here’s the link to what I wrote earlier this year, as promised: https://nilsrooijmans.com/daily/what-happens-when-you-change-your-daily-budget

zoom in and out periodically

To miss the forest for the trees is a problem.

However, it’s just as problematic to miss the trees for the forest.

Being stuck in one mode or the other reflects a rigidity of focus.

If you don’t zoom in and out periodically to maintain an accurate perspective on your account(s), your thinking will be either:

1. too small to make a meaningful impact (i.e., tinkering with headlines for ads that get little impressions), or
2. too abstract to be effective in the real world (i.e., dumping all your products with different margins in a single asset group PMax campaign).

To my analytical, detail-oriented friends: maybe devote one day a month to zooming out by imagining the impact you’d like to have on the bigger marketing picture or what new audiences you could potentially reach with different campaign (types).

And to my big thinking, corner-cutting friends: maybe devote one day a month to zooming in by quietly listening to the nitty-gritty data folks who disagree with your approach in hopes of understanding the nuances of their insights.

Whichever one you need to do, I’d be willing to bet that doing so would make you more effective at reaching bigger goals, better ROIs.

– Nils

[Performance Max] ValueTrack and Custom parameters for improved tracking

Do you want to track Performance Max clicks at the Asset group level?

Fellow list member Felipe Martins sent in this question (shared with permission, slightly edited for clarity):

“Since I’ve started with PMax campaigns I need to track more properly, since we are using auto-tagging and seeing NULL values in the utm_content for these campaigns.

Do you know anything about ValueTrack and Asset Groups? I mean, if you know any kind of template we could use to track “asset group name” or “asset group id”?

Great question.

I’ve tested ValueTrack parameters in my PMax campaigns by adding the following Tracking template to multiple campaigns:

'{lpurl}?matchtype={matchtype}&extensionid={extensionid}&targetid={targetid}&network={network}&gsn={ifsearch:1}&gdn={ifcontent:1}&keyword={keyword}&placement={placement}&adposition={adposition}' 

Unfortunately, NONE, of the parameters get any value assigned. There’s an occasional exception for the network parameter; sometimes the value for ‘network’ is set to ‘x’. I think ‘x’ stands for ‘crossnetwork’, not sure why this happens only occasionally.

The same happens when you add the tracking parameters as Final URL Suffix; no values are assigned.

What you can do though, is add your Custom parameters at the PMax campaign level: https://support.google.com/google-ads/answer/6325879?ctx=tltp. You can do this manually, or use a script to automatically set the parameters for you.

Another thing you can do is adding some tracking variables to your Asset groups!

As far as I know, Google does not allow you to add a tracking template or custom parameters at the asset group level.

What you can do, is use a script to automatically set the Final URL of your PMax asset groups to contain your custom parameters.
That is, you can add the Name and Id of the asset group by hardcoding them in your Final URL:

'?utm_source='google'&utm_medium='cpc'&utm_campaign={PmaxCampaignName}&utm_content={PmaxAssetGroupName}&utm_id={PmaxAssetGroupId}'

Here are two links to help you get started:

Happy scripting!

– Nils

PS: If you want me to create the script for you, send me an email at nils@nilsrooijmans.com.

Automagically adding radius targeting in bulk

Imagine having to spend 2 hours per day adding radius targeting to your campaigns:

1. Grab a coffee while the Google Ads interface loads your campaign view
2. Click Campaign Settings
3. Stare at the screen in full awe, not understanding why it takes ages to load
4. Click Locations
5. Click Advanced Search
6. Lookup target
7. Set radius
8. Click Save
9. Navigate to the next campaign
10. Wait for at least 5 seconds (seconds that feel like forever) for the page to load
11. Click Locations, click Advanced Search, lookup target, set radius, click Save
12. Rinse and repeat

All the above. For two hours. Every day.

Yesterday, one of my clients complained about this horror show and asked me if we could automate this process using scripts.

He was looking for a solution that automagically adds radius targets based on location names (i.e., cities) in the campaign name.

Good news: you can use scripts to add radius targets in bulk!

Here’s a code snippet to help you get started: https://developers.google.com/google-ads/scripts/docs/examples/proximity

If you want to automate your radius targets too and have me create your script for you, send me an email at nils@nilsrooijmans.com.

– Nils

A question I always say yes to

Every now and then, an email lands in my inbox that requires only one word in the reply.

The one word is “Yes.”

The email usually goes something like this:

“Hey Nils, I just thought of X, should I test this?” (*)

And then I go: 

“Yes!”

X can be anything.

“I want to add dashes at the start of my headlines to stand out, should I test this?” 

Yes.

“My colleague suggested we add custom sitelinks to our top ad groups to increase clicks. Should we test this?”

Yes.

“You suggested adding converting search terms as keywords to our ad groups. Sounds like a lot of work. Should we really test this?”

Yes (and use a script to do so).

“Google suggested changing our keywords to broad. Should I test this?”

Yes.

“Should we test Max Conversions bidding on our competitor campaign?”

Yes.

The answer is yes.

Always Be Testing.

– Nils

(*) By the way, I love emails like these! So, if you are testing things now, or are considering testing something, please share by sending me an email at nils@nilsrooijmans.com.

“It’s so much better to have everything in GAQL”

Long-time list member Vincent Hsu sent in this response below to one of my latest emails, shared with permission. (A URL to my original email’s contents is provided below for your convenience.)

“Justed checking in to tell you that this Newsletter is great 🙂 Just what I needed to update to GAQL today !
AWQL still silently converts to GAQL silently in the background so things continue to work in most cases, but it’s so much better to have everything in GAQL isn’t it :-)”

I love responses like this! It is this kind of replies that make writing my emails all worth the effort 🙂

More importantly, Vincent is right. Google is trying hard to make the new Google Ads environment backward compatible with the old scripts. 

Still, it’s better to migrate your scripts to the new environment and upgrade your code. This includes migrating AWQL to GAQL.

Here’s why:

1. The code that Google uses to provide backward compatibility is (still) buggy. This means not all code from the old environment will work properly in the new environment. (Just head over to the Google Ads Script forum and you will see what I am talking about.)

 2. The code that Google uses to provide backward compatibility is slowing down your scripts. Running legacy scripts in the new environment unnecessarily slows things down. This means you may reach the execution limit of 30 minutes and your script will simply stop.

So, start migrating your scripts!

Any scripts left unmigrated will be automatically migrated and may be paused next week, on October 31, when legacy scripts sunset.

– Nils

PS: Here’s a link to what I wrote in my original email -> https://nilsrooijmans.com/daily/query-migration-tool

“What’s your process for building and testing a script?”

Last week, a PPC Redditor asked a great question:

“What’s your process for building and testing a script?”

The key word here is ‘process.’ You need to have a process first before you can start automating the (sub)tasks.  

So, the first step would be to think deeply about the task you want to automate, and to document every step in the process.  

Let’s say you want to make sure all ad groups have live ads. In this case, ask yourself:  
1. Why do I want this?  
2. What do I need for this?  
3. How can I get the things I need?  

Potential answers (simplified):  
1. I don’t want disapprovals or manual mistakes (e.g., accidentally pausing entities) to stop me from showing ads.
2. I need to continuously make sure all my ad groups have at least one enabled keyword and one enabled ad (that is eligible to run).  
3. For every enabled ad group, I need to check the status of my keywords and the status of my ads, and be in the know when an enabled ad group has zero enabled keywords or zero enabled ads. This check needs to happen all the time.  

The second step would be to start writing functions to automate the parts of the process you have described.  

In our example, you would create a function to check if an ad group has at least one enabled keyword. You would also create a function to check if an ad group has at least one enabled (eligible) ad running.  Then, you would write a function that goes over all enabled ad groups, and uses these functions to check keywords and ads.  You would also have another function to alert you (i.e., via email). That function would get called if one of your checks failed.  

The third step would be to test the different functions and then preview the script. For the testing, I always recommend testing them individually first and then using the Logger.log function to see intermediate results. Then, previewing instead of ‘running’ the script already will make sure the script does not make any changes in your account, so you are sure the script does not F things up.  

After previewing, if you are happy with the results, you can then schedule the script to run hourly.  

Google Ads Scripting all starts with your process.

Think hard about your current PPC tasks that take up most of your time or are error-prone. Write them down. Be very specific in your documentation. Divide tasks into subtasks. Then, start scripting.

– Nils

1,2,3 ad copy

Every now and then I stumble across some old PPC blog posts with amazing evergreen PPC tips. Here’s another beauty that popped up in my browser today. Can you see which ad copy sticks out?

If you can’t spot it immediately, here it is:

As you can see, they have a number at the start of their headline which draws your attention, and gives you a clear expectation of what happens when you click.

Here’s the thing: Few advertisers take the time to experiment with strategies and patterns that the eye is drawn to. If you do, you get the click.

Source: https://davidmelamed.com/2015/02/10/clever-ppc-advertisement-2015-far/

– Nils

[Custom Column] Conversion value per thousand impressions

Custom columns are great! This nifty feature allows you to display non-standard data in the Google Ads interface and Reports.

In the coming months, I will be sharing some of my favorites.

Here is a first: Conversion value per thousand impressions

This metric allows me to rank campaigns, ad groups, and ads on the value per impression.

At the campaign or ad group level: relatively low scores tell me there might be something wrong with the targeting of the campaign or ad group (e.g., not strict enough).

At the level of the ads: relatively low scores tell me the ad and/or lander needs work.

– Nils

Query Migration Tool

Last week, I was in Berlin to attend and present at the SMX Advanced event.

Several people joined my workshop on the Google Ads Query Language.

We discussed many aspects of this new way of getting reports from the new Google Ads script environment. You know, this new environment we all need to migrate to before the end of this month.

One of the more challenging parts of migrating your current scripts to the new environment is the migration of AWQL queries to GAQL.

Here is a tool that might be of help if you get stuck: https://developers.google.com/google-ads/api/docs/migration/query-migration-tool

– Nils

PS: Having trouble migrating your scripts? I’m currently offering 1-hour migration support sessions. Email me at nils@nilsrooijmans.com to get on the list for that.

On performance measurement and improvement

Where performance is measured, performance improves.

Where performance isn’t measured, performance will not improve.

Now read the above sentences again, with machine learning in mind.

Moral of the story: be sure to track all of your conversions.

– Nils

PS: Here are two quick links to help you track more conversions:
https://support.google.com/google-ads/answer/2998031?hl=en
https://support.google.com/google-ads/answer/9888656?hl=en

Teaching AI to scale

Optimizing for conversions doesn’t just increase conversions or revenue. It also increases the total data input volume that machine learning can use to do its job well. The more conversion data, the better the algorithm can optimize for conversions.

This is how you teach the AI to scale.

Ask yourself:

1. Why does this person click this ad?
2. Where does the click go?
3. How can this be improved?

– Nils