Consent Mode V2
STORIES
STORIES

Falsche Zuordnung der Kampagnen in GA4 google/cpc

STORIES

Warum Automatisches Tagging (GCLID/DCLID) allein nicht ausreicht

Wer kennt es nicht? Unvollständige Zuordnungen der Daten begegnen uns seit GA4, Consent-Mode und Co. immer wieder. Adblocker und Datenschutztools entfernen oft diese Parameter, wodurch die Zuordnung von Daten in Google Analytics fehlschlagen kann. Dadurch reicht das automatische Tagging in Google Ads in den Konto-Einstellungen nicht mehr aus.

 

Google Ads GCLID | norisk Group

 

 

 

Folgen in GA bei ausschließlicher Anwendung des Auto-Taggings


Durch die fehlende Zuordnung der Daten kann es passieren, dass in GA4 der Channel google/cpc Rückgänge bei den Kampagnen verzeichnet und ein Großteil der Daten in (organic) und (not set) fallen.

 

 

GA4 PPC mit (organic) und (not set) Data | norisk group

 

 

 

Wie kann ich die Ansicht in Google Analytics 4 erreichen?

Schritt 1: „Acquisition > Traffic Acquisition“

Schritt 2: Dimension zu „Session source/medium“ ändern

Schritt 3: Kampagnen als sekundäre Dimension hinzufügen

 

 

Wie kann es gefixt werden?

Eine Lösung besteht darin, UTM-Parameter manuell hinzuzufügen und sie als Rückfallmechanismus zu verwenden. So wird sichergestellt, dass Kampagnendaten auch dann korrekt erfasst werden, wenn Auto-Tagging nicht funktioniert.

Eine Kombination aus Auto-Tagging und UTMs bietet die beste Lösung.

 

Dabei gibt es zwei Möglichkeiten im Google Ads Account:

 

1. Manuelles Hinzufügen von UTM-Parametern

Um Tracking-Probleme zu umgehen, können URLs manuell mit UTM-Parametern wie utm_campaign, utm_source und utm_medium erweitert werden. Dies ermöglicht eine bessere Erkennung der Kampagnendaten.

 

 

Google Ads UTM-Parameter | norisk Group

 

2. Automatisches Hinzufügen von UTM-Parametern mit Google Ads Skripte   

 

2.1. Single Account UTM-Tracking Skript

 

-------------------------------------

 

function main() {
  Logger.log("Processing account: " + AdsApp.currentAccount().getCustomerId());

  // Process each campaign type with error handling
  tryHandleCampaigns(AdsApp.campaigns(), "Standard & Others");
  tryHandleCampaigns(AdsApp.shoppingCampaigns(), "Shopping");
  tryHandleCampaigns(AdsApp.performanceMaxCampaigns(), "Performance Max");
  // tryHandleCampaigns(AdsApp.videoCampaigns(), "Video");

  Logger.log("Processing completed for account: " + AdsApp.currentAccount().getCustomerId());
}

function tryHandleCampaigns(campaignIteratorFunction, campaignType) {
  try {
    handleCampaigns(campaignIteratorFunction, campaignType);
  } catch (e) {
    Logger.log("Error processing " + campaignType + " campaigns: " + e.message);
  }
}

function handleCampaigns(campaignIteratorFunction, campaignType) {
  var campaignIterator = campaignIteratorFunction
                            .withCondition('Status != REMOVED')
                            .get();
  while (campaignIterator.hasNext()) {
    var campaign = campaignIterator.next();
    try {
      // Use either this template or change the campaignId in utm_id to valuetrack {campaignid}
      var trackingTemplate = "{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_id=" + campaign.getId();
      // var trackingTemplate = "{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_id={campaignid}";
      campaign.urls().setTrackingTemplate(trackingTemplate);
      // Set custom parameters or perform other universal actions here
      campaign.urls().setCustomParameters({campaign: encodeURIComponent(campaign.getName())});
    } catch (e) {
      Logger.log("Error processing campaign " + campaign.getId() + " in " + campaignType + ": " + e.message);
    }
  }
}

 

-------------------------------------

 

Das Skript wurde von Jan Zdarsa entwickelt und sicherzustellen, dass die neueste Version vorliegt hier in GitHub zu finden. 

 

2.2. Multi Account UTM-Tracking Skript (Bis zu 50 Accounts)

 

-------------------------------------

function main() {
  const accountSelector = AdsManagerApp.accounts().withLimit(50); // Adjust the limit as needed
  accountSelector.executeInParallel('processAccount', 'allFinished');
}

function processAccount() {
  var account = AdsApp.currentAccount();
  Logger.log("Processing account: " + account.getCustomerId());

  // Process each campaign type with error handling
  tryHandleCampaigns(AdsApp.campaigns(), "Standard & Others");
  tryHandleCampaigns(AdsApp.shoppingCampaigns(), "Shopping");
  tryHandleCampaigns(AdsApp.performanceMaxCampaigns(), "Performance Max");
  // tryHandleCampaigns(AdsApp.videoCampaigns(), "Video");

  // Return a result that you can use later in allFinished (optional)
  return account.getCustomerId();
}

function tryHandleCampaigns(campaignIteratorFunction, campaignType) {
  try {
    handleCampaigns(campaignIteratorFunction, campaignType);
  } catch (e) {
    Logger.log("Error processing " + campaignType + " campaigns: " + e.message);
  }
}

function handleCampaigns(campaignIteratorFunction, campaignType) {
  var campaignIterator = campaignIteratorFunction
                            .withCondition('Status != REMOVED')
                            .get();
  while (campaignIterator.hasNext()) {
    var campaign = campaignIterator.next();
    try {
      // Use either this template or change the campaignId in utm_id to valuetrack {campaignid}
      var trackingTemplate = "{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_id=" + campaign.getId();
      // var trackingTemplate = "{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_id={campaignid}";
      campaign.urls().setTrackingTemplate(trackingTemplate);
      // Set custom parameters or perform other universal actions here
      campaign.urls().setCustomParameters({campaign: encodeURIComponent(campaign.getName())});
    } catch (e) {
      Logger.log("Error processing campaign " + campaign.getId() + " in " + campaignType + ": " + e.message);
    }
  }
}

// This function is optional but allows you to handle any results after all accounts are processed
function allFinished(results) {
  for (var i = 0; i < results.length; i++) {
    var result = results[i];
    if (result.getStatus() === 'OK') {
      Logger.log("Successfully processed account: " + result.getCustomerId());
    } else {
      Logger.log("Failed to process account: " + result.getCustomerId() + " with error: " + result.getError());
    }
  }
}

 

-------------------------------------

Das Skript wurde von Jan Zdarsa entwickelt und sicherzustellen, dass die neueste Version vorliegt hier in GitHub zu finden. 

 

WICHTIG bei der Anwendung der Skripte: Google Ads Skripts unterstützt aktuell noch nicht Demand Gen und Video Kampagnen (Stand: 05.12.2024). Diese Kampagnen-Typen müssen daher manuell mit UTM-Parametern hinterlegt werden.

 

Wie entwickeln sich die daten in GA4 nach implementierung?

Nach einigen Tagen sollte ein Shift in der Dimension Kampagnen in Google Analytics 4 bemerkbar machen. Das kann in den Berichten im Verlauf verfolgt werden:

 

Bildschirmfoto 2024-12-05 um 14.37.00

 

Somit viel Spaß bei der Anpassung und Happy Optimizing!

 

Quellen: 

https://ppcnewsfeed.com/blog/fix-organic-not-set-google-ads-campaign-name-in-ga4/

https://optimizesmart.com/p/stop-relying-on-auto-tagging-to-tag-your-ad-urls