IMAG0459

AdWords: So holen Sie sich Exact Match zurück

Als Google beschloss, Exact Match aus AdWords rauszunehmen, geschah dies (zumindest laut Google) zu „unserem Besten“.

Nimmt man die exakte Schreibweise [fotograf] her, dann ist jedem klar, dass dies etwas anderes ist, als [fotografie], in der deutschen Schreibweise zudem auch noch zu differenzieren mit [Photograph] oder [Fotograph] und [Fotographie] bzw. [Photographie].

Nun, was Google mit der Entscheidung wollte, war genau diese Schreibprobleme zu beseitigen, denn lt. Google sind 7% aller Suchanfragen nicht richtig geschrieben (was mich persönlich zugegebener Maßen verwundert, dass es lediglich 7% sein sollen).

Auf den ersten Blick ist klar, dass ein professioneller Fotograf nicht für das Suchwort „Fotografie“ gefunden werden will (Anm.: Suche einer Dienstleistung vs. Suche nach einem Produkt zum download, z.B. als Bildschirmhintergrund). Ebenso lässt sich annehmen, dass der Begriff Photograph wohl eher von älteren, solventen Personen eingegeben wird, da es sich dabei um ein Wort handelt, das vor der Rechtschreibreform primär verwendet wurde und noch heute häufig verwendet wird (stellt es doch die alternative Schreibweise dar).

Photograph statt Fotograph

Google zeigt 8,9 Mio. Treffer allein auf deutschen Webseiten für die „alternative“ Schreibweise Photograph

Die Folge daraus ist, dass die „Vereinfachung“, die Google bei der Entscheidung über „Exact Match“ verfolgt, wohl am ehesten eine Entscheidung hinsichtlich des eigenen Geldbeutels ist, denn klar ist, wenn [Fotograf] nicht mehr funktioniert, dann erhält dieser AdWords-Betreibende auch zahlreiche Klicks durch das Wort [Fotografie] – und bezahlt diese Klicks letztlich an Google.

 

Fotograf - AdWords Kosten

Kosten für die verschiedenen Worte zeigt deutlich, welche Klickkosten durch diese Änderung seitens Google auf den User zukommt.

Der Fotograf sieht sich also konfrontiert, mit 22.200 potenziellen „Klickern“ pro Monat zu jeweils 1,09€, während sein eigentliches Keyword bei 18.100 potenziellen „Klickern“ bei lediglich 0,88€ liegt. Es ist also davon auszugehen, dass sein bisheriges Budget in der Hälfte der Zeit aufgebraucht ist – oder umgekehrt, dass er pro Tag nur noch halb so lange sichtbar wird.

Ohne eine Erhöhung des Budgets wird die Anzahl der Anfragen zweifellos zurückgehen.

Eine Abhilfe schafft das nachstehende Skript von Daniel Gilbert, Market Development bei Brainlabs und ehemaliger Google-Mitarbeiter. Sein originaler Artikel findet sich unter dem Link bei Searchengineland.

Lesen Sie auch  Daten richtig analysieren

Das Skript gibt Suchworte aus, die basierend auf dem AdWords-Konto, die „ähnlichen Begriffe“ als exakte Negativbegriffe ausgibt, sofern diese nicht mit dem ursprünglich eingegebenen Suchwort übereinstimmen.

/**
 *
 * Adds as campaign or AdGroup negatives search queries which have triggered exact keywords
 * Version: 1.0 - maintained AdWords script on brainlabsdigital.com
 * Authors: Visar Shabi & Daniel Gilbert
 * brainlabsdigital.com
 *
 **/
function main() {
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Options
  
  //Choose whether to add your negative exact keywords at campaign or AdGroup level.
  //Set variable as "true" to add or as "false" to not add.
  var AddAdGroupNegative = true;  // true or false
  var AddCampaignNegative = true; // true of false
  
  //Parameters for filtering by campaign name and AdGroup name. The filtering is case insensitive.
  //Leave blank, i.e. "", if you want this script to run over all campaigns and AdGroups.
  var campaignNameContains = "";
  var adGroupNameContains = "";
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  
  var campaigns = {};
  var adGroups = {};
   
  var exactKeywords = [];
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Pull a list of all exact match keywords in the account
  
  var report = AdWordsApp.report(
    "SELECT AdGroupId, Id " +
    "FROM KEYWORDS_PERFORMANCE_REPORT " +
    "WHERE Impressions > 0 AND KeywordMatchType = EXACT " +
    "DURING LAST_7_DAYS");
  
  var rows = report.rows();
  while (rows.hasNext()) {
    var row = rows.next();
    var keywordId = row['Id'];
    var adGroupId = row['AdGroupId'];
    exactKeywords.push(adGroupId + "#" + keywordId);
  }
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Pull a list of all exact (close variant) search queries
  
  var report = AdWordsApp.report(
    "SELECT Query, AdGroupId, CampaignId, KeywordId, KeywordTextMatchingQuery, Impressions, MatchType " +
    "FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
    "WHERE CampaignName CONTAINS_IGNORE_CASE '" + campaignNameContains + "' " +
    "AND AdGroupName CONTAINS_IGNORE_CASE  '" + adGroupNameContains + "' " +
    "DURING LAST_7_DAYS");
  
  var rows = report.rows();
  while (rows.hasNext()) {
    var row = rows.next();
    var adGroupId = parseInt(row['AdGroupId']);
    var campaignId = parseInt(row['CampaignId']);
    var keywordId = parseInt(row['KeywordId']);
    var searchQuery = row['Query'];
    var keyword = row['KeywordTextMatchingQuery'];
    var matchType = row['MatchType'].toLowerCase();
    if(keyword !== searchQuery && matchType.indexOf("exact (close variant)") !== -1){
      
      if(!campaigns.hasOwnProperty(campaignId)){
        campaigns[campaignId] = [[], []];
      }
      
      campaigns[campaignId][0].push(searchQuery);
      campaigns[campaignId][1].push(adGroupId + "#" + keywordId);
      
      if(!adGroups.hasOwnProperty(adGroupId)){
        adGroups[adGroupId] = [[], []];
      }
      
      adGroups[adGroupId][0].push(searchQuery);
      adGroups[adGroupId][1].push(adGroupId + "#" + keywordId);
    }
  }
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Parse data correctly
  
  var adGroupIds = [];
  var campaignIds = [];
  var adGroupNegatives = [];
  var campaignNegatives = [];
  
  for(var x in campaigns){
    campaignIds.push(parseInt(x));
    campaignNegatives.push([]);
    for(var y = 0; y < campaigns[x][0].length; y++){
      var keywordId = campaigns[x][1][y];
      var keywordText = campaigns[x][0][y];
      if(exactKeywords.indexOf(keywordId) !== -1){
        campaignNegatives[campaignIds.indexOf(parseInt(x))].push(keywordText);
      }
    }
  }
  
  for(var x in adGroups){
    adGroupIds.push(parseInt(x));
    adGroupNegatives.push([]);
    for(var y = 0; y < adGroups[x][0].length; y++){
      var keywordId = adGroups[x][1][y];
      var keywordText = adGroups[x][0][y];
      if(exactKeywords.indexOf(keywordId) !== -1){
        adGroupNegatives[adGroupIds.indexOf(parseInt(x))].push(keywordText);
      }
    }
  }
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Create the new negative exact keywords
  
  var campaignResults = {};
  var adGroupResults = {};
  
  if(AddCampaignNegative){
    var campaignIterator = AdWordsApp.campaigns()
    .withIds(campaignIds)
    .get();
    while(campaignIterator.hasNext()){
      var campaign = campaignIterator.next();
      var campaignId = campaign.getId();
      var campaignName = campaign.getName();
      var campaignIndex = campaignIds.indexOf(campaignId);
      for(var i = 0; i < campaignNegatives[campaignIndex].length; i++){
        campaign.createNegativeKeyword("[" + campaignNegatives[campaignIndex][i] + "]")
        if(!campaignResults.hasOwnProperty(campaignName)){
          campaignResults[campaignName] = [];
        }
        campaignResults[campaignName].push(campaignNegatives[campaignIndex][i]);
      }
    }
  }
  
  if(AddAdGroupNegative){
    var adGroupIterator = AdWordsApp.adGroups()
    .withIds(adGroupIds)
    .get();
    while(adGroupIterator.hasNext()){
      var adGroup = adGroupIterator.next();
      var adGroupId = adGroup.getId();
      var adGroupName = adGroup.getName();
      var adGroupIndex = adGroupIds.indexOf(adGroupId);
      for(var i = 0; i < adGroupNegatives[adGroupIndex].length; i++){
        adGroup.createNegativeKeyword("[" + adGroupNegatives[adGroupIndex][i] + "]");
        if(!adGroupResults.hasOwnProperty(adGroupName)){
          adGroupResults[adGroupName] = [];
        }
        adGroupResults[adGroupName].push(adGroupNegatives[adGroupIndex][i]);
      }
    }
  }
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Format the results
  
  var resultsString = "The following negative keywords have been added to the following campaigns:";

  for(var x in campaignResults){
    resultsString += "nn" + x + ":n" + campaignResults[x].join("n");
  }
  
  resultsString += "nnnnThe following negative keywords have been added to the following AdGroups:";
  
  for(var x in adGroupResults){
    resultsString += "nn" + x + ":n" + adGroupResults[x].join("n");
  }
  
  Logger.log(resultsString);
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  
}

Das Skript kann im MCC-Level für alle Accounts genutzt werden, genauso aber auch für einzelne Accounts oder individuelle Kampagnen bzw. AdGroups. (MCC = My Client Center von Google AdWords)

Einfach das Skript kopieren, in AdWords einloggen und „Bulk Operations > Scripts > New“. Dort das Skript mit Copy & Paste einfügen und dann auf „Preview“ klicken. Dann erhält man alle Informationen über die Änderungen, die es durchführen wird, wenn man es nutzt.

Wenn man das Skript täglich nutzt (kann automatisiert werden), bringt es das Ergebnis einer [exact match] wieder zurück.

Zwei Einschränkungen bestehen bei dem Skript allerdings:

  1. „Other Search Terms“, also die weiteren (bzw. anderen) Suchbegriffe, können nicht inkludiert werden, da diese von Google nicht (mehr) genannt werden.
  2. Die Informationen im AdWords-Bericht sind immer einen Tag alt. Das bedeutet, dass die Ergebnisse mit dem Skript auch immer einen Tag „hintendran“ sind.
Lesen Sie auch  Kein Penguin sondern Search Quality Update

Beides halte ich aber für vernachlässigbar im Vergleich zur sonstigen Alternative.

Wer noch nie mit AdWords-Skripts gearbeitet hat, findet hier eine gute Ressource.

follow me

Ralf Seybold

Sichtbar statt SEO.

Inhaber bei SEYBOLD - Agentur für Sichtbarkeit, Begründer des Sichtbarkeitsmanagements, IT Professional seit 1989, Internet Professional seit 1998

Top 100 SEO Dienstleister

Autor verschiedener Publikationen, regelmäßig Experte bei IMPULSE - Das Unternehmermagazin, Experte bei Website Boosting,

Verschiedene Preise und Auszeichnungen für Dienstleistungen und Produkte

Verfügbar als Consultant, Dienstleister und fürSeminare, Vorträge
follow me