Zurzeit sind 2.6K Mitglieder online.
Willkommen im Bereich 'Lernen' der offiziellen Google Advertiser Community
star_border

Automatische Kampagnenoptimierung Teil 3: Shopping

Serie: „automatische Kampagnenoptimierung“
Zielgruppe: fortgeschrittene AdWords-Nutzer und Kampagnen-Manager

 

In dieser Serie will ich einen kleinen Einblick in die Verwendung von AdWords-Scripts und anderen Google-Tools geben, mit denen man bei Erstellung, Reporting, Analyse und Optimierung von AdWords-Kampagnen viel Zeit sparen und neue Erkenntnisse gewinnen kann.

 

Teil 1: Wie kann ich den Qualitätsfaktor verbessern?
Teil 2: Wie kann ich die Leistung meiner Kampagne verbessern?
> Teil 3: Wie kann ich meine Shopping-Kampagne optimieren?
Teil 4: Wie kann ich meine Landing-Page optimieren?

 

Teil 3: Wie kann ich meine Shopping-Kampagne optimieren?


Hinweis: Ich habe die Beispiel-Scripte im Rahmen dieser Einführung bewusst so einfach wie möglich gehalten. Optimierte MCC-Scripte im produktiven Einsatz haben dagegen oft einige hundert Programmzeilen.
Achtung! Die Scripte in diesem Beitrag nehmen Änderungen an den Kampagnen vor. Wer diese Scripte ausführen will, sollten immer zunächst die „Vorschau“ verwenden und die Ergebnisse prüfen. Die Nutzung dieser Scripte erfolgt auf eigene Verantwortung und Gefahr. Ich gebe keinerlei Garantie für die Verwendung dieser Beispiel-Scripte.

 

Kosten pro Conversion automatisch aussteuern

Ähnlich wie bei Kampagnen für das Suchnetzwerk lassen sich auch in Shopping-Kampagnen die Kosten pro Conversion automatisch aussteuern.

 

Wir verwenden dazu wieder die Formel:

 

CpcBid = Ziel-CPA * ConversionRate

 

Die Erklärung, wie es zu dieser Formel kommt, steht im vorigen Beitrag dieser Reihe:
https://www.de.advertisercommunity.com/t5/Artikel-von-unseren-Experten/Automatische-Kampagnenoptimie...

 

 

Einfaches AdWords-Script zur Einstellung des Ziel-CPA in einer Shopping-Kampagne auf Produktgruppen-Ebene:

 

function main(){			
	var zielCpa = 20;//hier Ziel-CPA einstellen
	var dateRange = 'LAST_30_DAYS';//hier Zeitraum einstellen
	var minClicks = 100;//hier Mindestanzahl für Klicks einstellen
	var minConversions = 5;//hier Mindestanzahl für Conversions einstellen

	var productGroups = AdWordsApp.productGroups()
	.withCondition('CampaignStatus = "ENABLED"')
	.withCondition('AdGroupStatus = "ENABLED"')
	.withCondition('Clicks >= "' + minClicks + '"')
	.withCondition('Conversions >= "' + minConversions + '"')
	.forDateRange(dateRange)
	.get();	
	while (productGroups.hasNext()) {
		var productGroup = productGroups.next();
		var conversions = productGroup.getStatsFor(dateRange).getConversions();
		var clicks = productGroup.getStatsFor(dateRange).getClicks();
		var cpcNew = Math.round(zielCpa * (conversions/clicks)*100)/100;
		productGroup.setMaxCpc(cpcNew);
	}
}

Bildschirmfoto vom 2017-01-31 15-14-44.png

 

 

Auch dieses Script sollte individuell angepasst werden, bevor es im produktiven Umfeld eingesetzt wird. Tipps dazu finden sich ebenfalls im vorigen Beitrag:

https://www.de.advertisercommunity.com/t5/Artikel-von-unseren-Experten/Automatische-Kampagnenoptimie...

 

Dieses Script kann zwar auch eingesetzt werden, wenn es in einer Shopping-Kampagne nur die Produktgruppe „Alle Produkte“ gibt. Es liefert aber wesentlich bessere Ergebnisse, wenn die Produktgruppen-Hierarchie zuvor granularer eingestellt wird.

 

Die Produktgruppen-Hierarchie kann man von Hand über die Web-Oberfläche erstellen. Aber das kann je nach Tiefe und Anzahl der Produkte schnell zu einer aufwändigen Sache werden. Insbesondere dann, wenn die Artikel häufig wechseln.

 

Mit einem AdWords-Script lässt sich die Sache automatisieren.

 

AdWords-Script zur Unterteilung der Produktgruppen nach Marke und Produkt-ID:

  

Zunächst iterieren wir durch die vorhandenen Shopping-Kampagnen:

 

	var campaignIterator = AdWordsApp.shoppingCampaigns()
	.get();
	while (campaignIterator.hasNext()) {
		var campaign = campaignIterator.next();
		Logger.log(campaign.getName());

 

Sollen nur bestimmte Kampagnen bearbeitet werden, muss noch eine Condition hinzugefügt werden. z.B.:

 

	...
	.withCondition("CampaignName = '" + campaignName + "'")
	...

 

Dann iterieren wir durch alle vorhandenen Anzeigengruppen der jeweiligen Shopping-Kampagne:

 

		var adGroupIterator = campaign.adGroups()
		.get();
		while (adGroupIterator.hasNext()) {
			var adGroup = adGroupIterator.next();
			Logger.log(adGroup.getName());

 

Sollen nur bestimmte Anzeigengruppen bearbeitet werden, muss noch eine Condition hinzugefügt werden. z.B.:

 

	...
	.withCondition("CampaignName = '" + adGroupName + "'")
	...

 

Danach entfernen wir alle in dieser Anzeigengruppe bestehenden Produktguppen. Das ist notwendig, damit es anschließend keine Fehlermeldungen wegen bereits vorhandener Produktgruppen gibt. Im Gegensatz zu Änderungen bei Anzeigen und Keywords gehen dadurch die historischen Leistungsdaten der Produkte innerhalb dieser Anzeigengruppe nicht verloren. Das gilt allerdings nicht für die jeweils manuell eingestellten Klickpreise. Was aber kein Problem ist, wenn sie anschließend mit dem obigen Script neu eingestellt werden sollen.

 

			var root = adGroup.rootProductGroup();
			root.removeAllChildren();

 

Da es in AdWords-Scripts leider keinen Iterator über die Produktdaten selbst gibt, müssen diese Daten über einen Umweg beschafft werden. Mann kann dazu über die erweiterte API „Shopping-Content“ auf das Merchant-Center und das Shopping-Feed zugreifen. Das klappt allerdings nur, wenn dieses über dasselbe Login wie das AdWords-Konto erreicht werden kann, was häufig nicht der Fall ist.

 

Hier gibt es eine Anleitung dazu (englisch):
https://developers.google.com/apps-script/advanced/shopping-content?hl=de

 

Eine weitere Alternative ist, die Produktgruppen-Hierarchie in einem Google-Spreadsheet zu erstellen und dann über das Script auszulesen oder das Shopping-Feed direkt vom eigenen Server abzurufen und dann zu verarbeiten.

 

Für ersteres gibt es eine komplizierte Lösung von Google selbst:
https://developers.google.com/adwords/scripts/docs/solutions/bulk-shopping-ad-group-creator

 

Mit einem kleinen Trick geht es aber auch einfacher. Und vollautomatisch. Dazu rufen wir einfach einen „ SHOPPING_PERFORMANCE_REPORT“ ab:

 

			var report = AdWordsApp.report(
		  	'SELECT Brand, OfferId ' +
		  	'FROM   SHOPPING_PERFORMANCE_REPORT ' +
		  	'WHERE  CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" ' +
		  	'DURING LAST_30_DAYS');//hier Zeitraum einstellen
			var rows = report.rows();

 

...und schreiben die gefundenen Daten in ein mehrdimensionales JavaScript-Objekt:

 

			var brands = {};
	  		while (rows.hasNext()) {
				var row = rows.next();
				var brand = row['Brand'];
				var offerId = row['OfferId'];
				if (! brands[brand]){
					brands[brand] = {};
				}
				if (! brands[brand][offerId]){
					brands[brand][offerId] = {};
				}
			}

 

Vorteil (oder Einschränkung): In diesem Report erscheinen nur Produkte, die im Report-Zeitraum mindestens eine Impression erhalten haben. Daher werden auf diese Weise auch nur für diese Produkte Produktgruppen erzeugt. Wer will, kann das natürlich auch noch weiter einschränken und z.B. nur für Produkte mit einer bestimmten Anzahl an Klicks oder Conversions Produktgruppen erzeugen lassen.

 

Da man das Script jederzeit (bis hinunter zu stündlich) erneut laufen lassen kann, kann die Hierarchie dadurch laufend angepasst werden.

 

Wenn nur bestimmte Kampagnen oder Anzeigengruppen berücksichtigt werden sollen, sollte dieser Report entsprechend angepasst werden. Z.B. so:

 

...
		  	'SELECT Brand, OfferId ' +
		  	'FROM   SHOPPING_PERFORMANCE_REPORT ' +
		  	'WHERE  CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" ' +
			'AND CampaignName = "' + campaignName + '" AND AdGroupName = "' + adGroupName + '" ' + 
...

 

Anschließend iterieren wir über das JavaScript-Objekt und erzeugen erst die Produktgruppe für die Marke:

 

			for (var brand in brands){
				var productGroup = root.newChild()
				.brandBuilder()
				.withName(brand)
				.build()			
				.getResult();

 

... und danach unterhalb dieser Marke die jeweiligen Untergruppen für die passenden Produkt-IDs:

 

 

				for (var offerId in brands[brand]){
					productGroup.newChild()
					.itemIdBuilder()
					.withValue(offerId)
					.build();
				}
			}

 

Natürlich kann man die Produkte nicht nur nach Marke, sondern z.B. auch nach dem Produkt-Typ, der Kategorie, oder benutzerdefinierten Labels unterteilen.

 

Hier eine Übersicht über den „ ProductGroupBuilderSpace“:
https://developers.google.com/adwords/scripts/docs/reference/adwordsapp/adwordsapp_productgroupbuild...

 

Das war es schon. Und hier nochmal das komplette Beispiel-Script an einem Stück:

 

function main() {
	var campaignName = "Kampagne";//hier Kampagnenname angeben
	var adGroupName = "Alle Produkte";//hier Anzeigengruppenname angeben
	var campaignIterator = AdWordsApp.shoppingCampaigns()
	.withCondition("CampaignName = '" + campaignName + "'")
	.get();
	while (campaignIterator.hasNext()) {
		var campaign = campaignIterator.next();
		Logger.log(campaign.getName());
		var adGroupIterator = campaign.adGroups()
		.withCondition("AdGroupName = '" + adGroupName + "'")
		.get();
		while (adGroupIterator.hasNext()) {
			var adGroup = adGroupIterator.next();
			Logger.log(adGroup.getName());
			var root = adGroup.rootProductGroup();
			root.removeAllChildren();
			var report = AdWordsApp.report(
		  	'SELECT Brand, OfferId ' +
		  	'FROM   SHOPPING_PERFORMANCE_REPORT ' +
		  	'WHERE  CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" ' +
			'AND CampaignName = "' + campaignName + '" AND AdGroupName = "' + adGroupName + '" ' + 
		  	'DURING LAST_30_DAYS');//hier Zeitraum für Report einstellen
			var rows = report.rows();
			var brands = {};
	  		while (rows.hasNext()) {
				var row = rows.next();
				var brand = row['Brand'];
				var offerId = row['OfferId'];
				if (! brands[brand]){
					brands[brand] = {};
				}
				if (! brands[brand][offerId]){
					brands[brand][offerId] = {};
				}
			}			
			for (var brand in brands){
				var productGroup = root.newChild()
				.brandBuilder()
				.withName(brand)
				.build()			
				.getResult();
				for (var offerId in brands[brand]){
					productGroup.newChild()
					.itemIdBuilder()
					.withValue(offerId)
					.build();
				}	
			}
		}
	}
}

Bildschirmfoto vom 2017-01-31 19-10-35.png

 


Als MCC-Script verwenden:


Wer das Script in seinem MCC-Account laufen lassen will, findet hier Beispiele und Code-Snippets:
https://developers.google.com/adwords/scripts/docs/examples/mcc-scripts

 

 

Zeitplan erstellen


AdWords-Scripte lassen sich automatisch in Intervallen bis hinunter zu „stündlich“ ausführen.
Dazu in der Script-Übersicht neben dem Button „Ausführen“ auf „+ Zeitplan erstellen“ klicken.

 

Beispiel: Script soll „Täglich um 00 Uhr“ ausgeführt werden: 

 

Zeitplan_Script.png

 

 

 

 

 

 

 

 

 

 

Ressourcen


Einstieg in JavaScript
https://www.google.de/search?q=learn+javascript

 

Einstieg in AdWords-Scripts:
https://developers.google.com/adwords/scripts/?hl=de

 

Leitfäden zur Nutzung von AdWords-Scripts:
https://developers.google.com/adwords/scripts/docs/your-first-script?hl=de

 

AdWords-Script CodeSnippets:
https://developers.google.com/adwords/scripts/docs/examples/?hl=de

 

AdWords-Scripts Best Practices:
https://developers.google.com/adwords/scripts/docs/best-practices

 

0 Gefällt mir
Info Matthias Baader

Beschriftungen