PMax Intent Protector to skrypt Google Ads, który działa jak inteligentny filtr dla kampanii Performance Max. Jego zadaniem jest automatyczna analiza wyszukiwanych haseł i wykluczanie tych, które nie spełniają ustalonej przez Ciebie logiki.
Informacja:
Wersja Lite obsługuje ok. 30 do 70% wyszukiwanych haseł pojawiających się w kampaniach Performance Max. To ograniczenie po stronie Google Ads API i dotyczy wszystkich skryptów pobierających dane tego typu, które widziałem.
Na szczęście udało mi się znaleźć rozwiązanie, które pozwala pobrać komplet wyszukiwanych haseł. Dzięki temu wyniki w 100% zgadzają się z tym, co widzisz w panelu Google Ads.
Zachęcam do zakupu wersji PRO TUTAJ
PMax Intent Protector [Wersja PRO]
- pokrycie zapytań na poziomie 100%
- pełna kontrola nad tym, co uruchamia Performance Max
- mniejsze ryzyko przepalania budżetu na frazy, których nie widzisz w wersji Lite
- lepsza jakość danych do decyzji, bo nie opierasz się na wycinku
Skrypt weryfikuje zapytania pod kątem wybranych słów kluczowych, dzięki czemu odwracasz standardowy proces optymalizacji.
Zamiast zastanawiać się, czego nie chcesz wyświetlać, wskazujesz to, co ma dla Ciebie największą wartość. Inaczej mówiąc, określasz słowa kluczowe, które muszą pojawić się w wyszukiwanym haśle, aby skrypt uznał je za trafne.
Jeśli skrypt znajdzie w raporcie hasło, które nie zawiera żadnego z Twoich słów, automatycznie wyklucza je z kampanii w dopasowaniu ścisłym.
Tutaj doprecyzję jedną kwestię:

Na chwilę obecną nie ma możliwości dodawania negatywnych słów kluczowych do kampanii Performance Max za pomocą skryptów.
Na szczęście można to obejść, dodając je do listy wykluczających słów kluczowych, którą następnie można przypisać do kampanii PMax.
Przykład zastosowania PMax Intent Protector
Załóżmy, że sprzedajesz szkła hartowane do iPhone’ów. Celem kampanii jest pozyskiwanie ruchu z intencją zakupu szkła ochronnego, a nie generowanie zasięgu na ogólne frazy dotyczące samych telefonów.
W praktyce Performance Max zaczyna jednak wyświetlać reklamy na zapytania typu „iPhone 15” lub „iPhone 15 Pro cena”. Są to wyszukiwania bez intencji zakupu szkła, z bardzo wysokim kosztem kliknięcia i znikomą wartością sprzedażową.
W PMax Intent Protector definiujesz konkretne słowa kluczowe, które muszą pojawić się w zapytaniu np: „szkło”, „szkło hartowane”, „ochrona ekranu”.
Skrypt automatycznie wyklucza wszystkie zapytania, które nie zawierają żadnego z tych słów. Dzięki temu kampania przestaje konkurować o drogie, ogólne frazy produktowe, a budżet jest kierowany na zapytania zgodne z założoną intencją.
Opis Logiki skryptu
Skrypt działa w oparciu o filtr typu Negative Match.
Definiujesz listę słów kluczowych w zmiennej EXCLUDE_QUERIES_WITHOUT.
Ta lista tworzy obszar zapytań, na które kampania może się wyświetlać.
Dla każdego zapytania z raportu wyszukiwań skrypt sprawdza:
czy zawiera przynajmniej jedno słowo z tej listy.
Inaczej mówiąc, jest to Logika typu LUB:
jeśli zapytanie zawiera słowo A LUB słowo B LUB słowo C – wyszukiwane hasło zostaje i nic się z nim nie dzieje.
Jeśli wyszukiwane hasło nie zawiera żadnego z tych słów, skrypt uznaje je za nietrafne i dodaje do listy wykluczających słów kluczowych jako dopasowanie ścisłe.
W praktyce oznacza to, że nie wykluczasz pojedynczych złych haseł ręcznie.
Budujesz zbiór „dozwolonych” słów, a wszystko poza nim jest automatycznie odcinane.
Konfiguracja skryptu:
EXCLUDE_QUERIES_WITHOUT
Lista słów kluczowych definiujących dozwoloną intencję zapytań.
Jeśli zapytanie nie zawiera żadnego z tych słów, zostanie uznane za nietrafne i wykluczone.CAMPAIGN_LABEL
Etykieta kampanii, na których ma działać skrypt.
Skrypt analizuje tylko te kampanie Performance Max, które mają przypisaną tę etykietę. Pozwala to kontrolować zakres działania i uniknąć ingerencji w inne kampanie.NEGATIVE_KW_LIST
Nazwa wspólnej listy wykluczających słów kluczowych.
To do niej skrypt dodaje nietrafne zapytania w dopasowaniu ścisłym. Lista może być współdzielona między wieloma kampaniami PMax.LOOKBACK_DAYS
Zakres analizy raportu wyszukiwań w dniach.
Skrypt sprawdza zapytania wyłącznie z dnia poprzedniego. Dzięki temu reaguje tylko na nowe hasła, bez ponownej analizy starszych danych.
Miłego testowania!
Skopiuj poniższy kod i wklej na poziomie pojedynczego konta (nie działa z poziomu MCK).
/*
Copyright 2025 Krzysztof Bycina, www.LiveAds.pl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// =========================
// KONFIGURACJA
// =========================
// Lista słów kluczowych, które MUSZĄ pojawić się w zapytaniu.
// Jeśli zapytanie nie zawiera żadnego z tych słów, zostanie wykluczone.
var EXCLUDE_QUERIES_WITHOUT = ["szkło", "ochrona ekranu"];
// Etykieta kampanii Performance Max, na których ma działać skrypt.
// Skrypt analizuje wyłącznie kampanie oznaczone tą etykietą.
var CAMPAIGN_LABEL = "PMax_Intent";
// Nazwa wspólnej listy wykluczających słów kluczowych.
// To do tej listy skrypt dodaje nietrafne zapytania (dopasowanie ścisłe).
var NEGATIVE_KW_LIST = "kw_list";
// Zakres analizy raportu wyszukiwań w dniach.
// Wartość 1 oznacza analizę zapytań wyłącznie z dnia poprzedniego.
var LOOKBACK_DAYS = 1;
// --------------------
// =========================
// KONIEC KONFIGURACJI
// =========================
// Poniżej nic nie zmieniaj
function main() {
var _0xEngine = {
execute: function() {
try {
this._init();
var _c = AdsApp[this._gate(0)]()
[this._gate(2)]("LabelNames CONTAINS_ANY ['" + CAMPAIGN_LABEL + "']")
[this._gate(2)]("Status = ENABLED")
.get();
var _q = [];
while (_c.hasNext()) {
var _x = _c.next();
_q.push({ i: _x.getId(), n: _x.getName() });
}
if (_q.length === 0) {
Logger.log("Brak aktywnych kampanii PMax z etykietą: " + CAMPAIGN_LABEL);
return;
}
var _l = AdsApp[this._gate(1)]()
[this._gate(2)]("Name = '" + NEGATIVE_KW_LIST + "'")
.get();
if (!_l.hasNext()) throw new Error("Lista '" + NEGATIVE_KW_LIST + "' nie istnieje!");
var _L = _l.next();
var _f = function(d) {
var _t = new Date(Date.now() - (d * 86400000));
return Utilities.formatDate(
_t,
AdsApp.currentAccount().getTimeZone(),
"yyyyMMdd"
);
};
var _s = _f(LOOKBACK_DAYS);
var _e = _f(1);
_q.forEach(function(_o) {
Logger.log("--- Analiza kampanii: " + _o.n + " ---");
var _sql1 = "SELECT " +
"campaign_search_term_insight.id " +
"FROM " +
"campaign_search_term_insight " +
"WHERE " +
"campaign.id = '" + _o.i + "' " +
"AND " +
"segments.date BETWEEN " + _s + " AND " + _e;
var _r1 = AdsApp[this._gate(4)](_sql1);
while (_r1.hasNext()) {
var _id = _r1.next().campaignSearchTermInsight.id;
var _sql2 = "SELECT " +
"segments.search_term, " +
"segments.search_subcategory " +
"FROM " +
"campaign_search_term_insight " +
"WHERE " +
"campaign.id = '" + _o.i + "' " +
"AND " +
"campaign_search_term_insight.id = '" + _id + "' " +
"AND " +
"segments.date BETWEEN " + _s + " AND " + _e;
var _r2 = AdsApp[this._gate(4)](_sql2);
while (_r2.hasNext()) {
var _row = _r2.next();
var _str = _row.segments.searchTerm;
if (_str && (function(q, ex) {
var v = true;
for (var i = 0; i < ex.length; i++) {
if (q.toLowerCase().indexOf(ex[i].toLowerCase()) !== -1) {
v = false;
break;
}
}
return v;
})(_str, EXCLUDE_QUERIES_WITHOUT)) {
_L.addNegativeKeyword('[' + _str + ']');
Logger.log("Wysłano do listy: " + _str);
}
}
}
}.bind(this));
Logger.log("Zakończono sprawdzanie.");
} catch (err) {
Logger.log("Błąd krytyczny: " + err);
}
},
_init: function() {
var _l = AdsApp[this._gate(3)]()
[this._gate(2)]("Name = '" + CAMPAIGN_LABEL + "'")
.get();
if (!_l.totalNumEntities()) {
AdsApp[this._gate(5)](CAMPAIGN_LABEL);
}
},
_gate: function(n) {
var _d_al = [112, 101, 114, 102, 111, 114, 109, 97];
var _d_be = [110, 99, 101, 77, 97, 120, 67, 97];
var _d_ga = [109, 112, 97, 105, 103, 110, 115, 58];
var _d_de = [110, 101, 103, 97, 116, 105, 118, 101];
var _d_ep = [75, 101, 121, 119, 111, 114, 100, 76];
var _d_ze = [105, 115, 116, 115, 58, 119, 105, 116];
var _d_et = [104, 67, 111, 110, 100, 105, 116, 105];
var _d_th = [111, 110, 58, 108, 97, 98, 101, 108];
var _d_io = [115, 58, 115, 101, 97, 114, 99, 104];
var _d_ka = [58, 99, 114, 101, 97, 116, 101, 76];
var _d_la = [97, 98, 101, 108];
var _all = []
.concat(_d_al).concat(_d_be).concat(_d_ga)
.concat(_d_de).concat(_d_ep).concat(_d_ze)
.concat(_d_et).concat(_d_th).concat(_d_io)
.concat(_d_ka).concat(_d_la);
return String
.fromCharCode
.apply(null, _all)
.split(":")[n];
}
};
_0xEngine.execute();
}
Freelancer Google Ads z doświadczeniem w e-commerce
![PMax Intent Protector [Wersja PRO]](https://liveads.pl/wp-content/uploads/2026/01/PMax-Intent-Protector-Wersja-PRO-600x400.jpg)