Ways to Fix Your Low Quality Score on Google AdWords

Ways to Fix Your Low Quality Score on Google AdWords

Optimize low Quality Score

Low Quality Scores on Google AdWords Could Be Wasting Your Money

A low quality score on Google Ads can be extremely hard to fix. If you think a low quality score is wasting your ad spend and ruining your ROI, here are some ways to tackle the problem.

What is a Quality Score?

Google measures ad relevance through a quality score, which is a keyword-level metric that ranges between 1 and 10. It’s pretty difficult to earn a 1 or a 10, but even scores between 3 and 5 can drive up CPCs.

Quality score demonstrates how relevant Google believes your ad is to the searcher. The components of AdWords Quality Score are:

  • Your historical click-through-rate (CTR)
  • The relevance of the keyword and ad to the search query
  • The relevance of the keyword to the ad copy
  • Landing page quality

Why is Quality Score important?

Quality Score is a vital piece of Ad Rank, which dictates where ads appear in search engine results and how much you’re charged per click. Basically, the better your Quality Score, the lower your CPC and the higher you rank in search results. Google will also show your ad more if you score better.

According to Wordstream, Quality Score can save marketers up to 50 percent, so it’s important to work to better your score per keyword.

How to Find Poor Scoring Keywords

With this script created by expert Daniel Gilbert, you’ll receive email alerts about keywords with Quality Score issues. You simply set a Quality Score threshold, and the script will email you a list of keywords with bad scores and their location, so you can get to work. If you want to pause keywords with low Quality Scores, the script can pause the keywords for you. Gilbert advises setting up a regular schedule for checking your scores.

Fixing Low Quality Score Issues

If your ads have a low CTR, make sure to include relevant and high-volume keywords into your copy. It’s important to A/B test ad copy with slight variations to get an idea of what’s driving more clicks. Also use extensions that help your ad standout like sitelink extensions.

Next, look into your landing page. Are your destination URLs correct? Could your loading times be improved? Make sure you’re meeting Google’s guidelines on landing page experience. If you’re not, start taking actions to get closer to meeting them.

Make highly relevant ad groups. Don’t try to stuff too many keywords in one ad group. The more defined your ad groups, the better chance you have of creating a highly targeted ad.

Using the Quality Score Script

Go to “Bulk Actions” in your Google Ads account. Choose “Scripts” to go to the Scripts page. Next, click on the pig plus sign button to create a new script. Paste in Daniel Gilbert’s Quality Score script.

Here is the Script:

* Low Quality Score Alert
* This script finds the low QS keywords (determined by a user defined threshold)
* and sends an email listing them. Optionally it also labels and/or pauses the
* keywords.
* Version: 1.0
* Google AdWords Script maintained on brainlabsdigital.com
var EMAIL_ADDRESSES = [“alice@example.com”, “bob@example.co.uk”];
// The address or addresses that will be emailed a list of low QS keywords
// eg [“alice@example.com”, “bob@example.co.uk”] or [“eve@example.org”]
// Keywords with quality score less than or equal to this number are
// considered ‘low QS’
var LABEL_KEYWORDS = true;
// If this is true, low QS keywords will be automatically labelled
var LOW_QS_LABEL_NAME = “Low QS Keyword”;
// The name of the label applied to low QS keywords
var PAUSE_KEYWORDS = false;
// If this is true, low QS keywords will be automatically paused
// Set to false if you want them to stay active.
// Functions
function main() {
 Logger.log(“Pause Keywords: “ + PAUSE_KEYWORDS);
 Logger.log(“Label Keywords: “ + LABEL_KEYWORDS);
 var keywords = findKeywordsWithQSBelow(QS_THRESHOLD);
 Logger.log(“Found “ + keywords.length + ” keywords with low quality score”);
 if (!labelExists(LOW_QS_LABEL_NAME)) {
   Logger.log(Utilities.formatString(‘Creating label: “%s”‘, LOW_QS_LABEL_NAME));
   AdWordsApp.createLabel(LOW_QS_LABEL_NAME, ‘Automatically created by QS Alert’, ‘red’);
 var mutations = [
     enabled: PAUSE_KEYWORDS,
     callback: function (keyword) {
     enabled: LABEL_KEYWORDS,
     callback: function (keyword, currentLabels) {
       if (currentLabels.indexOf(LOW_QS_LABEL_NAME) === 1) {
 var chunkSize = 10000;
 var chunkedKeywords = chunkList(keywords, chunkSize);
 Logger.log(“Making changes to keywords..”);
 chunkedKeywords.forEach(function (keywordChunk) {
   mutateKeywords(keywordChunk, mutations);
 if (keywords.length > 0) {
   Logger.log(“Email sent.”);
 } else {
   Logger.log(“No email to send.”);
function findKeywordsWithQSBelow(threshold) {
 var query = ‘SELECT Id, AdGroupId, CampaignName, AdGroupName, Criteria, QualityScore, Labels’
   + ‘ AND HasQualityScore = “TRUE” AND QualityScore <= ‘ + threshold;
 var report = AdWordsApp.report(query);      
 var rows = report.rows();    
 var lowQSKeywords = [];
 while (rows.hasNext()) {
   var row = rows.next();
   var lowQSKeyword = {
     campaignName: row[‘CampaignName’],
     adGroupName: row[‘AdGroupName’],
     keywordText: row[‘Criteria’],
     labels: (row[‘Labels’].trim() === ‘–‘) ? [] : JSON.parse(row[‘Labels’]),
     uniqueId: [row[‘AdGroupId’], row[‘Id’]],
     qualityScore: row[‘QualityScore’]
 return lowQSKeywords;
function labelExists(labelName) {
 var condition = Utilities.formatString(‘LabelName = “%s”‘, labelName);
 return AdWordsApp.labels().withCondition(condition).get().hasNext();
function chunkList(list, chunkSize) {
 var chunks = [];
 for (var i = 0; i < list.length; i += chunkSize) {
   chunks.push(list.slice(i, i + chunkSize));
 return chunks;
function mutateKeywords(keywords, mutations) {
 var keywordIds = keywords.map(function (keyword) {
   return keyword[‘uniqueId’];
 var mutationsToApply = getMutationsToApply(mutations);
 var adwordsKeywords = AdWordsApp.keywords().withIds(keywordIds).get();
 var i = 0;
 while (adwordsKeywords.hasNext()) {
   var currentKeywordLabels = keywords[i][‘labels’];
   var adwordsKeyword = adwordsKeywords.next();
   mutationsToApply.forEach(function(mutate) {
     mutate(adwordsKeyword, currentKeywordLabels);
function getMutationsToApply(mutations) {
 var enabledMutations = mutations.filter(function (mutation) {
   return mutation[‘enabled’];
 return enabledMutations.map(function (condition) {
     return condition[‘callback’];
function sendEmail(keywords) {
 var subject = “Low Quality Keywords Paused”;
 var htmlBody =
     “<p>Keywords with a quality score of less than “ + QS_THRESHOLD + “found.<p>”
     + “<p>Actions Taken:<p>”
     + “<ul>”
     + “<li><b>Paused</b>: “ + PAUSE_KEYWORDS + “</li>”
     + “<li><b>Labelled</b> with <code>” + LOW_QS_LABEL_NAME + “</code>: “ + LABEL_KEYWORDS + “</li>”
     + “</ul>”
     + renderTable(keywords);
   to: EMAIL_ADDRESSES.join(“,”),
   subject: subject,
   htmlBody: htmlBody
function renderTable(keywords) {
 var header = ‘<table border=”2″ cellspacing=”0″ cellpadding=”6″ rules=”groups” frame=”hsides”>’
 + ‘<thead><tr>’
 + ‘<th>Campaign Name</th>’
 + ‘<th>Ad Group Name</th>’
 + ‘<th>Keyword Text</th>’
 + ‘<th>Quality Score</th>’
 + ‘</tr></thead><tbody>’;
 var rows = keywords.reduce(function(accumulator, keyword) {
   return accumulator
     + ‘<tr><td>’ + [
     + ‘</td></tr>’;
 }, “”);
 var footer = ‘</tbody></table>’;
 var table = header + rows + footer;
 return table;


Be sure to edit the following options:

  • QS_THRESHOLD = Quality Score Threshold
  • PAUSE_KEYWORDS = set this to true if you want to pause keywords that meet your Quality Score threshold

Your quality score determines your cost per click, how often you appear in search results and where you rank. Work to improve your low quality score to improve your ROI.


Always follow industry best practices and all applicable rules and regulations with your advertising and marketing materials. ArrowShade takes compliance very seriously. We are also here to help. For questions regarding compliance, please email us at compliance@arrowshade.com.

Leave a Reply

Your email address will not be published. Required fields are marked *