Cover Image
Trutz Fries

Amazon Bulk-Operationen mit Python & Pandas meistern

22.07.2022 • Lesezeit: ca. 11 min • von Trutz Fries
  1. Was sind Amazon Advertising Bulk-Operationen?
    1. So funktioniert der manuelle Bulk-Sheet-Workflow
  2. Wie sieht die perfekte Kampagnenstruktur aus?
    1. Die 5 essentiellen Kampagnentypen für maximalen Erfolg
    2. Warum separate Kampagnentypen essentiell sind
  3. Wie erstelle ich ein neues Bulk Sheet mit Python?
    1. Voraussetzungen für die Automatisierung
    2. Schritt 1: Variablen einrichten
    3. Schritt 2: Externe Datenquellen einbinden
    4. Schritt 3: Kampagnen-Erstellungsmethoden definieren
    5. Schritt 4: Hauptskript ausführen
    6. Schritt 5: Excel-Export für Amazon
  4. Fazit: Zeit sparen mit Python-Automatisierung
    1. Nächste Schritte für Ihre Kampagnen-Automatisierung
    2. Benötigen Sie Hilfe bei der Kampagnen-Automatisierung?

Dieser Artikel zeigt Ihnen, wie Sie mit Python und Pandas automatisiert Amazon Bulk Sheets erstellen, um hunderte Werbekampagnen in wenigen Minuten zu generieren - statt stundenlanger manueller Arbeit.

Was sind Amazon Advertising Bulk-Operationen?

Amazon Advertising Bulk Operationen, auch Bulk Sheets oder Sammelvorgänge genannt, sind Excel-Tabellen, die Ihre komplette Kampagnenstruktur enthalten, einschließlich der relevanten Leistungskennzahlen.

Sie können entweder neue Kampagnen erstellen oder bestehende Kampagnen mit Bulk Sheets aktualisieren.

Die Seite, auf der Sie Bulk Sheets herunter- und hochladen können, finden Sie in der Amazon Advertising Console unter "Gesponsorte Anzeigen" / "Sammelvorgänge":

Amazon Advertising Console zeigt Bulk-Operationen Menü für Sammelvorgänge
Bulk-Operationen in der Amazon Advertising Console

Bulk Sheets sind besonders praktisch, wenn Sie z.B. mehrere Kampagnen erstellen oder aktualisieren wollen, ohne den gleichen Vorgang für jede Kampagne einzeln durchzuführen.

Nehmen wir an, Sie möchten das Budget für jede Ihrer 400 Sponsored Products-Kampagnen mit einem ACoS < 20 % um 10 % erhöhen. Zwar können Sie das problemlos in der Amazon-Werbekonsole machen, aber die Verwendung von Amazons Bulk Sheets ist wesentlich effizienter.

So funktioniert der manuelle Bulk-Sheet-Workflow

Sie verwenden Bulk Sheets folgendermaßen:

  1. Sie laden das aktuelle Bulk Sheet aus der Werbekonsole herunter
  2. Sie öffnen die Datei z.B. in Microsoft Excel und rufen das Arbeitsblatt "Gesponserte Produkte" auf
  3. Sie filtern nach den Kampagnen, die Sie bearbeiten möchten
  4. Sie verändern die Budgetspalte, indem Sie z.B. eine temporäre Spalte hinzufügen
  5. Sie speichern die Datei und laden sie erneut bei Amazon hoch

In diesem Artikel wollen wir uns allerdings nicht mit der Aktualisierung bestehender Kampagnen befassen, sondern mit der automatisierten Erstellung neuer Kampagnen mit Python.

Wie sieht die perfekte Kampagnenstruktur aus?

Eine gut strukturierte Kampagne ist der Schlüssel zu profitablem Amazon Advertising.

Die 5 essentiellen Kampagnentypen für maximalen Erfolg

Wir erstellen typischerweise die folgenden manuellen Sponsored Product Kampagnen:

  • Eine Kampagne mit generischen Keyword-Zielen (generisch bedeutet, dass die Keywords keinen Markennamen enthalten)
  • Eine Kampagne mit offensiven Keyword-Zielen (offensiv bedeutet, dass wir auf die Marken der Konkurrenz abzielen)
  • Eine Kampagne mit offensiven Produktzielen (d. h., wir zielen auf die Produkte der Konkurrenz ab)
  • Eine Kampagne mit defensiven Keyword-Zielen (defensiv bedeutet, dass wir auf Keywords abzielen, die unsere Marken- oder Produktnamen enthalten)
  • Eine Kampagne mit defensiven Produktzielen (d. h. wir zielen auf unsere Produkte ab)

Warum separate Kampagnentypen essentiell sind

Wir unterscheiden die Kampagnen, weil offensive, generische und defensive Kampagnen in der Regel sehr verschiedene Leistungskennzahlen aufweisen:

  • Defensive Kampagnen: Niedrigster ACoS (typisch: 5-15%), da Nutzer bereits nach Ihrer Marke suchen
  • Generische Kampagnen: Mittlerer ACoS (typisch: 15-30%), breite Zielgruppe ohne Markenbezug
  • Offensive Kampagnen: Höchster ACoS (typisch: 25-50%), da Sie gegen etablierte Marken konkurrieren

Das bedeutet, dass Sie für jeden Typ unterschiedliche Leistungsziele haben müssen. Wenn der ACoS Ihr Hauptziel ist, benötigen Sie für offensive Kampagnen höhere ACoS-Ziele als für defensive Kampagnen.

Packen Sie alle Ziele in eine Kampagne, dann haben Sie eine gemischte Tüte. Natürlich können Sie diese Kampagne z.B. auf Zielebene verwalten, aber wie würden Sie dann das Budget zuweisen? Wie würden Sie z.B. höhere Budgets für Ihre defensiven Kampagnen als für Ihre offensiven Kampagnen zulassen? Das wäre nicht möglich. Das ist ein weiterer Grund, warum wir Kampagnen aufteilen.

Die Erstellung von fünf Kampagnen für ein einziges Produkt bzw. für eine einzige Produktfamilie erfordert jedoch einige Arbeit. Und genau hier automatisieren wir die Dinge mit Python.

Wie erstelle ich ein neues Bulk Sheet mit Python?

Voraussetzungen für die Automatisierung

Zur Erstellung eines neuen Bulk Sheets, das sinnvolle Kampagnen für ein bestimmtes Produkt erstellt, benötigen wir zunächst folgende Informationen:

  • Welche ASINs oder SKUs sollen beworben werden?
  • Von welchen Marken sind Sie Inhaber und wie heißen die Marken der Konkurrenz?
  • Auf welche Keywords möchten Sie abzielen?
  • Welche Produkte möchten Sie bewerben?

Organisieren Sie diese Informationen, z.B. in einem anderen Excel-Sheet oder Google Docs. Wir organisieren diese Informationen in separaten Textdateien. Wir haben andere Skripte, die diese Textdateien mehr oder weniger automatisch erstellen, z.B. aus bestehenden (aber unorganisierten) Kampagnen, aber das müssen wir in einem anderen Beitrag besprechen.

Ordnerstruktur zeigt Textdateien für Amazon Kampagnen-Keywords und Produktdaten
Produkt- und Keyword-Daten werden in verschiedenen Textdateien gespeichert

Wir erstellen diese Dateien für jede ASIN, SKU oder Gruppe von ASINs/SKUs.

Unser Skript durchläuft dann jeden Ordner und erstellt diese fünf Kampagnen für jedes Produkt (jede Gruppe). Das Einzige, was Sie tun müssen, ist, diese Dateien zu füllen, das Skript auszuführen, das Bulk Sheet hochzuladen, und schon können Sie loslegen.

Hier sehen Sie die wichtigsten Bestandteile des Skripts. Es würde zuviel Platz beanspruchen, jede einzelne Zeile des Codes zu zeigen, daher konzentrieren wir uns auf die wichtigsten Dinge.

Schritt 1: Variablen einrichten

Da wir ein neues Bulk Sheet erstellen werden, müssen wir die Struktur des Bulk Sheets mit seinen verschiedenen Entitäten verstehen. Sie müssen für eine Kampagne andere Werte definieren, als für eine Anzeigen- oder eine Keyword-Gruppe.

Um eine neue Kampagne zu erstellen, müssen Sie die folgenden Felder ausfüllen (Sie finden diese, wenn Sie z.B. ein ausgefülltes Datenblatt herunterladen):

emptySpBulksheet = {
   "Product": "Sponsored Products",
   "Entity": "",
   "Operation": "Create",
   "Campaign Id": "",
   "Ad Group Id": "",
   "Portfolio Id": "",
   "Ad Id (Read only)": "",
   "Keyword Id (Read only)": "",
   "Product Targeting Id (Read only)": "",
   "Campaign Name": "",
   "Ad Group Name": "",
   "Start Date": "",
   "End Date": "",
   "Targeting Type": "",
   "State": "",
   "Daily Budget": "",
   "SKU": "",
   "ASIN": "",
   "Ad Group Default Bid": "",
   "Bid": "",
   "Keyword Text": "",
   "Match Type": "",
   "Bidding Strategy": "",
   "Placement": "",
   "Percentage": "",
   "Product Targeting Expression": ""
}

Das sind die Spalten, die ausgefüllt werden müssen. Einige Spalten gehören zu speziellen Entitäten, z.B. bezieht sich die Spalte "Daily Budget" (tägliches Budget) nur auf die Entität "Campaign" (Kampagne).

Das Gleiche gilt z.B. für die Kampagnen Sponsored Brands und Sponsored Display.

Anschließend definieren wir einige Variablen, die das Verhalten unseres Skripts festlegen. Hier sind einige Beispiele:

# Campaign
createSPCampaigns = True
campaignStatus = "Enabled" # Enter "Enabled", "Paused", or "Archived"
campaignDailyBudget = 20 # EUR or USD
campaignBiddingStrategy = 'Dynamic bids - down only' # Enter "Dynamic bids - down only", "Dynamic bids - up and down", or "Fixed bid".
campaignStartDate = time.strftime("%Y%m%d") # Today as default, e.g. "20220529"
campaignEndDate = "" # "yyyymmdd", can be empty

# Adgroup (https://advertising.amazon.com/API/docs/en-us/bulk sheets/sp/sp-entities/sp-entity-ad-group)
adgroupMaxBix = 1.50
adgroupStatus = "Enabled" # Enter "Enabled", "Paused", or "Archived"

# Keyword
keywordDefaultMatchType = 'broad'
negativeKeywordDefaultMatchType = 'negativeExact' # negativePhrase or negativeExact

# Toggles: Here you can define which type of targets to create (true) or not (false)
addKeywordsGeneric   = True
addKeywordsDefensive = True
addKeywordsOffensive = False
addProductsOffensive = False
addProductsDefensive = False

Dasselbe gilt für die anderen Anzeigearten (Sponsored Brands, Sponsored Display).

Pro-Tipp

Speichern Sie diese Variablen in einer separaten Konfigurationsdatei. So können Sie schnell zwischen verschiedenen Kampagnenstrategien wechseln, ohne den Code zu ändern.

Schritt 2: Externe Datenquellen einbinden

Manchmal verwenden wir auch ein Excel-Blatt mit zusätzlichen Informationen. Das machen wir für unsere Mitarbeiter. In manchen Fällen kann es einfacher sein, mit Excel zu arbeiten anstatt mit Textdateien.

Nehmen wir an, wir haben ein separates Datenblatt, dessen Dateiname in der Variable mainInputFile gespeichert ist, mit zwei Blättern:

  • Unsere Marken und Produktnamen
  • Marken und Produktnamen der Wettbewerber

Um diese Marken in unser Python-Skript zu übertragen, müssen wir folgendes tun:

# Read additional data from main input file (Google Doc -> Excel Sheet)
xls = pd.ExcelFile(mainInputFile)
dfB = pd.read_excel(xls, engine="openpyxl", sheet_name="Our brands")
dfC = pd.read_excel(xls, engine="openpyxl", sheet_name="Competitor brands")

ownBrands        = dfB['Brand'].unique().tolist()
competitorBrands = dfC['Brand'].unique().tolist()

# Make sure brands are lowercase
ownBrands = list(map(str.lower, ownBrands))
competitorBrands = list(map(str.lower, competitorBrands))

Zusätzlich führen wir eine Datenmassage durch und konvertieren alles in Kleinbuchstaben. Das erleichtert den späteren Vergleich.

Sie könnten das auch fest in das Skript kodieren, aber dieser Ansatz macht es flexibler, was praktisch ist, wenn Sie mit mehreren Kunden arbeiten, wie wir es tun.

Schritt 3: Kampagnen-Erstellungsmethoden definieren

Im nächsten Schritt müssen wir einige Funktionen/Hilfsmethoden definieren, um das Bulk Sheet zu erstellen.

Hier sehen Sie ein Beispiel für die Erstellung strukturierter Kampagnennamen, die auch das Ziel der Kampagne widerspiegeln:

def getCampaignName(targeting = "Manual", campaignType = "SP", type1="keyword", type2 = "generic", groupName = "default" ):
  
   prefix = "RE-" + campaignType + "-"
  
   # targeting
   if targeting == "Manual":
       targetingPrefix = "MANU-"
   else:
       targetingPrefix = "AUTO-"
      
   # type1
   if type1 == "keyword":
       type1Prefix = "KW-"
   else:
       type1Prefix = "PT-"
  
   # type 2
   if type2 == "generic":
       type2Prefix = "GEN-"
   elif type2 == "offensive":
       type2Prefix = "OFF-"
   else:
       type2Prefix = "DEF-"
  
   groupName = groupName.strip()
   groupName = groupName[:30].upper()
  
   campaignName = prefix + targetingPrefix + type1Prefix + type2Prefix + groupName + '-' + randomString
  
   return campaignName

Um unsere Kampagnen schnell identifizieren zu können, beginnen unsere Kampagnennamen mit einem Präfix. Danach fügen wir die folgenden Zeichenfolgen hinzu:

  • "MANU" oder "AUTO", wenn es sich um eine manuelle oder automatische Kampagne handelt (nur für Sponsored Product-Kampagnen)
  • "KW" oder "PT", wenn es sich um Keyword- oder Produkt-Targeting handelt
  • "GEN", "OFF" oder "DEF", um die Art der Zielsetzung zu unterscheiden (generisch, offensiv oder defensiv)
  • Der Name des Produkts (Gruppe)
  • Eine zufällige Zeichenfolge, die sich bei jeder Ausführung des Skripts ändert

Die zufällige Zeichenfolge macht es einfacher, z.B. nach Kampagnen zu filtern, die in einem einzigen Durchgang erstellt wurden. Bei Fehlern können Sie diese Kampagnen leicht finden und sie z.B. archivieren und neu beginnen.

Wichtig: Lassen Sie die zufällige Zeichenfolge niemals weg! Sie ermöglicht es Ihnen, fehlerhafte Bulk-Imports rückgängig zu machen, indem Sie alle Kampagnen mit derselben Zufallskennung auf einmal archivieren.

Anschließend erstellen wir die verschiedenen Methoden zur Erstellung einer Entität, z.B. hier eine Methode zum Ausfüllen der relevanten Felder, die zur Erstellung einer Kampagne benötigt werden:

def createSpCampaign(targeting = "Manual", type1="none", type2 = "none", groupName = "none", customerPath = "none", counter = 1, fileName = "" ):

   global bulkSheetSp
  
   campaignName = getCampaignName(targeting = targeting, campaignType = "SP", type1=type1, type2 = type2, groupName = groupName)
  
   campaign = copy.deepcopy(emptySpBulksheet) # Create a deep copy
  
   campaign['Entity']           = 'Campaign'
   campaign['Campaign Id']      = campaignName
   campaign['Campaign Name']    = campaignName
   campaign['Start Date']       = campaignStartDate
   campaign['End Date']         = campaignEndDate
   campaign['Targeting Type']   = targeting.upper()
   campaign['State']            = campaignStatus
   campaign['Daily Budget']     = campaignDailyBudget
   campaign['Bidding Strategy'] = campaignBiddingStrategy
  
   if ((bulkSheetSp['Entity'] == 'Campaign') & (bulkSheetSp['Campaign Id'] == campaignName)).any():
       pass # Do nothing, we already have this campaign
   else:
       bulkSheetSp = bulkSheetSp.append(campaign, ignore_index=True)
  
   # Create adgroup         
   createSpAdgroup(targeting = targeting, type1=type1, type2 = type2, groupName = groupName, campaignName = campaignName, customerPath = customerPath, counter = counter, fileName = fileName)

Hierein kopieren wir zunächst unser "leeres Bulk Sheet" und füllen es mit allen erforderlichen Daten aus. Woher diese kommen, werden Sie später sehen. Diese Methode ruft dann die nächste Methode createSpAdgroup auf, die einen ähnlichen Vorgang wie oben gezeigt durchführt, nur für eine Anzeigengruppe. Alle Informationen, die wir an unsere Kampagne übergeben haben, werden auch an die Anzeigengruppe weitergegeben.

Diese Methode sieht wie folgt aus:

def createSpAdgroup(targeting = "Manual", type1="none", type2 = "none", groupName = "none", campaignName = 'none', customerPath = "none", counter = 1, fileName = ""):
  
   counterString = f"{counter:02}"
  
   global bulkSheetSp
  
   adgroupName  = getCampaignName(targeting = targeting, campaignType = "SP", type1=type1, type2 = type2, groupName = groupName) + '-AG' + '-' + counterString
  
   adgroup = copy.deepcopy(emptySpBulksheet) # Create a deep copy to not alter emptySpBulksheet
  
   adgroup['Entity']        = 'Ad Group'
   adgroup['Campaign Id']   = campaignName
   adgroup['Ad Group Name'] = adgroupName
   adgroup['Ad Group Id']   = adgroupName
   adgroup['State']         = adgroupStatus
   adgroup['Ad Group Default Bid'] = adgroupMaxBix
      
   bulkSheetSp = bulkSheetSp.append(adgroup, ignore_index=True)

   # Create ad
  
   createSpAd(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath)
  
   if type1 == "keyword":
       createSpKeywordTarget(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath, fileName = fileName)

   if type1 == "product":
       createSpProductTarget(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath)

Alle anderen Methoden, die zur Erstellung von Anzeigen, Keyword-Zielen, Produktzielen, negativen Keywords usw. benötigt werden, definieren wir auf dieselbe Weise.

Schritt 4: Hauptskript ausführen

Schließlich benötigen wir unser Hauptskript, um das Ganze in Gang zu setzen. Das sieht folgendermaßen aus:

if createSPCampaigns:
  
   # Create empty bulksheet
   bulkSheetSp = pd.DataFrame(data=emptySpBulksheet, index=[0])

   # Get all products or product groups stored in different folders
   productGroups = list_paths(customerPath)
   productGroupsLength = len(productGroups)

   j = 0

   randomString = randStr(N=5) # Create a random string

   for productGroup in productGroups:
      
       j = j + 1
      
       # Check which files are available
       all_files = sorted(glob.glob(customerPath  + '/' + productGroup + '/*.txt'))
      
       counter = 0

       for file in all_files:

           if (addKeywordsOffensive) & ('keywords-offensive.txt' in file):
               createSpCampaign(targeting = "Manual", type1="keyword", type2 = "offensive", groupName = productGroup, customerPath = customerPath, fileName = file)
          
           if (addKeywordsGeneric == True) & ('keywords-generic.txt' in file):
               counter = counter + 1
               createSpCampaign(targeting = "Manual", type1="keyword", type2 = "generic", groupName = productGroup, customerPath = customerPath, counter = counter, fileName = file)
          
           if (addKeywordsDefensive) & ('keywords-defensive.txt' in file):
               createSpCampaign(targeting = "Manual", type1="keyword", type2 = "defensive", groupName = productGroup, customerPath = customerPath, fileName = file)
          
           if (addProductsDefensive) & ('products-defensive.txt' in file):
               createSpCampaign(targeting = "Manual", type1="product", type2 = "defensive", groupName = productGroup, customerPath = customerPath, fileName = file)
          
           if (addProductsOffensive) & ('products-offensive.txt' in file):
               createSpCampaign(targeting = "Manual", type1="product", type2 = "offensive", groupName = productGroup, customerPath = customerPath, fileName = file)

Aus didaktischen Gründen habe ich einige Zeilen entfernt, z.B. um die Dateien zu säubern, bevor wir sie analysieren (leere Zeilen entfernen, doppelte Schlüsselwörter entfernen usw.). Unser Skript behandelt auch den Fall, dass eine Datei mehr als 1.000 Schlüsselwörter enthält. Das kann schnell passieren, wenn Sie mit Permutationen arbeiten, weil Sie Phrase-Match (Passende Wortgruppe) im Falle von Broad-Match (Weitgehend passend) verwenden wollen.

Schritt 5: Excel-Export für Amazon

Zu guter Letzt müssen wir unsere Daten in eine Excel-Tabelle exportieren, die wir dann bei Amazon hochladen können.

Das funktioniert folgendermaßen:

# Remove empty rows
if createSPCampaigns:
   bulkSheetSp['Entity'].replace('', np.nan, inplace=True)
   bulkSheetSp.dropna(subset=['Entity'], inplace=True)

# Filename
today = time.strftime("%Y-%m-%d-%H-%M") # Today as default
outputFile = customerPath + '/' + today + '-' + slugify(customer) + '-campaign-create-bulksheet.xlsx'
outputFile = outputFile.replace("input-", "")

# Export to Excel
with pd.ExcelWriter(outputFile) as writer: 
   if createSPCampaigns:
       bulkSheetSp.to_excel(writer, sheet_name='Sponsored Products Campaigns', index=False)

Fazit: Zeit sparen mit Python-Automatisierung

Mit diesem Python-Skript und Pandas automatisieren Sie die Erstellung von Amazon Bulk Sheets komplett. Was früher Stunden dauerte, erledigen Sie jetzt in Minuten:

  • Zeitersparnis: Erstellen Sie hunderte Kampagnen in unter 10 Minuten
  • Fehlerreduktion: Keine manuellen Copy-Paste-Fehler mehr
  • Skalierbarkeit: Funktioniert für 10 oder 10.000 Produkte gleichermaßen
  • Wiederverwendbarkeit: Einmal eingerichtet, immer wieder nutzbar

Nächste Schritte für Ihre Kampagnen-Automatisierung

Hier sind einige Ideen, die Ihnen den Einstieg erleichtern:

  • Generieren Sie Ideen für Keywords und Produktziele auf der Grundlage des Suchbegriffsberichts in Brand Analytics
  • Verwenden Sie auch hier die Keywords aus Ihrer Amazon-SEO-Recherche
  • Nutzen Sie die Amazon Advertising API für noch mehr Automatisierung

Wenn Ihr Kunde uns den Auftrag erteilt, die bestehenden Kampagnen neu zu organisieren und die gut funktionierenden Keywords zu nutzen, analysieren wir z.B. die bestehenden Bulk Sheets und extrahieren alle Produkte einschließlich der gut funktionierenden Ziele. Anschließend ordnen wir jedes Ziel in den richtigen Bereich ein und führen das Skript innerhalb weniger Minuten aus.

Benötigen Sie Hilfe bei der Kampagnen-Automatisierung?

Möchten Sie Ihre Amazon Bulk-Operationen mit Python automatisieren, aber wissen nicht, wo Sie anfangen sollen? Unsere Amazon PPC Agentur REVOIC unterstützt Sie gerne bei der Implementierung maßgeschneiderter Automatisierungslösungen für Ihre Werbekampagnen.

Nutzen Sie auch AMALYTIX, unser kostenloses Tool zur Amazon-Konkurrenzanalyse, um die besten Keywords für Ihre automatisierten Kampagnen zu finden.

Brauchen Sie mehr Übersicht auf Amazon?
14 Tage kostenlos testen
Haben Sie noch Fragen? Rufen Sie uns an!
Tel. 0221-29 19 12 32 | info@amalytix.com