MCC übergreifender Keyword-Bericht mit AdWords Scripts

Screen Java Console Execution

Zur manuellen Kontooptimierung in Google AdWords gehört selbstredend auch die händische Analyse/Optimierung der Anzeigen und Keywords im AdWords Frontend. Erfahrene Account Manager verwenden hierfür vorbereitete Filteransichten und wissen aus dem Stegreif, nach welchen KPIs sie bei der Analyse gehen und ab welchen Schwellenwerten sie optimieren anfangen.

Bei einem Multi Customer Center (MCC) mit vielen Unterkonten nimmt hierbei allein die Navigation und Analyse schon relativ viel Zeit in Anspruch. Mithilfe von AdWords Scripts und Google Docs, bzw. Google Tables könnt Ihr Euch die Performance-Daten der wichtigsten Keywords aller Konten täglich automatisiert in ein zentrales Google Spreadsheet schreiben lassen und Euch so eine Menge Zeit sparen.

In meinem Beispiel-Script werden je Google Account die Performance-Daten aller (gebuchten) Keywords ermittelt, die gestern, in den letzten sieben Tagen und/oder in den letzten 30 Tagen ein relevantes Volumen vom Umsatz, den Kosten, den Impressionen oder den Klicks generiert haben.

Das vollständige Beispiel-Script könnt Ihr Euch unter folgendem Link herunterladen:

In nachfolgendem Tutorial möchte ich Euch zeigen, wie das Script im Detail aufgebaut ist und funktioniert. So findet Ihr leicht die relevanten Stellen, um das Script an Eure Bedürfnisse anzupassen.

1. Funktion main() / Account Selector / Parallele Ausführung

Die Hauptfunktion des Scripts übernimmt die Auswahl der zu durchlaufenden Konten und dient als Trigger für die gleichzeitige Ausführung des Report-Scripts in allen ausgewählten Konten.

Zum Test des Scripts könnt Ihr ein oder mehrere Konten (Komma separiert) mit dem Filter .withIds auswählen. Wenn Ihr fertig getestet habt, könnt Ihr den ID-Filter auskommentieren und die hier noch auskommentierten Filter ggf. Euren Wünschen entsprechend anpassen und aktivieren:

function main() {
  var accountSelector = MccApp.accounts()
        .withIds(['123-456-7890']);
//        .withCondition("Clicks > 1")
//        .forDateRange("LAST_30_DAYS");
  
  accountSelector.executeInParallel("processClientAccount");
}

2. Funktion processClientAccount() / Spreadsheet / Schwellenwerte / Zeitspannen

Diese Funktion dient als Container aller Funktionen, die JE Account ausgeführt werden sollen. Sie wird von der zuvor beschriebenden Funktion main() parallel für alle ausgewählten Konten angestartet/ausgeführt.

In der Funktion processClientAccount() wird die URL zur Google Spreadsheet-Datei angegeben, sowie die Schwellenwerte für die auszuwertenden Keywords und die Zeitspannen für die zu ermittelnden Performance Daten definiert. Der Schwellenwert für die Kosten muss entsprechend der in AdWords vorliegenden Kostendaten in Micros angegeben (1.000.000.000:1).

In dem hier beschriebenen Beispiel wird jeweils 1% als Schwellwert für Umsatz, Kosten, Impressionen und Klicks verwendet. Im Report erscheinen also nur Keywords, die im jeweils ausgewerteten Zeitraum mindestens 1% der jeweiligen Gesamtsumme generiert haben.

function processClientAccount() {
  var clientAccount = AdWordsApp.currentAccount();

  SPREADSHEET_URL = '[YOUR_SPREADSHEET_URL]';
  var tab = clientAccount.getName() + " KW";
  var thresholdRev = 0.01;
  var thresholdCost = 10000000;
  var thresholdImp = 0.01;
  var thresholdClicks = 0.01;
  var export = [];
  var ranges = {
    "30D" : "LAST_30_DAYS",
    "7D" : "LAST_7_DAYS",
    "1D" : "YESTERDAY"
  }
  
  for ( var index in ranges ) {
    var range = ranges[index];
    var rangeTXT = index;
    getCurrentAccountDetails(range,rangeTXT);
    writeToSpreadsheet(tab,export);
  }

  [REPORT FUNCTIONS AND HELPER FUNCTIONS HERE]

}

3. Funktion getCurrentAccountDetails() / Auswertung je Konto und Zeitraum

Diese Sammelfunktion initiiert für jede definierte Zeitspanne die einzelnen Auswertungen mit den jeweils notwendigen Parametern. Zuerst werden die Performance-Daten des jeweiligen Kontos für den Auswertungszeitraum abgerufen. Anschließend werden die Auswertungen auf Keyword-Ebene mit denselben Parametern initiiert.

function getCurrentAccountDetails (range,rangeTXT) {
  var report = AdWordsApp.report(
     "SELECT AccountDescriptiveName, Impressions, Clicks, Ctr, Cost, AverageCpc, Conversions, ConversionRate, CostPerConversion, ConversionValue, ValuePerConversion " +
     "FROM ACCOUNT_PERFORMANCE_REPORT " + "DURING " + range
     );
    var rows = report.rows();
    while (rows.hasNext()) {
    var row = rows.next();
    row["Criteria"] = "ACCOUNT";
    row["Type"] = "TOTAL";
    row["Range"] = rangeTXT;
    row["ConversionValue"] = parseFloat(row["ConversionValue"].replace(/,/,""));
    row["CostOfSales"] = parseFloat(row["Cost"]) / parseFloat(row["ConversionValue"]);
    export.push(row);
    }
  getKWbyCost(Math.round(parseFloat(row["Cost"])*thresholdCost),range,rangeTXT);
  getKWbyRevenue(Math.round(parseFloat(row["ConversionValue"])*thresholdRev),range,rangeTXT);
  getKWbyImpressions(Math.round(row["Impressions"]*thresholdImp),range,rangeTXT);
  getKWbyClicks(Math.round(row["Clicks"]*thresholdClicks),range,rangeTXT);
}

4. Funktion getKWbyCost() / Auswertung Keywords je Zeitraum

Ergänzend zu der initiierenden Funktion getCurrentAccountDetails() werden hier die Performance Daten der Keywords ermittelt, die im jeweiligen Zeitraum den definierten Schwellenwert überschritten haben.

function getKWbyCost(relCost,range,rangeTXT) {
  var report = AdWordsApp.report(
    "SELECT CampaignName, AdGroupName, Criteria, Impressions, Clicks, Ctr, Cost, AverageCpc, Conversions, ConversionRate, CostPerConversion, ConversionValue, ValuePerConversion " +
    "FROM   KEYWORDS_PERFORMANCE_REPORT " +
    "WHERE  Cost > " + relCost + " DURING " + range );
  var rows = report.rows();
  while (rows.hasNext()) {
    var row = rows.next();
    row["Type"] = "COST";
    row["Range"] = rangeTXT;
    row["Cost"] = parseFloat(row["Cost"].replace(/,/,""));
    row["ConversionValue"] = parseFloat(row["ConversionValue"].replace(/,/,""));
    row["CostOfSales"] = parseFloat(row["Cost"]) / parseFloat(row["ConversionValue"]);
    row["Percentage"] = row["Cost"] / (relCost/thresholdCost) / 1000;
    export.push(row);
  }
}

Die Funktionen getKWbyRevenue(),getKWbyImpressions() und getKWbyClicks() folgen demselben Modell.

5. Helper-Funktion getSheet() / Spreadsheet öffnen oder erstellen

Diese Hilfsfunktion öffnet bei der Verarbeitung das bestehende Tabellenblatt für das jeweilige AdWords Konto oder erstellt ein neues Sheet dafür.

function getSheet(tab) {
  var s_sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet;
  try {
    sheet = s_sheet.getSheetByName(tab);
    if(!sheet) {
      sheet = s_sheet.insertSheet(tab, 0);
    }
  } catch(e) {
    sheet = s_sheet.insertSheet(tab, 0);
  }
  return sheet
}

6. Helper-Funktion convertRowsToSpreadsheetRows() / Formatiert die Daten für den Export

function convertRowsToSpreadsheetRows(tab,rows) {
  var cols = getColumns(tab);
  var ret_val = [cols];
  for(var i in rows) {
    var r = rows[i];
    var ss_row = [];
    for(var x in cols) {
      ss_row.push(r[cols[x]]);
    }
    ret_val.push(ss_row);
  }
  return ret_val;
}

7. Helper-Funktion writeToSpreadsheet() / Schreibt die Export-Daten ins Spreadsheet

function writeToSpreadsheet(tab,rows) {
  var to_write = convertRowsToSpreadsheetRows(tab,rows);
  var s_sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = getSheet(tab);
  sheet.clear();
   
  var numRows = sheet.getMaxRows();
  if(numRows < to_write.length) {
    sheet.insertRows(1,to_write.length-numRows); 
  }
  var range = sheet.getRange(1,1,to_write.length,to_write[0].length);
  range.setValues(to_write);
}

Feedback

Ich freue mich auf Euer Feedback und bin für Anregungen, Verbesserungsvorschläge und Korrekturen sehr dankbar.

Wenn es Euch gefällt, hätte ich auch noch ein Script zur Auswertung der (tatsächlichen) Suchanfragen parat – selbstverständlich inklusive einer extra Spalte für den verwendeten Übereinstimmungstyp. Damit überseht Ihr auch bei vielen Unterkonten nicht die neu hinzugekommen, volumenrelevanten Suchanfragen.

Herzliche Grüße,
Richard