Automatic Search Query Excluder for Shopping

Skrypt automatycznie wyklucza wyszukiwane hasła w kampaniach zakupowych, które nie zawierają wskazanych słów.

Załóżmy, że sprzedajemy piloty do telewizorów. Oczywiste jest, że chcemy, aby wyszukiwane hasła zwierały słowo pilot. Bez niego może okazać się, że użytkownicy chcą po prostu kupić telewizor. Szczególnie jeśli raport wyszukiwanych haseł wskazuje wiele fraz zawierających tylko modele telewizorów.

Właśnie w takich sytuacjach pomoże na poniższy skrypt Google Ads.

Naszym zadaniem są dwie rzeczy:

  1. Weryfikacja kampanii zakupowych.
    Szukamy czy są sytuacje, gdzie brak jakiegoś słowa kluczowego powoduje, że wyszukiwane hasła tracą dla nas wartość i nie generują konwersji
  2. Wybór tego słowa i wstawianie go w konfiguracji skryptu

W powyższym przykładzie byłoby to słowo: „pilot”.

Wszystkie wyszukiwane hasła, które nie będą zawierały tej frazy, zostaną automatycznie dodane jako wykluczenia w dopasowaniu ścisłym.

Harmonogram: raz dziennie
Konfiguracja:
1. Wstaw wymagane słowo do zmiennej EXCLUDE_QUERIES_WITHOUT
Możemy dodać nieskończoną ilość wyrazów.
Każdy powinien być w cudzysłowie i oddzielony przecinkiem.

2. Nazwę etykiety wstaw do zmiennej: CAMPAIGN_LABEL

3. Oznacz etykietą wybraną kampanię

Uwaga: skrypt wykonuje zmiany tylko w kampaniach zakupowych.


Po więcej na temat Skryptów zapraszam na grupę FB o automatyzacji:
https://www.facebook.com/groups/skrypty.google.ads


/*
Copyright 2021 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.
*/

//Configuration:
var EXCLUDE_QUERIES_WITHOUT = ["YOUR KEYWORD HERE"];
var CAMPAIGN_LABEL = "YOUR LEBEL HERE";

//End of the configuration

function main() {
    checkLabel();
    var campaignsIds = findShoppingIds();
    var badQueries = findBadQueries(campaignsIds);
    if (badQueries[0]) {
        Logger.log("The script adds " + badQueries.length + " new negative keywords...")
        addNegativeKeywordsToCampaign(badQueries)
    } else {
        Logger.log("All search queries meet your requirements.")
    }
}

function findShoppingIds() {
    var campaignsIds = [];
    var campaignsSelector = AdsApp.shoppingCampaigns()
        .withCondition("LabelNames CONTAINS_ANY ['" + CAMPAIGN_LABEL + "']")
        .withCondition("Status = ENABLED")
        .forDateRange("TODAY")
    var campaignsIterator = campaignsSelector.get();
    while (campaignsIterator.hasNext()) {
        var theCampaign = campaignsIterator.next();
        campaignsIds.push(theCampaign.getId());
    }
    return campaignsIds;
}

function findBadQueries(campaignIds) {
    var badQueries = [];
    var report = AdsApp.report(
        'SELECT Query,Clicks,Impressions,Cost,Conversions,CampaignId ' +
        ' FROM SEARCH_QUERY_PERFORMANCE_REPORT ' +
        ' WHERE CampaignId IN [' + campaignIds.join(",") + '] ' +
        ' DURING YESTERDAY ');
    var rows = report.rows();
    while (rows.hasNext()) {
        var isItBadQuery = true;
        var row = rows.next();
        var query = row['Query'];
        var length = EXCLUDE_QUERIES_WITHOUT.length;
        while (length--) {
            if (query.indexOf(EXCLUDE_QUERIES_WITHOUT[length]) != -1) {
                isItBadQuery = false;
            }
        }
        if (isItBadQuery) {
            badQueries.push(row['Query']);
        }
    }
    return badQueries;
}

function addNegativeKeywordsToCampaign(badQueries) {
    var campaignIterator = AdsApp.shoppingCampaigns()
        .withCondition("LabelNames CONTAINS_ANY ['" + CAMPAIGN_LABEL + "']")
        .get();
    if (campaignIterator.hasNext()) {
        var campaign = campaignIterator.next();
        Logger.log("Selected campaign: " + campaign.getName());
        badQueries.forEach(function(badQuery) {
            campaign.createNegativeKeyword('[' + badQuery + ']');
            Logger.log(badQuery + " --> added as an exact negatvie keyword");
        });
    }
}

function checkLabel() {
    var labelIterator = AdsApp.labels().withCondition("Name = '" + CAMPAIGN_LABEL + "'").get();
    if (!labelIterator.totalNumEntities()) {
        AdsApp.createLabel(CAMPAIGN_LABEL);
    }
}

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *