Аналитика

Как настроить отправку уведомлений о состоянии бюджета аккаунтов Google Ads в Telegram и на почту

90
17
22

Делимся скриптом, который проверяет остаток денежных средств на всех аккаунтах, подключенных к My Client Center Google Ads (MCC). Скрипт отправляет уведомление на почту и в Telegram — это поможет вовремя пополнить счёт.

Важно: скрипт работает только с аккаунтами Google Ads по предоплате.

Пост и скрипт создан и доработан по материалам телеграм-канала Скрипты Google Ads, скриптов на GitHub (1, 2). 

Как подключить скрипт

1. Копируем скрипт и вставляем его в аккаунт MCC.

Копируем скрипт и вставляем его в аккаунт MCC

2. Добавляем скрипт.

Добавляем скрипт

3. Перед запуском обязательно изменяем значения в первом блоке.

Перед запуском скрипта обязательно изменяем значения в первом блоке

  • days — количество дней, на которое должно хватить остатка. То есть, если денег меньше, чем на семь дней, вы получите уведомление;
  • email — указываем почту/почты, на которые должны приходить уведомления. Важно: почтовые адреса нужно указывать в кавычках;
  • names — заменить ‘Nick’, ‘Name’ на свои значения (используется в теме письма при отправке);
  • labelName: ActiveP — ярлык для аккаунтов, которые нужно контролировать.

4. Создаем бота для Telegram.

  • открываем телеграмм, находим бота:

Bot Father

  • придумываем имя и username. Рекомендую назвать одним значением, например Name_Bot. Вместо Name подставьте свое название;
  • вводим своё название для бота;
  • забиваем в строку username такое же название;

    забиваем в строку Username такое же название

    • если высветит ошибку «Sorry, this username is already taken. Please try something different», нужно выбрать другое название;
    • если все верно, получаем ответ:

      если все верно, получаем ответ от бота

      • открываем нашего бота, отправляем ему любое сообщение;
      • после этого переходим по ссылке в браузере https://api.telegram.org/bot<ТОКЕН>/getUpdates. Здесь вместо <ТОКЕН> вставьте значение из ответа бота;

        Вставьте значение из ответа бота

        • видим ответ. Копируем цифры: "chat:{"id":ХХХХХХХХХ

        Видим ответ. Копируем цифры

        • вставляем полученные значения в переменные в скрипте (следующий пункт).

        5. Измените значения во втором блоке скрипта (в самом низу):

        Измените значения во втором блоке скрипта

        • TOKEN— номер токена;
        • CHAT_ID— номер чата.

        6. Авторизуйте скрипт.

        Авторизуйте скрипт

        7. Поставьте запуск скрипта по удобному вам расписанию.

        Поставьте запуск скрипта по удобному вам расписанию

        8. Итог — вот такие уведомления на почту:

        Уведомление на почту

        Так выглядят сообщения в Telegram:

        Уведомления в Телеграм

        Код скрипта

        var CONFIG = {
           // Указать минимальное количество дней до окончания средств на аккаунте для отправки уведомления.
        days : 7,
        // Указать почты для отправки уведомлений, через запятую, если больше одной
           email : ['email@gmail.com', 'email2@gmail.com'],
        // Указать ники/имена кому отправляется письмо, через запятую, если больше одного
        names : ['Nick', 'Name'],
        // Помечаем необходимые для отслеживания аккаунты ярлыком, пример - ActiveP
        labelName : ['ActiveP']
        }
        function main () {
         var accounts = MccApp.accounts()
         .withCondition('LabelNames CONTAINS "' + CONFIG.labelName + '"')
         .executeInParallel("budgetControl")
         }
        function budgetControl() {
           var accountName = AdWordsApp.currentAccount().getName();
        var budgets = AdWordsApp.budgetOrders().withCondition('Status = ACTIVE').get();
           while (budgets.hasNext()) {
             try {
               var budget = budgets.next();
               if (budget.getSpendingLimit() !== null ) {
                 var startDate = timeFormat(budget.getStartDateTime());
                 var cost = AdWordsApp.currentAccount().getStatsFor(startDate,today()).getCost();
                 var last7DaysCostByDay = (AdWordsApp.currentAccount().getStatsFor("LAST_7_DAYS").getCost() / 7).toFixed();
                 var limit = budget.getSpendingLimit();
                 var remainingDays = rDays(limit, cost, last7DaysCostByDay);
                 var budgetNow = (limit - cost).toFixed();
                 if (budgetNow < 0) {
                   var budgetNow = 0;
                 }
                 else {
                   var budgetNow = budgetNow;
                 }
                 Logger.log([accountName, budgetNow, last7DaysCostByDay, remainingDays]);
                 if (remainingDays < CONFIG.days) {
                   sendTelegramMessage('Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow + '. Расход в день = ' + last7DaysCostByDay +
                                       ' . Денег хватит на ' + remainingDays + ' дня/дней.');
                   MailApp.sendEmail(CONFIG.email,
                                   CONFIG.names +' / Заканчивается бюджет на аккаунте: ' + accountName,
                                   'Аккаунт ' + accountName + ' . Текущий остаток = ' + budgetNow +
                                   '. Расход в день = ' + last7DaysCostByDay + ' в валюте аккаунта. ' +
                                   'Денег хватит на ' + remainingDays + ' дня/дней. В аккаунте заканчиваются средства. Необходимо предупредить PM.');
                 }
               }
             }
             catch (e) {
               Logger.log(e);
               sendTelegramMessage('Ошибка выполнения скрипта контроль Бюджетов ' + accountName);
               MailApp.sendEmail(CONFIG.email,
                                 'Ошибка выполнения скрипта Контроль бюджетов',
                                 'Необходимо проверить работу скрипта Контроль бюджетов ' + accountName + ' ' + e);
             }
           }
        }
        function timeFormat (date) {
         var year = date.year.toString();
         var month = date.month.toString();
         var day = date.day.toString();
         if (month.length == 1) {
           month = "0" + month;
         }
         if (day.length == 1) {
           day = "0" + day;
         }
         return [year, month, day].join("");
        }
        function today () {
         var date = new Date();
         var timeZone = AdWordsApp.currentAccount().getTimeZone();
         var format = 'yyyyMMdd';
         return Utilities.formatDate(date, timeZone, format);
        }
        function rDays(limit, cost, last7DaysCostByDay) {
         var remainingDays = ((limit - cost) / last7DaysCostByDay).toFixed();
         if (remainingDays < 1 || remainingDays == "Infinity" || remainingDays == "-Infinity" || remainingDays == -0 ) {
           remainingDays = 0;
         }
         return remainingDays;
        }
        function sendTelegramMessage(text) {
        var CONFIG2 = {
        TOKEN: 'TOKEN',
        CHAT_ID: 'CHAT_ID'
        };
        var telegramUrl = 'https://api.telegram.org/bot' + CONFIG2.TOKEN + '/sendMessage?chat_id=' + CONFIG2.CHAT_ID + '&text=';
        var message = encodeURIComponent(text);
        var sendMessageUrl = telegramUrl + message;
        var options = {
        method: 'POST',
        contentType: 'application/json'
        };
        UrlFetchApp.fetch(sendMessageUrl, options);
        }
        
        

        Обнаружили ошибку? Выделите ее и нажмите Ctrl + Enter.

        Комментарии (10 )

        1. 16 дней назад

          При переходе по ссылке https://api.telegram.org/bot<ТОКЕН (вписан мой)>/getUpdates. Выдает ошибку:



        2. месяц назад
          Что можно переделать, чтобы заработала на обычном аккаунте?
          • Вадимир Погребов
            месяц назад

            Добрый день,

            Владимир.

            Для обычного аккаунта:

            1. Удалить часть кода:

             Первый блок

            2. Удалить 2 строки:

            Второй блок

            • Алексей Панков
              месяц назад

              Благодарю, но почему то разница остаток: 95 в интерфейсе, он пишет 57. 


              • Вадимир Погребов
                13 дней назад

                Извините за опоздание с ответом. Этот способ не идеален, есть погрешности. 

                Что было замечено:

                1. Плохо работает с аккаунтами с очень большой историей (дата создания|траты аккаунта).

                2. Отличия от интерфейса: 

                2.1. Скрипт отдает более точную информацию, так как в интерфейсе данные могут поступать с задержкой. 

                2.2. Может занизить остаток средств.

                3. Для аккаунтов с НДС необходимо смотреть на вкладку бюджеты в MCC, так как если смотреть в "Счета и платежи" в самом аккаунте - необходимо учитывать не списанный НДС.


                В целом он собирался, дорабатывался под мои нужды. Погрешность существует, но если выставить срок отправки 5-7 дней, что бы предупредить клиента, даже с учетом погрешности - аккаунт не остановится, что и было основной целью. Было опробована на всех наших аккаунтах. Почти на всех работает отлично, с минимальной погрешностью, а на части аккаунтов, возможно 10% или меньше, есть сильные погрешности. Но данные погрешности можно обойти, отключив обработку аккаунта на уровне MCC и перенести его на уровень аккаунта, добавив  погрешность в данных как переменную, которую необходимо добавить в конечное значение остатка.

        3. месяц назад

          Здравствуйте.

          Спасибо за статью - будем внедрять. Подскажите, а есть возможность настроить уведомления о состоянии бюджета в Я.Директ? Может не с помощью скриптов.

        4. 2 месяца назад
          Но молодцы, что слепили все вместе!
        5. 2 месяца назад

          Спасибо, что указали источники откуда взяли скрипты)))

          Сделаю это за вас!


          1. https://github.com/pamnard/Adwords/blob/master/dev/TelegramAPI_sample.js - Отправка в telegram

          2. https://t.me/adwordsscripts/74 - Остаток бюджета на уровне MCC



          • Dmytro Tonkikh
            2 месяца назад

            Здравствуйте, Дмитрий.

            Прошу прощения, что произошла неприятность с вашими исходными скриптами.

            Были взяты и доработаны ваши исходники в соответствии с необходимостью, в частности, в моей работе. На счет первоисточника, к сожалению, никто не сказал, что в таких случаях надо указывать, так как скрипт был не скопирован 1 в 1, а произвелась доработка существующего материала.

            Добавили Ваши первоисточники в пост.

        Чтобы оставить комментарий, нужно войти

        Подписаться

        на самую полезную рассылку по интернет-маркетингу

        Самое

        обсуждаемое популярное читаемое

        Этот сайт использует куки-файлы и другие технологии, чтобы помочь вам в навигации, а также предоставить лучший пользовательский опыт, анализировать использование наших продуктов и услуг, повысить качество рекламных и маркетинговых активностей.