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!"); } } }