UTM-Parameter mit Kampagnennamen in Google Ads automatisieren: Jeder, der mit Google AnalyticsMatomo HubSpot oder anderen Webanalyse-Systemen sauber auswerten möchte, braucht konsistente Kampagnenparameter. In Google Analytics funktioniert die Zuordnung über Auto-Tagging und gclid oft automatisch. Für andere Systeme wie Matomo oder CRM-Auswertungen reichen diese Daten aber häufig nicht aus.

Das Problem: Google Ads stellt zwar viele ValueTrack-Parameter bereit, darunter campaignid und adgroupid, aber keine direkt nutzbaren Platzhalter für den lesbaren Kampagnennamen oder Anzeigengruppennamen. Genau hier helfen benutzerdefinierte ValueTrack-Parameter und ein Google Ads Script. Google dokumentiert campaignid und adgroupid als verfügbare ValueTrack-Parameter; lesbare Namen müssen dagegen über Custom Parameters gelöst werden.

Mit dem Script in diesem Artikel kannst du Kampagnennamen und Anzeigengruppennamen automatisch als URL-Parameter setzen.

Update: Die aktuelle Version unterstützt auch Demand Gen Kampagnen.

Manuelles Setzen der Parameter ist zeitaufwendig und fehleranfällig. In diesem Artikel erfährst du, wie du Kampagnennamen mit UTM-Parametern in Google Ads via Google Ads Script automatisiert setzen kannst. Das entsprechende Google Ads Script findest Du unten im Artikel.

Wofür sind UTM-Parameter in Google Ads wichtig?

Tracking Parameter werden an Links angehängt und durch den Webtracker ausgelesen. Dies ermöglicht die Zuordnung, über welchen Weg der Besucher auf eine Webseite gekommen ist. Google Analytics ordnet Google Ads Traffic bei bestehender Verbindung auch die ordentlichen Kampagnennamen zu. Dieser entsteht aber über die gclid Zuordnung und nicht über die UTM-Parameter. Wenn du z.B. in Matomo lesbare Kampagnennamen und Anzeigengruppen Namen haben möchtest, ist es notwendig dies über utm_ oder pk_ parameter manuell an die Ziel-URLs anzuhängen.

Manuelles Setzen von Kampagnenname und Anzeigengruppenname für UTM-Parameter in Google Ads

Eine schöne UTM Parameter Struktur wäre beispielsweise:

utm_source=google&utm_medium=cpc&utm_campaign={Kampagnenname}&utm_content={Anzeigengruppen Name}

So ließe sich auch in Matomo die Anzeigenstruktur gut bewerten. Schön wär’s. Leider bietet Google Ads keine entsprechenden Variablen für Kampagnenname und Anzeigengruppenname. Hier geht’s zur Variablenliste bei Google

Die Lösung ist der Umweg über Benutzerdefinierte ValueTrack Parameter, in denen wir entsprechend Namen eintragen.

Bsp.:
campaign = Mein%20Kampagnen%20Name
adgroup = Mein%20Anzeigengruppen%20Name

Geht auch echt einfach, weil wir Sonder- und Leerzeichen nur URL codieren müssen. Mit Leerzeichen würden die Links nicht funktionieren. Also nichts, was man mal nebenbei bei der Kampagnenerstellung schnell erledigt. Sobald es also kleinere Kampagnenänderungen an den AdGroups gibt und jemand nicht daran denkt, ist alles wieder kaputt.
Läuft mal wieder! (Wer jetzt gefrustet ist, weiterlesen. Alles wird gut.)

Best Practices für die Verwendung von UTM-Parametern

Damit Ihre UTM-Parameter die gewünschten Ergebnisse liefern, sollten Sie die folgenden Best Practices beachten:

Konsistente Benennung: Verwenden Sie einheitliche Namenskonventionen für Kampagnen, um die Analyse Ihrer Daten zu erleichtern. Beispielsweise sollten alle Kampagnen, die auf Facebook laufen, das Medium „social“ und die Quelle „facebook“ verwenden.

Keine Sonderzeichen: Vermeiden Sie Sonderzeichen und Leerzeichen in den Parametern, da diese Probleme beim Tracking verursachen können. Nutzen Sie stattdessen Bindestriche oder Unterstriche.

Klarheit und Präzision: Halten Sie die Benennungen so klar und präzise wie möglich, z. B. utm_campaign=sale_2025 anstatt utm_campaign=aktion.

Regelmäßige Überprüfung: Kontrollieren Sie in regelmäßigen Abständen die Parameter Ihrer URLs. So stellen Sie sicher, dass sie immer noch den aktuellen Kampagnen und Strategien entsprechen.

Durch diese Best Practices optimieren Sie die Qualität Ihrer Tracking-Daten und können Ihre Marketingmaßnahmen effektiver steuern.

Wer neben Google Ads auch noch für andere Netzwerke UTM Parameter setzen möchte, sollte sich unbedingt den Blogartikel dazu ansehen.

Vorteile der Automatisierung von UTM-Parametern in Google Ads

Die Automatisierung von UTM-Parametern bietet zahlreiche Vorteile für Marketer, die ihre Kampagnen effizienter verwalten möchten. Ein entscheidender Vorteil ist die Zeitersparnis: Manuelles Hinzufügen von UTM-Parametern in Google Ads zu jeder Kampagne kann schnell mühsam werden, insbesondere bei einer großen Anzahl von Anzeigen. Durch Automatisierung wird dieser Prozess standardisiert und erheblich beschleunigt.

Zudem minimiert die Automatisierung das Risiko von Fehlern. Tippfehler oder inkonsistente Parameter können die Genauigkeit der Datenanalyse beeinträchtigen. Ein sauber automatisierter Workflow stellt sicher, dass Tracking-URLs immer korrekt und einheitlich sind. Dadurch können Marketer verlässliche Daten sammeln und fundierte Entscheidungen für ihre zukünftigen Kampagnen treffen. Die Automatisierung trägt so auch zu einer besseren Transparenz und höheren Effizienz bei.

UTM-Parameter in Google Ads mit Script automatisiert setzen

Das Script ist ein MCC Skript, welches über ein definiertes Label und eine definierten Tracking Parametersuffix automatisiert den Job erledigt. In allen Google Ads Account des MCCs, die das entsprechende Label haben.

Was das Skript tut:

  1. Es werden Kampagnen mit den Satis “Aktiviert” und “Pausiert” gewählt.
  2. In Kampagnen wird der benutzerdefinierte Parameter “campaign = {Kampagnenname}” gesetzt
  3. In Anzeigengruppen wird der benutzerdefinierte Parameter “adgroup = ” gesetzt.
  4. Der Kampagnen Suffix wird auf den Wert in CONFIG.SUFFIX gesetzt. (Dieser sollte natürlich entsprechend die beiden benutzerdefinierten Parameter enthalten.

Schritt-für-Schritt-Anleitung zur Implementierung des Skripts

Die Implementierung eines Skripts zur Automatisierung von UTM-Parametern in Google Ads ist einfacher, als viele vermuten. Hier ist eine kurze Anleitung:

Skript erstellen: Melden Sie sich in Ihrem Google Ads-Konto an und navigieren Sie zu „Tools und Einstellungen“ → „Skripte“. Klicken Sie auf „+“, um ein neues Skript zu erstellen.

Skript einfügen: Kopieren Sie das Skript aus diesem Artikel und fügen Sie es in den Editor ein.

Parameter konfigurieren: Passen Sie die Variablen im Skript an Ihre Kampagnenstruktur an. Definieren Sie, welche Parameter automatisch gesetzt werden sollen, z. B. utm_source, utm_medium oder utm_campaign.

Skript testen: Vor der Aktivierung sollten Sie das Skript testen, um sicherzustellen, dass es korrekt funktioniert. Nutzen Sie dafür die Testfunktion in Google Ads.

Skript planen: Legen Sie fest, wie häufig das Skript ausgeführt werden soll, z. B. täglich, um sicherzustellen, dass neue Kampagnen automatisch mit den korrekten Parametern versehen werden.

Diese Schritte machen es einfach, das Skript in Ihre Kampagnenverwaltung zu integrieren und von den Vorteilen der Automatisierung zu profitieren.

Häufige Fehler und deren Vermeidung

Auch bei der Verwendung von UTM-Parametern können Fehler auftreten. Zu den häufigsten zählen:

Vergessene URL-Codierung: Parameter wie Leerzeichen oder Sonderzeichen können zu Fehlern führen, wenn sie nicht korrekt codiert werden. Nutzen Sie Tools wie einen URL-Builder, um sicherzustellen, dass Ihre Links korrekt formatiert sind.

Inkonsistente Parameter: Unterschiedliche Schreibweisen, z. B. „Google“ und „google“, können dazu führen, dass Daten in Analytics fragmentiert werden. Halten Sie sich an ein festgelegtes Schema.

Zu viele Parameter: Manchmal werden zu viele Parameter hinzugefügt, was die URL unnötig aufbläht und das Verständnis erschwert. Beschränken Sie sich auf die wichtigsten Informationen.

Unregelmäßige Nutzung: Wenn nur ein Teil Ihrer Kampagnen mit UTM-Parametern versehen ist, entstehen Datenlücken. Automatisierung hilft, dies zu vermeiden.

Die Beachtung dieser Punkte minimiert Fehler und sorgt dafür, dass Ihre Tracking-Daten vollständig und zuverlässig sind.

Single Google Ads Account Version

  • Installiere das Script direkt in einem Google Ads Account.
  • Wenn erforderlich, die UTM Parameter unter CONFIG.SUFFIX abändern.
  • Authorisieren, Vorschau drücken, Ergebnis kontrollieren
var CONFIG = {
      SUFFIX: 'utm_source=google&utm_medium=cpc&utm_campaign={_campaign}|{campaignid}&utm_term={feeditemid}{keyword}&utm_content={_adgroup}|{adgroupid}&utm_id={campaignid}&color_id={gclid}',
      SUFFIX_PMAX:'utm_source=google&utm_medium=cpc&utm_campaign={_campaign}|{campaignid}&utm_term={feeditemid}{keyword}&utm_id={campaignid}'
}

function main() {
  Logger.log(AdsApp.currentAccount().getName());
  shoppingCampaignParametersUpdate();
  campaignParametersUpdate();
  adgroupParametersUpdate();
  pmaxParametersUpdate();
  demandGenCampaignParametersUpdate();
  demandGenAdGroupParametersUpdate();
}

function shoppingCampaignParametersUpdate(){
  var campaignSelector = AdsApp
     .shoppingCampaigns()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')")
   var campaignIterator = campaignSelector.get();
   while (campaignIterator.hasNext()) {
      var campaign = campaignIterator.next();
      var name = campaign.getName();
      name = encodeURI(name)
      Logger.log(name)
     var params = campaign.urls().getCustomParameters()
     Logger.log(params.campaign + ' = ' + name)
     if(params.campaign != name){
       params.campaign = name;
       campaign.urls().setCustomParameters(params)
     }
     if(campaign.urls().getFinalUrlSuffix() != CONFIG.SUFFIX){
       campaign.urls().setFinalUrlSuffix(CONFIG.SUFFIX)
     }
 }
}

function pmaxParametersUpdate(){
  var performanceMaxCampaignSelector = AdsApp
    .performanceMaxCampaigns()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')");

  var performanceMaxCampaignIterator = performanceMaxCampaignSelector.get();
  while (performanceMaxCampaignIterator.hasNext()) {
    var performanceMaxCampaign = performanceMaxCampaignIterator.next();
      //Logger.log(performanceMaxCampaign.getName());

      var name = performanceMaxCampaign.getName();
      name = encodeURI(name);
      var params = performanceMaxCampaign.urls().getCustomParameters()
       //Logger.log(params.campaign + ' = ' + name)
       if(params.campaign != name){
         if(params.adgroup){
           delete params["adgroup"]
         }
         params.campaign = name;
         performanceMaxCampaign.urls().setCustomParameters(params)
       }
       if(performanceMaxCampaign.urls().getFinalUrlSuffix() != CONFIG.SUFFIX_PMAX){
         performanceMaxCampaign.urls().setFinalUrlSuffix(CONFIG.SUFFIX_PMAX)
       }
  }
}

function campaignParametersUpdate(){
  var campaignSelector = AdsApp
     .campaigns()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')")
   var campaignIterator = campaignSelector.get();
   while (campaignIterator.hasNext()) {
      var campaign = campaignIterator.next();
      var name = campaign.getName();
      name = encodeURI(name)
      //Logger.log(name)
     var params = campaign.urls().getCustomParameters()
     //Logger.log(params.campaign + ' = ' + name)
     if(params.campaign != name){
       params.campaign = name;
       campaign.urls().setCustomParameters(params)
     }
     if(campaign.urls().getFinalUrlSuffix() != CONFIG.SUFFIX){
       campaign.urls().setFinalUrlSuffix(CONFIG.SUFFIX)
     }
 }
}

function adgroupParametersUpdate(){
  var adGroupSelector = AdsApp
     .adGroups()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')")
   var adGroupIterator  = adGroupSelector.get();
   while (adGroupIterator.hasNext()) {
      var adgroup = adGroupIterator.next();
      var name = adgroup.getName();
      name = encodeURI(name)
      //Logger.log(name)
     var params = adgroup.urls().getCustomParameters()
     if(params.adgroup != name){
       params.adgroup = name;
       //Logger.log(params)
       adgroup.urls().setCustomParameters(params)
     }
 }
}

function demandGenCampaignParametersUpdate(){
  var query =
    "SELECT campaign.resource_name, campaign.name, campaign.final_url_suffix, " +
    "       campaign.url_custom_parameters " +
    "FROM campaign " +
    "WHERE campaign.advertising_channel_type = 'DEMAND_GEN' " +
    "  AND campaign.status IN ('ENABLED','PAUSED')";
  var iterator = AdsApp.search(query);
  while (iterator.hasNext()) {
    var row = iterator.next();
    var resourceName = row.campaign.resourceName;
    var name = encodeURI(row.campaign.name);
    Logger.log(name);
    var paramsArr = row.campaign.urlCustomParameters || [];
    var paramsMap = {};
    for (var i = 0; i < paramsArr.length; i++) {
      paramsMap[paramsArr[i].key] = paramsArr[i].value;
    }
    var currentSuffix = row.campaign.finalUrlSuffix || '';
    var needCampaignUpdate = paramsMap.campaign != name;
    var needSuffixUpdate = currentSuffix != CONFIG.SUFFIX;
    if (!needCampaignUpdate && !needSuffixUpdate) {
      continue;
    }
    paramsMap.campaign = name;
    var newParamsArr = [];
    for (var key in paramsMap) {
      newParamsArr.push({ key: key, value: paramsMap[key] });
    }
    var result = AdsApp.mutate({
      campaignOperation: {
        update: {
          resourceName: resourceName,
          finalUrlSuffix: CONFIG.SUFFIX,
          urlCustomParameters: newParamsArr
        },
        updateMask: 'urlCustomParameters,finalUrlSuffix'
      }
    });
    if (!result.isSuccessful()) {
      Logger.log('DG campaign mutate failed for ' + resourceName + ': ' + result.getErrorMessages());
    }
  }
}

function demandGenAdGroupParametersUpdate(){
  var query =
    "SELECT ad_group.resource_name, ad_group.name, ad_group.url_custom_parameters " +
    "FROM ad_group " +
    "WHERE campaign.advertising_channel_type = 'DEMAND_GEN' " +
    "  AND ad_group.status IN ('ENABLED','PAUSED') " +
    "  AND campaign.status IN ('ENABLED','PAUSED')";
  var iterator = AdsApp.search(query);
  while (iterator.hasNext()) {
    var row = iterator.next();
    var resourceName = row.adGroup.resourceName;
    var name = encodeURI(row.adGroup.name);
    var paramsArr = row.adGroup.urlCustomParameters || [];
    var paramsMap = {};
    for (var i = 0; i < paramsArr.length; i++) {
      paramsMap[paramsArr[i].key] = paramsArr[i].value;
    }
    if (paramsMap.adgroup == name) {
      continue;
    }
    paramsMap.adgroup = name;
    var newParamsArr = [];
    for (var key in paramsMap) {
      newParamsArr.push({ key: key, value: paramsMap[key] });
    }
    var result = AdsApp.mutate({
      adGroupOperation: {
        update: {
          resourceName: resourceName,
          urlCustomParameters: newParamsArr
        },
        updateMask: 'urlCustomParameters'
      }
    });
    if (!result.isSuccessful()) {
      Logger.log('DG adgroup mutate failed for ' + resourceName + ': ' + result.getErrorMessages());
    }
  }
}

MCC Version Multi-Account Version

  • Installiere das Script im MCC Account
  • Setze Labels auf MCC Accountebene an alle Konten die UTM Parameter im festgelegten Schema nutzen möchten. Wenn Du ein eigenes Label nutzen möchtest, verändere CONFIG.LABEL_NAME
  • Pass gegebenenfalls die UTM Parameter in CONFIG.SUFFIX an.
  • Vorschau drücke, Ergebnisse kontrollieren.
var CONFIG = {
      LABEL_NAME: 'Tracking Link Check UTM',
      SUFFIX: 'utm_source=google&utm_medium=cpc&utm_campaign={_campaign}|{campaignid}&utm_term={feeditemid}{keyword}&utm_content={_adgroup}|{adgroupid}&utm_id={campaignid}&color_id={gclid}',
      SUFFIX_PMAX:'utm_source=google&utm_medium=cpc&utm_campaign={_campaign}|{campaignid}&utm_term={feeditemid}{keyword}&utm_id={campaignid}'
}

function main() {
  const accountSelector = AdsManagerApp.accounts()
      .withCondition("LabelNames CONTAINS '" + CONFIG.LABEL_NAME + "'")
      .withLimit(50);
  accountSelector.executeInParallel('processAccount');

 }

function processAccount() {
  shoppingCampaignParametersUpdate();
  campaignParametersUpdate()
  adgroupParametersUpdate();
  pmaxParametersUpdate();
  demandGenCampaignParametersUpdate();
  demandGenAdGroupParametersUpdate();
}

function shoppingCampaignParametersUpdate(){
  Logger.log(AdsApp.currentAccount().getName())
  var campaignSelector = AdsApp
     .shoppingCampaigns()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')")
   var campaignIterator = campaignSelector.get();
   while (campaignIterator.hasNext()) {
      var campaign = campaignIterator.next();
      var name = campaign.getName();
      name = encodeURI(name)
      Logger.log(name)
     var params = campaign.urls().getCustomParameters()
     Logger.log(params.campaign + ' = ' + name)
     if(params.campaign != name){
       params.campaign = name;
       campaign.urls().setCustomParameters(params)
     }
     if(campaign.urls().getFinalUrlSuffix() != CONFIG.SUFFIX){
       campaign.urls().setFinalUrlSuffix(CONFIG.SUFFIX)     
     }
 }
}

function pmaxParametersUpdate(){
  var performanceMaxCampaignSelector = AdsApp
    .performanceMaxCampaigns()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')");

  var performanceMaxCampaignIterator = performanceMaxCampaignSelector.get();
  while (performanceMaxCampaignIterator.hasNext()) {
    var performanceMaxCampaign = performanceMaxCampaignIterator.next();
      //Logger.log(performanceMaxCampaign.getName());
    
      var name = performanceMaxCampaign.getName();
      name = encodeURI(name);
      var params = performanceMaxCampaign.urls().getCustomParameters()
       //Logger.log(params.campaign + ' = ' + name)
       if(params.campaign != name){
         if(params.adgroup){
           delete params["adgroup"]
         }
         params.campaign = name;
         performanceMaxCampaign.urls().setCustomParameters(params)
       }
       if(performanceMaxCampaign.urls().getFinalUrlSuffix() != CONFIG.SUFFIX_PMAX){
         performanceMaxCampaign.urls().setFinalUrlSuffix(CONFIG.SUFFIX_PMAX)     
       }
  }
}

function campaignParametersUpdate(){
//  Logger.log(AdsApp.currentAccount().getName())
  var campaignSelector = AdsApp
     .campaigns()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')")
   var campaignIterator = campaignSelector.get();
   while (campaignIterator.hasNext()) {
      var campaign = campaignIterator.next();
      var name = campaign.getName();
      name = encodeURI(name)
      //Logger.log(name)
     var params = campaign.urls().getCustomParameters()
     //Logger.log(params.campaign + ' = ' + name)
     if(params.campaign != name){
       params.campaign = name;
       campaign.urls().setCustomParameters(params)
     }
     if(campaign.urls().getFinalUrlSuffix() != CONFIG.SUFFIX){
       campaign.urls().setFinalUrlSuffix(CONFIG.SUFFIX)     
     }
 }
}

function adgroupParametersUpdate(){
  var adGroupSelector = AdsApp
     .adGroups()
     .withCondition("campaign.status IN ('ENABLED','PAUSED')")
   var adGroupIterator  = adGroupSelector.get();
   while (adGroupIterator.hasNext()) {
      var adgroup = adGroupIterator.next();
      var name = adgroup.getName();
      name = encodeURI(name)
      //Logger.log(name)
     var params = adgroup.urls().getCustomParameters()
     if(params.adgroup != name){
       params.adgroup = name;
       //Logger.log(params)
       adgroup.urls().setCustomParameters(params)
     }
 }
}

function demandGenCampaignParametersUpdate(){
  var query =
    "SELECT campaign.resource_name, campaign.name, campaign.final_url_suffix, " +
    "       campaign.url_custom_parameters " +
    "FROM campaign " +
    "WHERE campaign.advertising_channel_type = 'DEMAND_GEN' " +
    "  AND campaign.status IN ('ENABLED','PAUSED')";
  var iterator = AdsApp.search(query);
  while (iterator.hasNext()) {
    var row = iterator.next();
    var resourceName = row.campaign.resourceName;
    var name = encodeURI(row.campaign.name);
    Logger.log(name);
    var paramsArr = row.campaign.urlCustomParameters || [];
    var paramsMap = {};
    for (var i = 0; i < paramsArr.length; i++) {
      paramsMap[paramsArr[i].key] = paramsArr[i].value;
    }
    var currentSuffix = row.campaign.finalUrlSuffix || '';
    var needCampaignUpdate = paramsMap.campaign != name;
    var needSuffixUpdate = currentSuffix != CONFIG.SUFFIX;
    if (!needCampaignUpdate && !needSuffixUpdate) {
      continue;
    }
    paramsMap.campaign = name;
    var newParamsArr = [];
    for (var key in paramsMap) {
      newParamsArr.push({ key: key, value: paramsMap[key] });
    }
    var result = AdsApp.mutate({
      campaignOperation: {
        update: {
          resourceName: resourceName,
          finalUrlSuffix: CONFIG.SUFFIX,
          urlCustomParameters: newParamsArr
        },
        updateMask: 'urlCustomParameters,finalUrlSuffix'
      }
    });
    if (!result.isSuccessful()) {
      Logger.log('DG campaign mutate failed for ' + resourceName + ': ' + result.getErrorMessages());
    }
  }
}

function demandGenAdGroupParametersUpdate(){
  var query =
    "SELECT ad_group.resource_name, ad_group.name, ad_group.url_custom_parameters " +
    "FROM ad_group " +
    "WHERE campaign.advertising_channel_type = 'DEMAND_GEN' " +
    "  AND ad_group.status IN ('ENABLED','PAUSED') " +
    "  AND campaign.status IN ('ENABLED','PAUSED')";
  var iterator = AdsApp.search(query);
  while (iterator.hasNext()) {
    var row = iterator.next();
    var resourceName = row.adGroup.resourceName;
    var name = encodeURI(row.adGroup.name);
    var paramsArr = row.adGroup.urlCustomParameters || [];
    var paramsMap = {};
    for (var i = 0; i < paramsArr.length; i++) {
      paramsMap[paramsArr[i].key] = paramsArr[i].value;
    }
    if (paramsMap.adgroup == name) {
      continue;
    }
    paramsMap.adgroup = name;
    var newParamsArr = [];
    for (var key in paramsMap) {
      newParamsArr.push({ key: key, value: paramsMap[key] });
    }
    var result = AdsApp.mutate({
      adGroupOperation: {
        update: {
          resourceName: resourceName,
          urlCustomParameters: newParamsArr
        },
        updateMask: 'urlCustomParameters'
      }
    });
    if (!result.isSuccessful()) {
      Logger.log('DG adgroup mutate failed for ' + resourceName + ': ' + result.getErrorMessages());
    }
  }
}

Fazit

UTM Parameter in Google Ads Kampagnen menschlich lesbar zu machen, ist manuell eine Herausforderung. Konfiguriert man sich dafür ein Google Ads Skript, erledigt dieses den Job zuverlässig.

Bernhard prange webmeisterei

SEA-Experte: Bernhard Prange

Bernhard Prange ist Google Ads Freelancer und Tracking-Spezialist mit über 10 Jahren Erfahrung im Performance-Marketing. Sein Fokus liegt auf datengetriebenem Arbeiten: von Google Shopping über Conversion-Tracking bis hin zu serverseitigen Lösungen mit Matomo und BigQuery.

Als Ansprechpartner für Agenturen, E-Commerce-Unternehmen und B2B-Dienstleister verbindet er technisches Know-how mit strategischem Blick auf Marketing und Geschäftsmodelle.

Beiträge, die dich auch interessieren könnten…

  • MCP Server in Aktion: Hast Du heute schon mit Deinem Google Ads Account geredet?

    Lesen
  • Google Ads Kosten: Was Unternehmen 2026 wirklich einplanen müssen

    Lesen
  • Google Ads DemandGen: Der vollständige Praxis-Leitfaden

    Lesen
  • Optimierung von Google Shopping Feeds mit OpenAI’s ChatGPT: Ein umfassender Leitfaden

    Lesen