How much does Google’s new search term filtering affect ad spend transparency? Here’s how to find out

Posted On 17 Sep 2020
By :
Comment: Off

This script will show you the daily percentage of clicks going to search terms that Google doesn’t report.

A few well respected PPC influencers weighed in on the impact of this change on Twitter.

Ultimately, what really matters is the impact on your own accounts and whether the change limits your ability to effectively optimize things.

A script to calculate how many queries are unidentified

So we at Optmyzr wrote a script to help you to see the impact for yourself.

The script pulls daily metrics for as many days back as you’d like. You can choose to focus on impressions, clicks, or cost. It pulls the data two ways:

  1. Using an account report, filtered for Ad Network Type = Search
  2. Using a search query report, also filtered for Ad Network Type = Search

It then compares the key metric, like cost, between the two reports. The account performance report should include data from all search queries, whereas the search query report now only includes data for search queries that made it past Google’s new filters.

We then use these two numbers to calculate the percentage of unidentified search queries — column D in the example below.

The script generates a Google Sheet with daily metrics based on the account report (column B) and the search query report (column C).

The search query report metrics in column C are lower because of Google’s search term filtering.

Finally, we plot this percentage of clicks going to unknown search terms by day, allowing you to easily see if there are any big changes coming out of the Googleplex.

The script from Optmyzr plots the daily percentage of unidentified search queries in a Google account.

Findings

The point of sharing this script is to make it easy for everyone to see the impact of this change on their own accounts. I’ve run it on only a handful of accounts myself, so my findings are based on a small sample set.

Here’s what I found:

  1. Impressions were already filtered a lot before Google’s announcement.
  2. The change took effect September 2, 2020, the day of Google’s announcement.
  3. There is a pronounced decrease in visibility into queries driving clicks and cost.
  4. E-commerce advertisers who use Smart Shopping campaigns saw less of a change because most search terms were already unavailable to them.

Let me illustrate the large amount of filtering that’s been happening for quite some time first.

Here’s a chart for the level of filtering Google does when we consider impressions as the key metric.

Charting the daily percentage of unknown search terms by impressions.

Notice that there’s barely a noticeable difference on September 2nd. More importantly, notice that more than 70% of my impression volume comes from search terms that are not in the search query performance report. This data goes back to mid July for this chart but you can run it for a longer period of time if you’re curious.

Next, let’s look at what happened on September 2nd with clicks and cost data, the metrics advertisers are justifiably more sensitive to.

Here’s a chart going back to mid-July based on cost for an account.

This chart is generated by the Google Ads script and shows the percentage of an account’s metrics that are derived from searches where the search term is not reported by Google. 

It’s clear that there’s a big spike in unidentified search terms starting September 2nd. In this particular example, the percentage went from the mid twenties to around 50%.

This means that for this particular account, we used to not know which search queries were responsible for about 20% of costs. Now with the recent change, we don’t know which queries are responsible for nearly half of our ad spend.

The script

Ready to do the analysis yourself? Just copy-and-paste this script into the script section of Google Ads.

The settings are pretty self-explanatory. Put your email address on line 8. Line 7 and 9 can also be changed but the script will run fine if you leave these as they are.

Seeing interesting results? Let me know via Twitter.

/***************************************************
* Undefined Search Terms Report
* @version 1.1
* @author: Naman Jindal (Optmyzr)
****************************************************/
var LAST_N_DAYS = 30; // Number of previous days to include in report
var EMAILS = [‘example@example.com’]; // Array of Emails to be notified and given access to the results in a Google Sheet
var PRIMARY_METRIC = ‘Cost’; // E.g. Impressions, Cost, Clicks
function main() {
var map = {};
var DATE_RANGE = getAdWordsFormattedDate(LAST_N_DAYS, ‘yyyyMMdd’) + ‘,’ + getAdWordsFormattedDate(1, ‘yyyyMMdd’);
var query = [
‘SELECT Date, Impressions, Cost, Clicks FROM ACCOUNT_PERFORMANCE_REPORT’,
‘WHERE AdNetworkType1 = SEARCH’, ‘DURING’, DATE_RANGE
].join(‘ ‘);
var rows = AdsApp.report(query).rows();
while(rows.hasNext()) {
var row = rows.next();
map[row.Date] = {
‘ACTUAL’: 0,
‘QUERIES’: 0
};
map[row.Date].ACTUAL = parseInt(row[PRIMARY_METRIC], 10);
}
var query = [
‘SELECT Date, Query, Impressions, Cost, Clicks FROM SEARCH_QUERY_PERFORMANCE_REPORT’,
‘WHERE AdNetworkType1 = SEARCH’,
‘DURING’, DATE_RANGE
].join(‘ ‘);
var rows = AdsApp.report(query).rows();
while(rows.hasNext()) {
var row = rows.next();
map[row.Date].QUERIES += parseInt(row[PRIMARY_METRIC], 10);
}
var output = [];
for(var date in map) {
output.push([date, map[date].ACTUAL, map[date].QUERIES, (map[date].ACTUAL – map[date].QUERIES) / map[date].ACTUAL]);
}
if(!output.length) {
Logger.log(‘No data in the account’);
}
var TEMPLATE_URL = ‘https://docs.google.com/spreadsheets/d/1G1-zPqm0kqQjZSPEwS8cfndYVzkswbyl80SiLlqiPF8/edit#gid=0’;
var template = SpreadsheetApp.openByUrl(TEMPLATE_URL);
var ss = template.copy(AdsApp.currentAccount().getName() + ‘ – Undefined Search Terms Report by ‘ + PRIMARY_METRIC);
ss.addEditors(EMAILS);
var tab = ss.getSheets()[0];
tab.getRange(2,1,tab.getLastRow(),tab.getLastColumn()).clearContent();
tab.getRange(2,1,output.length,output[0].length).setValues(output).sort([{‘column’: 1, ‘ascending’: true}]);
var msg = ‘Hi,\nPlease find below the undefined search terms report for your Google Ads account:\n’+ss.getUrl();
MailApp.sendEmail(EMAILS.join(‘,’), AdsApp.currentAccount().getName() + ‘ – Undefined Search Terms Report by ‘ + PRIMARY_METRIC, msg);
Logger.log(“Your report is ready at ” + ss.getUrl());
}
function round_(num,n) {
return +(Math.round(num + “e+”+n) + “e-“+n);
}
function getAdWordsFormattedDate(d, format){
var date = new Date();
date.setDate(date.getDate() – d);
return Utilities.formatDate(date,AdsApp.currentAccount().getTimeZone(),format);
}

Opinions expressed in this article are those of the guest author and not necessarily Search Engine Land. Staff authors are listed here.

About the Author