Skrypt Google Ads: Budget Protector

Monitoring kosztów to jeden z kluczowych elementów zarządzania reklamami. Szczególnie jeśli pracujemy na wielu kontach.

Algorytm Google Ads pozwala na przekroczenie budżetu dziennego nawet dwukrotnie. Mamy np. kampanię z budżetem 30zł, a jej wczorajszy koszt wyniósł 55zł.

W niektórych wypadkach nieoczekiwane wzrosty kosztów mogą negatywnie wpłynąć na proces optymalizacji.

Poniższy skrypt Google Ads blokuje system przed wydaniem więcej niż ustaliliśmy. Jeżeli jakaś kampania przekroczy nasz dzienny budżet, aplikacja wstrzyma ją. Ponowne uruchomienie nastąpi po północy.

Skrypt sprawdza tylko te kampanie, którym nadamy etykietę.

Wymagany harmonogram: co godzinę

Konfiguracja:
1. Utwórz etykietę i oznacz nią kampanie, które ma sprawdzać skrypt
2. Wprowadź treść etykiety do zmiennej CAMPAIGN_LABEL


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


//Updated on 19.03.2020: Code structure improvements
//Updated on 14.02.2020: Time zone issue fixed

/*

Copyright 2020 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 CAMPAIGN_LABEL = 'Check'; // Looks for campaigns with that label 

// --------------------------------------- End of the configuration


function main() {

    checkPausedCampaigns();
    checkSpend();

}

//Check the spend
function checkSpend() {
    var allCampaigns = AdsApp.campaigns()
        .withCondition("LabelNames CONTAINS_ANY ['" + CAMPAIGN_LABEL + "']")
        .forDateRange("TODAY")
        .get();

    while (allCampaigns.hasNext()) {
        var iterator = allCampaigns.next();
        var campaignBudget = iterator.getBudget();
        var campaignCost = iterator.getStatsFor('TODAY').getCost();

        //Is the spend too high?
        if (campaignCost > campaignBudget) {

            //Pause the campaign
            iterator.pause();

            //Log the name of the paused campaign
            Logger.log("The campaign: " + iterator.getName() + " has exceeded the daily budget - time to pause it!");
        }
    }
}

//Is it the time to unpause the campaigns?   
function checkPausedCampaigns() {
    var time = Utilities.formatDate(new Date(), AdsApp.currentAccount().getTimeZone(), "HH");

    //Just to be safe, the script tries 3 times to unpause the campagins
    if (time === "00" || time === "01" || time === "02") {
        var pausedCampaigns = AdsApp.campaigns()
            .withCondition("LabelNames CONTAINS_ANY ['" + CAMPAIGN_LABEL + "']")
            .withCondition("Status = PAUSED")
            .get();
        while (pausedCampaigns.hasNext()) {
            var iterator = pausedCampaigns.next();

            //Unpause the campaign
            iterator.enable();

            //Log the name of the unpaused campaign
            Logger.log("It's a new day for campaign: " + iterator.getName() + " time to unpause it!");
        }
    }
}

Dodaj komentarz

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