Na wielu kontach Google Ads kierowanie zoptymalizowane (Optimized Targeting) bywa włączone “gdzieś po drodze” – przy testach, zmianach struktury, nowych kampaniach. Problem w tym, że rzadko kto regularnie sprawdza, gdzie dokładnie ta opcja jest aktywna. A to ustawienie potrafi znacząco wpłynąć na zasięg i sposób wydawania budżetu w kampanii w sieci reklamowej. Dlatego przygotowałem prosty skrypt Google Ads, który w kilka chwil pokazuje, w których kampaniach i grupach reklam kierowanie zoptymalizowane jest włączone. Bez ręcznego klikania, bez zgadywania – szybki, techniczny przegląd ustawień, który pozwala odzyskać kontrolę nad targetowaniem. Szczegóły poniżej.

Jeśli chcesz zrozumieć, czym dokładnie jest kierowanie zoptymalizowane i dlaczego warto mieć je pod kontrolą, przeczytaj mój wpis sprzed 1,5 roku: „Kierowanie zoptymalizowane w sieci reklamowej – jak i gdzie wyłączyć„.
Co robi skrypt i dlaczego to przydatne
Ten skrypt przeszukuje konto (albo wiele kont w ramach MCK) i wyciąga listę wszystkich grup reklam, w których pole ad_group.optimized_targeting_enabled = TRUE. Czyli raportuje dokładnie tam, gdzie to ustawienie faktycznie żyje – na poziomie grup reklam.
W mailu dostajesz czytelną tabelę z:
- nazwą i numerem ID konta (w wersji MCK),
- nazwą kampanii,
- typem kampanii,
- statusem kampanii,
- nazwą grupy reklam
- statusem grupy reklam,
- informacją, że kierowanie zoptymalizowane jest włączone (ON).
To jest szybki radar, który pokazuje Ci miejsca potencjalnego rozjazdu z Twoją strategią targetowania.
Największe zalety w praktyce
1) Szybko widzisz, gdzie może uciekać budżet w kampanii w sieci reklamowej.
Jeśli budżet rozlewa się szerzej niż plan, kierowanie zoptymalizowane bywa jedną z przyczyn. Skrypt pomaga namierzyć, gdzie ta opcja jest włączona, bez ręcznego sprawdzania kampania po kampanii.
2) Porządek w kampaniach – szczególnie gdy konto jest duże.
Na większych kontach (albo przy kilku osobach pracujących na kampaniach) łatwo o sytuację: ktoś włączył, ktoś testował, ktoś zapomniał wyłączyć. Ten raport to sposób, żeby wrócić do kontroli w 2 minuty.
3) Działa zarówno jednorazowo, jak i w tle jako monitoring.
Skrypt możesz uruchomić raz, kiedy robisz audyt, albo ustawić harmonogram (np. codziennie, raz w tygodniu), żeby regularnie kontrolować, czy w kampaniach nie pojawiły się nowe grupy z włączonym kierowaniem zoptymalizowanym.
4) Dwie wersje: MCK i pojedyncze konto
Poniżej znajdziesz dwie wersje skryptu:
- na poziomie MCK – dla osób zarządzających wieloma kontami Google Ads (świetne, gdy masz klientów i chcesz mieć jeden raport o implementacji tej opcji),
- wersja na pojedyncze konto – jeśli działasz na jednym koncie i chcesz po prostu dostać raport mailowo.
Jak działa wersja MCK (dla wielu kont)
W MCK skrypt sprawdza tylko te konta podrzędne, które mają przypisaną etykietę, np. XYZ. To wygodne, bo nie musisz uruchamiać raportu dla całego MCK oraz możesz kontrolować zakres audytu etykietą.
W ustawieniach masz też dwie proste flagi:
- ONLY_ENABLED_CAMPAIGNS = true – raportuje tylko aktywne kampanie,
- ONLY_ENABLED_ADGROUPS = true – raportuje tylko aktywne grupy reklam.
To ogranicza szum i pokazuje realnie działające elementy.
Konfiguracja:
var ACCOUNT_LABEL_NAME = „LABEL_NAME”; – tutaj wpisz nazwę etykiety ustawionej na poziomie wybranych kont Google Ads.
var EMAIL_RECIPIENT = „EMAIL_ADDRESS”; – tutaj wpisz adres mailowy, na który chcesz otrzymać wiadomość mailową z listą kampanii, w których włączone jest kierowanie zoptymalizowane.
/**
* MCC: Raport kont (z etykietą) z kampaniami, gdzie włączono Optimized Targeting by Marcin Wsół (marcinwsol.pl).
*
* Wymagania:
* - Skrypt uruchamiasz na poziomie MCC.
* - Na kontach (child accounts) dodaj etykietę o nazwie z ACCOUNT_LABEL_NAME.
* - Uzupełnij EMAIL_RECIPIENT.
*/
var ACCOUNT_LABEL_NAME = "LABEL_NAME"; // etykieta na koncie (child)
var EMAIL_RECIPIENT = "EMAIL_ADDRESS"; // <- podmień
var ONLY_ENABLED_CAMPAIGNS = true; // true = tylko aktywne kampanie
var ONLY_ENABLED_ADGROUPS = true; // true = tylko aktywne ad groups
function main() {
var accountsIter = MccApp.accounts()
.withCondition("LabelNames CONTAINS_ANY ['" + escapeApostrophes_(ACCOUNT_LABEL_NAME) + "']")
.get();
var rows = [];
var checkedAccounts = 0;
while (accountsIter.hasNext()) {
var account = accountsIter.next();
MccApp.select(account);
checkedAccounts++;
rows = rows.concat(findOptimizedTargetingRowsForAccount_());
}
sendEmailReport_(checkedAccounts, rows);
}
/**
* Zwraca wiersze dla 1 konta: wszystkie ad groups z optimized_targeting_enabled = true
* (z kontekstem kampanii).
*/
function findOptimizedTargetingRowsForAccount_() {
var customerId = AdsApp.currentAccount().getCustomerId();
var accountName = AdsApp.currentAccount().getName();
var campaignStatusCond = ONLY_ENABLED_CAMPAIGNS ? " AND campaign.status = 'ENABLED' " : "";
var adGroupStatusCond = ONLY_ENABLED_ADGROUPS ? " AND ad_group.status = 'ENABLED' " : "";
// Uwaga: Optimized Targeting jest na ad_group, więc raportujemy na poziomie ad group.
// Filtrujemy tylko tam gdzie ON.
var query =
"SELECT " +
" campaign.name, " +
" campaign.advertising_channel_type, " +
" campaign.status, " +
" ad_group.name, " +
" ad_group.status, " +
" ad_group.optimized_targeting_enabled " +
"FROM ad_group " +
"WHERE ad_group.optimized_targeting_enabled = TRUE " +
campaignStatusCond +
adGroupStatusCond +
"ORDER BY campaign.name, ad_group.name";
var report = AdsApp.search(query);
var out = [];
while (report.hasNext()) {
var r = report.next();
out.push({
customerId: customerId,
accountName: accountName,
campaignName: r.campaign.name,
channelType: r.campaign.advertisingChannelType,
campaignStatus: r.campaign.status,
adGroupName: r.adGroup.name,
adGroupStatus: r.adGroup.status,
optimizedTargeting: r.adGroup.optimizedTargetingEnabled
});
}
return out;
}
function sendEmailReport_(checkedAccounts, rows) {
var subject = "[MCC] Optimized Targeting - raport (" + formatDate_(new Date()) + ")";
var html = [];
html.push("<p><b>Sprawdzone konta (z etykietą):</b> " + checkedAccounts + "</p>");
html.push("<p><b>Wykryte ad groups z Optimized Targeting = ON:</b> " + rows.length + "</p>");
if (rows.length === 0) {
html.push("<p>Brak kampanii / ad groups z włączonym Optimized Targeting.</p>");
MailApp.sendEmail({
to: EMAIL_RECIPIENT,
subject: subject,
htmlBody: html.join("")
});
return;
}
html.push("<table border='1' cellpadding='6' cellspacing='0' style='border-collapse:collapse;font-family:Arial;font-size:12px;'>");
html.push("<tr style='background:#f2f2f2;'>" +
"<th>Konto</th>" +
"<th>Customer ID</th>" +
"<th>Kampania</th>" +
"<th>Typ</th>" +
"<th>Status kampanii</th>" +
"<th>Ad group</th>" +
"<th>Status ad group</th>" +
"<th>Optimized targeting</th>" +
"</tr>");
for (var i = 0; i < rows.length; i++) {
var x = rows[i];
html.push("<tr>" +
"<td>" + escapeHtml_(x.accountName) + "</td>" +
"<td>" + escapeHtml_(x.customerId) + "</td>" +
"<td>" + escapeHtml_(x.campaignName) + "</td>" +
"<td>" + escapeHtml_(x.channelType) + "</td>" +
"<td>" + escapeHtml_(x.campaignStatus) + "</td>" +
"<td>" + escapeHtml_(x.adGroupName) + "</td>" +
"<td>" + escapeHtml_(x.adGroupStatus) + "</td>" +
"<td><b>ON</b></td>" +
"</tr>");
}
html.push("</table>");
MailApp.sendEmail({
to: EMAIL_RECIPIENT,
subject: subject,
htmlBody: html.join("")
});
}
/* Helpers */
function formatDate_(d) {
var pad = function(n){ return (n < 10 ? "0" : "") + n; };
return pad(d.getDate()) + "." + pad(d.getMonth() + 1) + "." + d.getFullYear();
}
function escapeHtml_(s) {
if (s === null || s === undefined) return "";
return String(s)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function escapeApostrophes_(s) {
return String(s).replace(/'/g, "\\'");
}Po chwili otrzymasz maila w takiej postaci:

Wersja na pojedyncze konto Google Ads
Jeśli masz jedno konto (albo nie korzystasz z MCK), wersja ta robi dokładnie to samo, tylko bez filtrowania po etykietach i bez przełączania kont. Nadal możesz uruchomić skrypt raz i dostać raport na maila lub ustawić harmonogram i mieć stały monitoring.
Konfiguracja:
var EMAIL_RECIPIENT = „EMAIL_ADDRESS”; – tutaj wpisz adres mailowy, na który chcesz otrzymać wiadomość mailową z listą kampanii, w których włączone jest kierowanie zoptymalizowane.
Panel do wdrożenia skryptu znajdziesz w zakładce NARZĘDZIA → DZIAŁANIA ZBIORCZE → SKRYPTY.
/**
* Single account: Raport kampanii i ad groups, gdzie włączono Optimized Targeting by Marcin Wsół (marcinwsol.pl).
*
* Wymagania:
* - Skrypt uruchamiasz na poziomie pojedynczego konta Google Ads (nie MCC).
* - Uzupełnij EMAIL_RECIPIENT.
*/
var EMAIL_RECIPIENT = "EMAIL_ADDRESS";
var ONLY_ENABLED_CAMPAIGNS = true; // true = tylko aktywne kampanie
var ONLY_ENABLED_ADGROUPS = true; // true = tylko aktywne ad groups
function main() {
var rows = findOptimizedTargetingRowsForAccount_();
sendEmailReport_(rows);
}
/**
* Zwraca wiersze dla 1 konta: wszystkie ad groups z optimized_targeting_enabled = true
* (z kontekstem kampanii).
*/
function findOptimizedTargetingRowsForAccount_() {
var customerId = AdsApp.currentAccount().getCustomerId();
var accountName = AdsApp.currentAccount().getName();
var campaignStatusCond = ONLY_ENABLED_CAMPAIGNS ? " AND campaign.status = 'ENABLED' " : "";
var adGroupStatusCond = ONLY_ENABLED_ADGROUPS ? " AND ad_group.status = 'ENABLED' " : "";
// Uwaga: Optimized Targeting jest na ad_group, więc raportujemy na poziomie ad group.
// Filtrujemy tylko tam gdzie ON.
var query =
"SELECT " +
" campaign.name, " +
" campaign.advertising_channel_type, " +
" campaign.status, " +
" ad_group.name, " +
" ad_group.status, " +
" ad_group.optimized_targeting_enabled " +
"FROM ad_group " +
"WHERE ad_group.optimized_targeting_enabled = TRUE " +
campaignStatusCond +
adGroupStatusCond +
"ORDER BY campaign.name, ad_group.name";
var report = AdsApp.search(query);
var out = [];
while (report.hasNext()) {
var r = report.next();
out.push({
customerId: customerId,
accountName: accountName,
campaignName: r.campaign.name,
channelType: r.campaign.advertisingChannelType,
campaignStatus: r.campaign.status,
adGroupName: r.adGroup.name,
adGroupStatus: r.adGroup.status,
optimizedTargeting: r.adGroup.optimizedTargetingEnabled
});
}
return out;
}
function sendEmailReport_(rows) {
var subject = "[KONTO] Optimized Targeting - raport (" + formatDate_(new Date()) + ")";
var html = [];
html.push("<p><b>Konto:</b> " + escapeHtml_(AdsApp.currentAccount().getName()) + "</p>");
html.push("<p><b>Customer ID:</b> " + escapeHtml_(AdsApp.currentAccount().getCustomerId()) + "</p>");
html.push("<p><b>Wykryte ad groups z Optimized Targeting = ON:</b> " + rows.length + "</p>");
if (rows.length === 0) {
html.push("<p>Brak kampanii / ad groups z włączonym Optimized Targeting.</p>");
MailApp.sendEmail({
to: EMAIL_RECIPIENT,
subject: subject,
htmlBody: html.join("")
});
return;
}
html.push("<table border='1' cellpadding='6' cellspacing='0' style='border-collapse:collapse;font-family:Arial;font-size:12px;'>");
html.push("<tr style='background:#f2f2f2;'>" +
"<th>Kampania</th>" +
"<th>Typ</th>" +
"<th>Status Kampanii</th>" +
"<th>Ad Group</th>" +
"<th>Status Ad Group</th>" +
"<th>Optimized Targeting</th>" +
"</tr>");
for (var i = 0; i < rows.length; i++) {
var x = rows[i];
html.push("<tr>" +
"<td>" + escapeHtml_(x.campaignName) + "</td>" +
"<td>" + escapeHtml_(x.channelType) + "</td>" +
"<td>" + escapeHtml_(x.campaignStatus) + "</td>" +
"<td>" + escapeHtml_(x.adGroupName) + "</td>" +
"<td>" + escapeHtml_(x.adGroupStatus) + "</td>" +
"<td><b>ON</b></td>" +
"</tr>");
}
html.push("</table>");
MailApp.sendEmail({
to: EMAIL_RECIPIENT,
subject: subject,
htmlBody: html.join("")
});
}
/* Helpers */
function formatDate_(d) {
var pad = function(n){ return (n < 10 ? "0" : "") + n; };
return pad(d.getDate()) + "." + pad(d.getMonth() + 1) + "." + d.getFullYear();
}
function escapeHtml_(s) {
if (s === null || s === undefined) return "";
return String(s)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}I tyle – po chwili masz w skrzynce listę miejsc, które warto przejrzeć.

Dla kogo to jest?
- dla osób, które prowadzą kampanie w sieci reklamowej, Demand Gen lub kampanie z grupami reklam, gdzie kierowanie zoptymalizowane może się pojawić,
- dla specjalistów, którzy chcą szybko sprawdzić czy tu coś nie poszło za szeroko,
- dla osób zarządzających wieloma kontami w ramach MCK i chcących mieć prosty, cykliczny audyt ustawień.
Podsumowanie
To nie jest skrypt, który „zrobi za Ciebie wynik”. To skrypt, który daje Ci kontrolę. W kilka minut wiesz, gdzie kierowanie zoptymalizowane jest włączone i czy to była świadoma decyzja, czy efekt uboczny testów sprzed kilku miesięcy.
Przy większych kontach albo w MCK taki monitoring potrafi oszczędzić sporo nerwów i budżetu. Czasem wystarczy jedno ustawienie, żeby kampania zaczęła iść w zupełnie inną stronę niż planowałeś/aś. Lepiej wiedzieć to wcześniej niż po analizie kosztu konwersji.
| WSPÓŁPRACA ZE MNĄ |
| Od 2011 roku jako specjalista Google Ads zajmuję się prowadzeniem i optymalizacją kampanii w systemie reklamowym Google. Dotychczas przeprowadziłem ponad 2300 kampanii, których budżet przekroczył już 30 mln zł. Jeśli szukasz kogoś komu chcesz zlecić prowadzenie swoich kampanii, napisz do mnie. Pracuję tylko z firmami, które poważnie podchodzą do tematu, dlatego zapoznaj się proszę z moimi zasadami współpracy. Jeśli je akceptujesz, wyślij mi wiadomość :) Jeśli interesuje Cię audyt kampanii Google Ads lub konsultacje, również mogę pomóc w tej kwestii. |

