AutomatyzacjaSkrypty Google AdsSkrypt „Optimized Targeting Checker” – gdzie włączone jest kierowanie zoptymalizowane

2 marca 20260

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.

Skrypt "Optimized Targeting Checker" - gdzie włączone jest kierowanie zoptymalizowane

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, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#39;");
}

function escapeApostrophes_(s) {
  return String(s).replace(/'/g, "\\'");
}

Po chwili otrzymasz maila w takiej postaci:

Skrypt "Optimized Targeting Checker" - gdzie włączone jest kierowanie zoptymalizowane

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, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#39;");
}

I tyle – po chwili masz w skrzynce listę miejsc, które warto przejrzeć.

Skrypt "Optimized Targeting Checker" - gdzie włączone jest kierowanie zoptymalizowane

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.

 

Leave a Reply

Your email address will not be published.