Jednym z kluczowych zadań menedżera PPC jest dbanie o to, aby budżet konta Google Ads nie przekroczył ustalonej kwoty. Przy małej liczbie kont może to nie stanowić problemu, zwłaszcza jeśli pracujemy in-house i monitorujemy efektywność jednej firmy.
Wyzwanie pojawia się, gdy zarządzamy wieloma kontami, na przykład pracując w agencji lub jako freelancer.
Z pomocą przychodzi najnowszy skrypt: Total Account Budget. Jego zadaniem jest pilnowanie miesięcznego budżetu całego konta. Po przekroczeniu ustalonego progu skrypt wstrzyma wszystkie kampanie i wyśle e-mail potwierdzający.
W ustawieniach podajemy miesięczny budżet oraz procent wydatków, przy którym skrypt ma wstrzymać kampanie (standardowo 95%).
Dzięki temu możemy być pewni, że nasze konta nie przekroczą wydatków ustalonych z klientem, co zapewnia lepszą kontrolę nad kosztami.
Myślę, że może okazać się pomocny i pozwoli uwolnić trochę czasu (więcej optymalizacji działań zamiast monitorowania budżetów).
Ważna uwaga:
Skrypt wstrzymuje następujące typy kampanii:
- Klasyczna Zakupowa
- Performance Max
- Video
- Tekstowa
Kampanie Demand Gen obecnie nie są obsługiwane przez skrypty.
Można to obejść, zmniejszając procent wydatków, przy którym zostaną wstrzymane kampanie np. do 93% (proporcjonalnie do wielkości budżetu Demand Gen).
Harmonogram: co godzinę
Typ Skryptu: Pojedyncze konto
Konfiguracja:
1. Wprowadź kwotę budżetu do zmiennej TOTAL_BUDGET
2. Wprowadź procent wydatków, przy którym skrypt wstrzyma kampanie do zmiennej PERCENTAGE_THRESHOLD
4. Wprowadź swój e-mail do zmiennej EMAIL
Po więcej na temat Skryptów zapraszam na grupę FB:
https://www.facebook.com/groups/zaawansowane.google.ads
/* Copyright 2024 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 TOTAL_BUDGET = 5000; // Set your total monthly budget var PERCENTAGE_THRESHOLD = 90; // Set the percentage of the budget at which to start pausing campaigns var EMAIL = 'YOUR E-MAIL'; // Set your email address here // --------------------------------------- End of the configuration function main() { var account = AdsApp.currentAccount(); var stats = account.getStatsFor("THIS_MONTH"); var totalSpend = parseFloat(stats.getCost()).toFixed(2); var spendThreshold = TOTAL_BUDGET * (PERCENTAGE_THRESHOLD / 100); var pausedCampaigns = []; if (totalSpend >= spendThreshold) { pausedCampaigns = pausedCampaigns.concat( pauseCampaigns("General"), pauseShoppingCampaigns("Shopping"), pauseVideoCampaigns("Video"), pausePMaxCampaigns("Performance Max") ); if (pausedCampaigns.length > 0) { pausedCampaigns.forEach(function(campaign) { Logger.log('Paused ' + campaign.type + ' Campaign: ' + campaign.name); }); Logger.log('All active campaigns have been paused as the spend reached ' + PERCENTAGE_THRESHOLD + '% of the budget limit.'); sendEmail(pausedCampaigns, totalSpend); } } else { Logger.log('Total spend (' + totalSpend + ') is under the threshold of ' + spendThreshold + ' (' + PERCENTAGE_THRESHOLD + '% of budget). No action needed.'); } } function pauseCampaigns(type) { var paused = []; var campaignIterator = AdsApp.campaigns() .withCondition("Status = ENABLED") .withCondition("CampaignExperimentType = BASE") .get(); while (campaignIterator.hasNext()) { var campaign = campaignIterator.next(); campaign.pause(); paused.push({ name: campaign.getName(), type: type }); } return paused; } function pauseShoppingCampaigns(type) { var paused = []; var campaignIterator = AdsApp.shoppingCampaigns() .withCondition("Status = ENABLED") .withCondition("CampaignExperimentType = BASE") .get(); while (campaignIterator.hasNext()) { var campaign = campaignIterator.next(); campaign.pause(); paused.push({ name: campaign.getName(), type: type }); } return paused; } function pauseVideoCampaigns(type) { var paused = []; var campaignIterator = AdsApp.videoCampaigns() .withCondition("Status = ENABLED") .withCondition("CampaignExperimentType = BASE") .get(); while (campaignIterator.hasNext()) { var campaign = campaignIterator.next(); campaign.pause(); paused.push({ name: campaign.getName(), type: type }); } return paused; } function pausePMaxCampaigns(type) { var paused = []; var campaignIterator = AdsApp.performanceMaxCampaigns() .withCondition("Status = ENABLED") .withCondition("CampaignExperimentType = BASE") .get(); while (campaignIterator.hasNext()) { var campaign = campaignIterator.next(); campaign.pause(); paused.push({ name: campaign.getName(), type: type }); } return paused; } function sendEmail(pausedCampaigns, totalSpend) { var subject = 'Campaigns Paused Notification'; var body = 'The following campaigns have been paused due to reaching the budget threshold of ' + PERCENTAGE_THRESHOLD + '% of the budget:\n\n' + pausedCampaigns.map(c => c.name + " (" + c.type + ")").join('\n') + '\n\nTotal Spend: ' + totalSpend + '\nBudget Limit: ' + TOTAL_BUDGET; MailApp.sendEmail(EMAIL, subject, body); }