Zoektermen toevoegen als zoekwoorden

Zoektermen toevoegen als zoekwoord wanneer deze goed presteren. Een makkelijke manier om een account uit te breiden.

Start nu!
Zoektermen toevoegen als zoekwoorden
Zoektermen Get started!

Bij het optimaliseren van campagnes in Google Ads wordt vaak het zoekterm rapport erbij gepakt. Op basis van prestaties en boerenverstand worden daar zoektermen uitgesloten, maar vaak staan er ook zoekwoorden tussen die je kan toevoegen aan je advertentiegroep. Daarmee krijg je meer grip op de prestaties van deze specifieke zoektermen, omdat je biedingen kan aanpassen naar wens.

Met onderstaand script kan je dit proces automatiseren. Op basis van de prestaties van een zoekwoord, wordt deze automatisch toegevoegd wanneer de prestaties goed zijn. De minimale vereisten voor vertoningen, klikken, conversies, CTR, CPA en kosten stel je zelf in. Hierdoor heb je controle over de zoekwoorden die het script daadwerkelijk aan de advertentiegroep gaat toevoegen.

Daarbij controleert het script ook of het exact zoekwoord dat het wil gaan toevoegen, niet al ergens anders in het account aanwezig is. Hierdoor wordt de structuur van het account niet aangetast.

Instellingen

  • LOG: Geef aan of het script de tussenstappen moet rapporteren, door de waarde aan te passen naar 'true'.
  • DATE_RANGE: Aangeven over welke periode het script bovenstaande vereisten moet controleren. Verander het aantal in last_n_days().
  • IMPRESSIONS_THRESHOLD: Stel het minimaal aantal vertoningen in dat een zoekterm moet hebben.
  • CLICKS_THRESHOLD: Stel het minimaal aantal klikken in dat een zoekterm moet hebben.
  • CONVERSIONS_THRESHOLD: Stel het minimale aantal conversies in dat een zoekterm moet hebben.
  • CTR_THRESHOLD: Alleen zoektermen opnemen die aan deze minimale CTR voldoen.
  • CPA_THRESHOLD: Stel de maximale CPA in dat een zoekterm mag hebben.
  • COST_THRESHOLD: Alleen zoektermen opnemen die deze minimale kosten hebben.

Frequentie: Afhankelijk van de hoeveelheid verkeer in een account, adviseren we dit script maximaal 1x per dag te draaien.
LET OP: Het script is hoofdlettergevoelig. Standaard rapporteert Google zoektermen in kleine letters. Als jouw zoekwoorden hoofdletters bevatten, kan het zijn dat er een zoekterm wordt toegevoegd die al in je campagne staat. Zorg ervoor dat alle zoekwoorden in je accounts in kleine letters erin staan.

The script
// Copyright 2020. Increase BV. All Rights Reserved.
//
// Original script by Remko van der Zwaag
// That was based on a Google example script: http://goo.gl/aunUKV
// Rewritten by: Tibbe van Asten
//
// Created: 22-05-2020
// Last update: 24-05-2020
//
// ABOUT THE SCRIPT
// This script checks all search queries in your account. Based
// on your own theresholds, these queries can be added as exact
// keywords in the same adgroup.
//
////////////////////////////////////////////////////////////////////

var config = {

  LOG : true,

  // Set the daterange to select the search queries in your account.
  // Change the number of days to your liking.
  DATE_RANGE : last_n_days(90),

  // Set the following thresholds. Set to '0' (zero) to be ignored.
  // These threshold help select the right queries to be added.
  // Each queries must match all thresholds!
  IMPRESSIONS_THRESHOLD : 0,
  CLICKS_THRESHOLD : 0,
  CONVERSIONS_THRESHOLD : 0,
  CTR_THRESHOLD : 0,
  CPA_THRESHOLD : 0,
  COST_THRESHOLD : 0

}

////////////////////////////////////////////////////////////////////

function main(){

  var exactKeywords = getKeywords();
  var queriesToBeAdded = {};

  var report = AdsApp.report(
    "SELECT Query, KeywordTextMatchingQuery, AdGroupId, Impressions, Clicks, Cost, Ctr, CostPerConversion, Conversions " +
    "FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
    "WHERE Impressions > 0 " +
    "AND AdGroupStatus = ENABLED " +
    "AND CampaignStatus = ENABLED " +
    "AND KeywordTextMatchingQuery DOES_NOT_CONTAIN_IGNORE_CASE 'URL' " +
    "DURING " + config.DATE_RANGE);

  var rows = report.rows();
  while(rows.hasNext()){
    var row = rows.next();
    
    // Some selected queries are the same as the matching keyword.
    // We'll exclude them from being added.
    if(row["Query"] == row["KeywordTextMatchingQuery"]) continue;

    // Skip queries if thresholds are set and not matched.
    if(config.IMPRESSIONS_THRESHOLD != 0 && row["Impressions"] < config.IMPRESSIONS_THRESHOLD) continue;
    if(config.CLICKS_THRESHOLD != 0 && row["Clicks"] < config.CLICKS_THRESHOLD) continue;
    if(config.CONVERSIONS_THRESHOLD != 0 && row["Conversions"] < config.CONVERSIONS_THRESHOLD) continue;
    if(config.CTR_THRESHOLD != 0 && row["Ctr"].replace("%","") < config.CTR_THRESHOLD) continue;
    if(config.CPA_THRESHOLD != 0 && row["CostPerConversion"] > config.CPA_THRESHOLD) continue;
    if(config.COST_THRESHOLD != 0 && row["Cost"] < config.COST_THRESHOLD) continue;
    
      if(config.LOG === true){
        Logger.log(row["Query"] + ": " + row["Impressions"] + " impressions, " + row["Clicks"] + " clicks, " + row["Conversions"] + " conversions, " + row["Ctr"] + " CTR, €" + row["CostPerConversion"] + " CPA, €" + row["Cost"] + " cost.");
        Logger.log("Matched with " + row["KeywordTextMatchingQuery"]);
        Logger.log(" ");
      }

    // If query is not an exact keyword in the account yet, we'll add it
    if(exactKeywords.indexOf(row["Query"]) < 0){

      if(queriesToBeAdded[row["Query"]] == null){
        queriesToBeAdded[row["Query"]] = [];
      }
      queriesToBeAdded[row["Query"]].push(row["Query"], row["AdGroupId"]);

    }

  } // rowIterator

  if(config.LOG === true){
    Logger.log("------------------------");
    Logger.log("Found " + Object.keys(queriesToBeAdded).length + " keywords to be added");
    Logger.log("------------------------");
    Logger.log(" ");
  }

  // Add Keywords
  for (var key in queriesToBeAdded) {

    var adGroupId = [];
    adGroupId.push(queriesToBeAdded[key][1])

    var adGroupIterator = AdsApp
      .adGroups()
      .withIds(adGroupId)
      .get();

    while(adGroupIterator.hasNext()){
      var adGroup = adGroupIterator.next();
      
        adGroup.adParams()
      
      var keywordOperation = adGroup
        .newKeywordBuilder()
        .withText("["+queriesToBeAdded[key][0]+"]")
        .build();
      
      var keyword = keywordOperation.getResult();
      
        if(config.LOG === true){
          Logger.log("Put " + keyword.getText() + " in " + adGroup.getName());
        }        

    } // adGroupIterator


  } // keywordIterator

} // function main()

////////////////////////////////////////////////////////////////////

function last_n_days(n) {

	var	from = new Date(), to = new Date();
	to.setUTCDate(from.getUTCDate() - n);

	return google_date_range(from, to);

} // function last_n_days()

////////////////////////////////////////////////////////////////////

function google_date_range(from, to) {

	function google_format(date) {
		var date_array = [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()];
		if (date_array[1] < 10) date_array[1] = '0' + date_array[1];
		if (date_array[2] < 10) date_array[2] = '0' + date_array[2];

		return date_array.join('');
	}

	var inverse = (from > to);
	from = google_format(from);
	to = google_format(to);
	var result = [from, to];

	if (inverse) {
		result = [to, from];
	}

	return result.join(',');

} // function google_date_range()

////////////////////////////////////////////////////////////////////

function getKeywords(){
  
    if(config.LOG === true){
      Logger.log("Start collecting keywords");
    }

  var keywords = [];

  var keywordIterator = AdsApp
    .keywords()
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .withCondition("Status != REMOVED")
    .withCondition("KeywordMatchType = EXACT")
    .get();

  while(keywordIterator.hasNext()){
    var keyword = keywordIterator.next();
    keywords.push(keyword.getText());
  } // keywordIterator
  
    if(config.LOG === true){
      Logger.log("Collected " + keywords.length + " exact keywords");
      Logger.log(" ");
    }

  return keywords;

} // function getKeywords
Show whole script!
Loading Comments
The Experts
Tibbe van Asten Team Lead Performance Marketing
Nils Rooijmans Water Cooler Topics
Martijn Kraan Freelance PPC Specialist
Bas Baudoin Teamlead SEA @ Happy Leads
Jermaya Leijen Digital Marketing Strategist
Krzysztof Bycina PPC Specialist from Poland
How about you? JOIN US!
Sharing Knowledge
Caring

Adsscripts.com staat voor het delen van kennis. In de huidige markt houden SEA-specialisten de kennis en ervaring graag voor zich. Wij zijn er van overtuigd dat het delen van kennis ervoor kan zorgen dat iedereen beter wordt in haar of zijn werk. Daarom lopen wij hier graag in voorop, door onze kennis over scripts te delen met iedereen.

Wil jij ook graag een bijdrage leveren? Wij staan open voor nieuwe ideeën en feedback op alles wat je op Adsscripts.com vindt.

Neem contact op

Training &
Workshop
Neem contact op!
Adsscripts Training & Workshop