Dzięki automatycznemu tagowaniu i połączeniu kont Google Ads i Analytics, dane o kampanii, słowie kluczowym i innych parametrach kampanii są importowane do Analytics na podstawie identyfikatora kliknięcia gclid. W wyniku ograniczeń związanych ze zgodą użytkownika na przetwarzanie danych, w niektórych przypadkach nie będzie on jednak mógł być przetwarzany.
Dlaczego tak się dzieje? Na podstawie identyfikatora gclid Google może identyfikować użytkownika, stąd przesyłanie go do innych systemów i łączenie z innymi danymi bez wymaganej zgody użytkownika może budzić wątpliwości na gruncie zasad ochrony prywatności. Z tego powodu taki identyfikator może nie zostać czasem przetworzony przez Analytics i może to dotyczyć istotnej części ruchu.
W takich sytuacjach Analytics jest co prawda w stanie przypisać ten ruch do Google Ads (google / cpc) wykorzystując sam fakt, że parametr gclid jest w linku oraz inne dodatkowe parametry (np. gad_source=1), ale już np. kampania przypisana do takiej wizyty będzie (not set) lub czasem (organic).
Parametr gclid może też zostać usunięty przez niektóre przeglądarki w trybach zwiększonej ochrony prywatności.
Parametry utm na pomoc
Aby ograniczyć konsekwencje takich sytuacji, zaleca się dodawanie parametrów utm do kampanii Google Ads. Dzięki temu będziemy widzieć w Analytics przynajmniej podstawowe dane, takie jak kampania czy słowo kluczowe.
Ponieważ adresów URL reklam w koncie Google Ads jest zazwyczaj wiele, a nowe komponenty reklamowe są często tworzone na porządku dziennym, taka operacja może wydawać się istotną uciążliwością.
Funkcje śledzenia
Aby nie trzeba było dodawać parametrów do każdego linku, w Google Ads dostępne są funkcje śledzenia, które automatycznie modyfikują końcowe adresy URL wg określonej w nich reguły, np. dodają na końcu adresu określony ciąg znaków.
Do parametrów śledzących najlepiej nadaje się funkcja sufiksu końcowego adresu URL, która po prostu dodaje do linku określone w tym polu parametry. Jedną z jej zalet jest to, że nie wchodzi w konflikt z przekierowaniem do zewnętrznych systemów śledzących, z których niektórzy reklamodawcy korzystają, a które zazwyczaj wykorzystują szablon śledzenia (zob. artykuł pomocy Google Ads o funkcjach wspierających śledzenie).
Parametry ValueTrack
Parametry ValueTrack to dynamiczne parametry URL stosowane w Google Ads, które umożliwiają automatyczne wstawianie do linku informacji o kliknięciach w reklamę do adresu URL, takich jak słowo kluczowe czy nazwa lub identyfikator kampanii.
Wykorzystując parametry ValueTrack w szablonie śledzenia lub sufiksie adresu URL możemy w zasadzie jednym wzorcem ustawionym na poziomie konta zapewnić sobie dodawanie odpowiednich parametrów utm do adresów docelowych dla każdej reklamy.
Wystarczy dodać następujący sufiks końcowego adresu URL w ustawieniach konta Google Ads:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads
Zauważ jednak, że w powyższym sufiksie do utm_campaign przekazywany jest identyfikator kampanii, a nie jej nazwa. Jest tak dlatego, że nazwa kampanii nie jest dostępnym parametrem ValueTrack (zob. artykuł pomocy dot. ValueTrack od Google).
Jeśli chcemy, aby znalazła się tam nazwa kampanii, trzeba jej nazwę wprowadzić bezpośrednio do adresu URL:
utm_source=google&utm_medium=cpc&utm_campaign=tu_wpisz_nazwę_kampanii&utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads
URI Encode
Nazwa kampanii musi mieć format URI, w którym pewne znaki zostaną zastąpione ich reprezentacją symboliczną ze znakiem %, np. spacja zostanie przedstawiona jako %20. W sieci jest dostępnych mnóstwo narzędzi pozwalających wykonać to kodowanie (szukaj w wyszukiwarce np. URI encode tool), bez problemu wykona to zadanie również AI (np. Chat GPT).
Przykładowo, dla kampanii [SE] Search – DSA ten parametr nazwy kampanii po zakodowaniu będzie miał postać %5BSE%5D%20Search%20-%20DSA.
Parametry niestandardowe
Wklejanie nazwy kampanii do każdego z sufiksów może być uciążliwe i łatwo popełnić błąd wykonując operacje na długim sufiksie. Dlatego lepszym rozwiązaniem jest stosowanie parametrów niestandardowych kampanii (są one dostępne również dla grup reklam).
ValueTrack zwraca wartość tego parametru w formacie {_parametr} (podkreślnik jest wyróżnikiem parametru niestandardowego i nie jest częścią nazwy parametru). Dlatego gdy dodamy do każdej kampanii parametr campaign, w którym zakodowana jest nazwa kampanii (w formacie URI), możemy globalnie na koncie zastosować następujący sufiks końcowego adresu URL:
utm_source=google&utm_medium=cpc&utm_campaign={_campaign}& utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads
Parametr niestandardowy nie może być dłuższy niż 250 znaków.
Mimo że ValueTrack pozwala na przekazywanie innych danych kliknięcia, w praktyce tylko niektóre z nich mogą być automatycznie odczytane z utm przez Analytics, który obsługuje tylko kilka dozwolonych parametrów utm (zob. artykuł Google o utm).
Nikt nie zabroni nam stosowania np. utm_adgroupid czy czy utm_affiliateid, ale by uwzględniać te dane w Analytics konieczne jest przekazanie tych wartości z wykorzystaniem wymiarów i danych niestandardowych (zob. artykuł pomocy Google).
Google zaleca używanie utm_source_platform=Google+Ads dla potrzeb Google Analytics.
Jeśli chcemy przekazywać dane o nazwie grupy reklam, analogiczne zmienne niestandardowe (np. _adgroup) trzeba będzie ustawić na poziomie grupy reklam.
Problem z nazwami kampanii
Używanie nazw kampanii (i grup reklam) w parametrach utm rodzi pewien problem w przypadku zmiany ich nazewnictwa. O ile tam, gdzie dane są synchronizowane z wykorzystaniem identyfikatora kliknięcia gclid, w Analytics zmiana nazwy kampanii zostanie uwzględniona w danych historycznch, to nazwa odczytana z utm pozostanie bez zmian. Może to więc spowodować, że w danych sprzed zmiany nazwy będziemy widzieć tę samą kampanię z dwiema różnymi nazwami: starą i nową. Kolejne zmiany nazw ten problem tylko pogłębią.
Z tego powodu należy raczej unikać zmiany nazw kampanii, zwłaszcza w Google Ads.
W przypadku źródeł tagowanych wyłącznie przez utm (bez automatycznej integracji z Google Analytics), zmiana nazwy też oczywiście nie ułatwi analizy. Tu jednak dwie nazwy będą występować równolegle w mniejszym stopniu i to tylko do czasu zamknięcia okna atrybucji, gdzie będziemy mieli do czynienia z przypisaniem sesji bezpośrednich i konwersji do wcześniejszych wizyt.
Automatyzacja tagowania
W przypadku dużych kont reklamowych ręczne wprowadzanie tagowania utm będzie procesem pracochłonnym i narażonym na błędy. Dlatego warto rozważyć rozwiązania, które pozwolą ten proces przynajmniej w części zautomatyzować.
Ustawienie sufiksu adresu URL na poziomie konta jest czynnością jednorazową i w zasadzie powinno problem rozwiązać. Jeśli chcemy, by dla różnych kampanii szablon śledzenia był inny, wciąż lepiej zastosować jeden szablon na koncie, a fragmenty, w których szablony będą różnić się między kampaniami, przekazać przez zmienne niestandardowe (np. opisana wyżej zmienna _campaign). Zmniejszy to straty danych, jeśli zapomnimy dodać parametry śledzenia w ustawieniach nowej kampanii, bo zostanie dodana przynajmniej część poprawnych parametrów.
Ustawienie zmiennych niestandardowych dla wielu kampanii Google Ads można wykonać seryjnie. Aby to zrobić, w Edytorze Google Ads należy wejść do widoku kampanii:
… a następnie go wyeksportować (Konto > Eksportuj > Eksportuj bieżący widok) do pliku CSV.
W pliku tym w Excelu generujemy podmieniamy wartość parametru niestandardowego przekształcając nazwę kampanii na format URI, wykorzystując w tym celu funkcję Encode URL (zob. artykuł pomocy Excela). Jeśli Twój Excel nie ma tej funkcji, jest ona też dostępna w arkuszach Google. Następnie tworzymy wartość pola Custom Parameters poprzedzając ten parametr ciągiem znaków {_campaign}= (użyj operatora łączenia tekstów „&”). Przykładowo, dla kampanii [SE] Search – DSA pole to będzie mieć postać:
{_campaign}=%5BSE%5D%20Search%20-%20DSA
Jeśli w wyeksportowanym pliku znajdują się już inne parametry niestandardowe, to pojawia się one w jednej kolumnie zawierającej zarówno klucze, jak i wartości wszystkich parametrów, czyli {_klucz1}=parametr1 {_klucz2}=parametr2 itd. – oddzielone spacjami. Wtedy trzeba będzie dokleić tak stworzony nowy parametr do już istniejących. Użyj operatora „&”, nie zapomnij o dodaniu spacji ” ” przed dodanym parametrem.
Po wykonaniu podmiany parametrów niestandardowych kopiujemy je do schowka i wklejamy do okna funkcji „Wykonaj wiele zmian” i przetwarzamy.
Alternatywnie, zapisujemy zmiany w pliku CSV i importujemy go (Konto > Importuj > Z pliku), co jest zalecane zwłaszcza w przypadku większych plików, gdzie schowek mógłby zająć zbyt wiele pamięci.
Automatyzacja skryptami
Opisane wyżej zadania nadają się do automatyzacji skryptami. Poniżej znajdziesz dwa przydatne skrypty ustawiające szablon sufiksu adresu końcowego reklamy (1a) oraz parametry niestandardowe zawierające nazwę kampanii (1b).
Jeśli szukasz (bezpłatnego) skryptu, wykona to zadanie dla całego MCK, skontaktuj się z nami.
Dalej znajdziesz też alternatywne rozwiązanie (2), które po prostu ustawia odpowiednie sufiksy dla kampanii, które już zawierają nazwę kampanii.
Zwróć uwagę na opisane w nich ograniczenia, w szczególności to, że skrypty nie zawsze zadziałają dla wszystkich typów kampanii. Pamiętaj też, że automatyzacji nie należy „pozostawiać samej sobie” i trzeba kontrolować poprawność jej działania.
UWAGA. W przypadku, gdy parametr _campaign ma wartość pustą (zdefiniowany jest klucz, ale brak wartości) , funkcje setCustomParameters i getCustomParameters generują aktualnie błędy. Aby ich uniknąć, jeśli z jakichś powodów na koncie znajdują się puste parametry, należy je usunąć lub przypisać im jakąś wartość np. „null” przed uruchomieniem skryptu. Niewkluczone, że w przyszłości te funkcje zostaną przez Google poprawione.
1a. Skrypt ustawiający sufiksy adresów URL dla kampanii
Teoretycznie powinien wystarczyć szablon śledzenia / suffix adresu url na poziomie konta. Zdarzały się jednak przypadki, że dla niektórych typów kampanii zadziałało dopiero po dodaniu na poziomie konta. Na pewno nie zaszkodzi ustawić go również na poziomie kampanii.
// Ten skrypt ustawia poniższy sufiks adresu URL dla wszystkich kampanii dla danego konta
// utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads
// (jeśli chcesz inny sufiks, zmodyfikuj w treści skryptu poniżej)
// UWAGA! Aby to działało, konieczne jest ustawienie parametrów niestandardowych kampanii (campaign) - oddzielny skrypt.
// UWAGA! Przed zastosowaniem usuń analogiczne szablony śledzenia jeśli z nich korzystasz ({lpurl}?utm_source=google&utm_medium...), bo inaczej będzie duplikacja tagów.
// SPRAWDŹ POWYŻSZE RÓWNIEŻ DLA USTAWIEŃ NA POZIOMIE KONTA I GRUP REKLAM!!!
// NA POZIOMIE KONTA RÓWNIEŻ USTAW TEN SUFIKS W PANELU GOOGLE ADS (obecnie jedyna możliwość)
// (!) [SCHEDULE] Skrypt należy go zaplanować by regularnie się wykonywał, np. co godzinę i dopisał parametry do nowych kampanii.
// Nie zaszkodzi go ręcznie uruchomić po dodaniu nowych kampanii.
// UWAGA: Na 24 października 2024:
// skrypt NIE działa dla niektórych typów kampanii, np. demand gen i video, te trzeba uzupełnić np. przez Google Ads Editor
// © ADEQUATE www.adequate.digital 2024
// Więcej informacji: https://adequate.digital/utm-dla-kampanii-google-ads-2/
function main() {
// Process standard campaigns (Search and Display)
var campaignIterator = AdsApp.campaigns().get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
processCampaign(campaign);
}
// Process Shopping campaigns
var shoppingCampaignIterator = AdsApp.shoppingCampaigns().get();
while (shoppingCampaignIterator.hasNext()) {
var campaign = shoppingCampaignIterator.next();
processCampaign(campaign);
}
// Process Performance Max campaigns
var pmaxCampaignIterator = AdsApp.performanceMaxCampaigns().get();
while (pmaxCampaignIterator.hasNext()) {
var campaign = pmaxCampaignIterator.next();
processCampaign(campaign);
}
// Optional: Attempt to process Demand Gen campaigns with error handling
try {
var demandGenCampaignIterator = AdsApp.demandGenCampaigns().get();
while (demandGenCampaignIterator.hasNext()) {
var campaign = demandGenCampaignIterator.next();
processCampaign(campaign);
}
} catch (e) {
Logger.log('Demand Gen campaigns may not be supported in this account: ' + e.message);
}
}
function processCampaign(campaign) {
// Set the Final URL Suffix at the campaign level
var campaignFinalUrlSuffix = "utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads";
campaign.urls().setFinalUrlSuffix(campaignFinalUrlSuffix);
Logger.log('Updated campaign "' + campaign.getName() + '" with campaign-level Final URL Suffix.');
}
1b. Skrypt ustawiający parametry niestandardowe dla kampanii
// Ten skrypt ustawia parametr niestandardowy campaign (_campaign) dla wszystkich kampanii w koncie.
// Parametr ten zawiera nazwę danej kampanii przekształconą do formatu dopuszczalnego dla URL i może być wykorzystywany w szablonie śledzenia lub sufiksie końcowych adresów URL
// PRZED ZASTOSOWANIEM UPEWNIJ SIĘ CZY PARAMETR TEN NIE JEST WYKORZYSTYWANY JAKIMŚ INNYM CELU, BY NIE NADPISAĆ WAŻNYCH INFORMACJI
// Sprawdź też czy przypadkiem nie ma parametru campaign o pustej wartości bo to może generować błędy
// (!) [SCHEDULE] Należy go zaplanować by regularnie się wykonywał, np. co godzinę, aby dopisał parametry do nowych kampanii
// Nie zaszkodzi go ręcznie uruchomić po dodaniu nowych kampanii
// UWAGA: Na 24 października 2024 r.:
// skrypt NIE działa dla wszystkich typów kampanii, w tym demand gen i video, te trzeba uzupełnić np. przez Google Ads Editorem.
// Pamiętaj że po zmianie nazwy kampanii w Analytics w danych historycznych pozostaną stare nazwy kampanii.
// Z tego powodu należy unikać zmian nazwy kampanii
// Lepiej unikać takich symboli w nazwach kampanii
// © ADEQUATE www.adequate.digital 2024
// Więcej informacji: https://adequate.digital/utm-dla-kampanii-google-ads-2/
function main() {
processAccount();
}
function processAccount() {
// Process standard campaigns (Search and Display)
var campaignIterator = AdsApp.campaigns().get();
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
processCampaign(campaign);
}
// Process Shopping campaigns
var shoppingCampaignIterator = AdsApp.shoppingCampaigns().get();
while (shoppingCampaignIterator.hasNext()) {
var campaign = shoppingCampaignIterator.next();
processCampaign(campaign);
}
// Process Performance Max campaigns
var pmaxCampaignIterator = AdsApp.performanceMaxCampaigns().get();
while (pmaxCampaignIterator.hasNext()) {
var campaign = pmaxCampaignIterator.next();
processCampaign(campaign);
}
// Optional: Attempt to process Demand Gen campaigns with error handling
try {
var demandGenCampaignIterator = AdsApp.demandGenCampaigns().get();
while (demandGenCampaignIterator.hasNext()) {
var campaign = demandGenCampaignIterator.next();
processCampaign(campaign);
}
} catch (e) {
Logger.log('Demand Gen campaigns may not be supported in this account: ' + e.message);
}
}
function processCampaign(campaign) {
var campaignName = campaign.getName();
// Percent-encode the campaign name
var modifiedCampaignName = encodeURIComponent(campaignName);
// Truncate to 250 characters
if (modifiedCampaignName.length > 250) {
Logger.log('Warning: The encoded campaign name for "' + campaignName + '" exceeds 250 characters and will be truncated.');
modifiedCampaignName = modifiedCampaignName.substring(0, 250);
}
// Get existing custom parameters at the campaign level
var customParameters = campaign.urls().getCustomParameters() || {};
// Update or add the 'campaign' parameter
customParameters['campaign'] = modifiedCampaignName;
// Set the updated custom parameters back to the campaign
campaign.urls().setCustomParameters(customParameters);
Logger.log('Updated campaign "' + campaignName + '" with campaign=' + modifiedCampaignName);
}
2. Alternatywne rozwiązanie
Alternatywnie, możesz po prostu ustawiać szablon śledzenia zawierający zakodowaną nazwę kampanii dla wszystkich kampanii. Ten skrypt będzie bardziej odporny na błędy, ale ustawianie brakujących parametrów przez Google Ads Editor będzie trudniejsze.
// Ten skrypt ustawia szablon śledzenia dla każdej kampanii w postaci
// utm_source=google&utm_medium=cpc&utm_campaign={TU NAZWA KAMPANII}&utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads
// skrypt NIE działa dla niektórych typów kampanii, np. demand gen i video, te trzeba uzupełnić np. przez Google Ads Editor
// © ADEQUATE www.adequate.digital 2024
// Więcej informacji: https://adequate.digital/utm-dla-kampanii-google-ads-2/
function main() {
// Helper function to update campaigns
function updateCampaignUrls(campaignIterator) {
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
// Get the campaign name and URI encode it
var campaignName = encodeURIComponent(campaign.getName());
// Construct the final URL suffix with UTM parameters
var finalUrlSuffix = 'utm_source=google&utm_medium=cpc&utm_campaign=' + campaignName +
'&utm_id={campaignid}&utm_term={keyword}&utm_content={creative}&utm_source_platform=Google+Ads';
// Set the final URL suffix for the campaign
campaign.urls().setFinalUrlSuffix(finalUrlSuffix);
// Log the changes for verification
Logger.log('Updated Final URL Suffix for Campaign: ' + campaign.getName());
Logger.log('New Final URL Suffix: ' + finalUrlSuffix);
}
}
// Update Search and Display campaigns by filtering
var searchAndDisplayCampaigns = AdsApp.campaigns()
.withCondition("AdvertisingChannelType IN ['SEARCH', 'DISPLAY']")
.get();
updateCampaignUrls(searchAndDisplayCampaigns);
// Update Performance Max campaigns
var performanceMaxCampaigns = AdsApp.performanceMaxCampaigns().get();
updateCampaignUrls(performanceMaxCampaigns);
// Update Shopping campaigns
var shoppingCampaigns = AdsApp.shoppingCampaigns().get();
updateCampaignUrls(shoppingCampaigns);
}
Ze względu na zmieniające się technologie, opisane funkcje i skrypty mogą się zdezaktualizować. Poinformuj nas, jeśli zauważysz, że artykuł wymaga aktualizacji lub znajdziesz w nim błędy.