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.
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.
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.
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:
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