Перейти к содержимому

Проверка битых ссылок и 404/500 страниц в Google Ads

Запрашивает конечный URL каждого включённого объявления, записывает ответы 4xx, 5xx и «нет в наличии» в Google Таблицу и присылает сводку на почту. Может остановить найденные объявления.

Скрипт Google Ads
/**
 * Goodlabs Google Ads script: broken landing page checker
 * Author: Goodlabs (https://goodlabs.kz)
 * Schedule: Daily at 06:00
 */
var CONFIG = {
  SPREADSHEET_URL: "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit",
  NOTIFICATION_EMAIL: "analytics@yourdomain.com",
  PAUSE_BROKEN_ADS: false,
  OUT_OF_STOCK_REGEX: "Out of stock|Товар распродан|Нет в наличии",
  TIMEOUT_MS: 10000
};

function main() {
  var brokenCount = 0;
  var sheet = getOrCreateSheet(CONFIG.SPREADSHEET_URL);
  var checkedUrls = {};

  Logger.log("Starting Goodlabs Broken URL Audit...");

  var adIterator = AdsApp.ads()
    .withCondition("Status = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .get();

  while (adIterator.hasNext()) {
    var ad = adIterator.next();
    var url = ad.urls().getFinalUrl();
    if (!url) continue;

    var result = checkedUrls[url] || checkUrl(url);
    checkedUrls[url] = result;

    if (!result.ok) {
      brokenCount++;
      sheet.appendRow([
        new Date(),
        ad.getCampaign().getName(),
        ad.getAdGroup().getName(),
        ad.getId(),
        url,
        result.statusCode,
        result.error
      ]);

      if (CONFIG.PAUSE_BROKEN_ADS) {
        ad.pause();
        Logger.log("PAUSED broken ad: " + ad.getId() + " (" + url + ")");
      }
    }
  }

  Logger.log("Audit finished. Broken URLs detected: " + brokenCount);

  if (brokenCount > 0 && CONFIG.NOTIFICATION_EMAIL) {
    MailApp.sendEmail(
      CONFIG.NOTIFICATION_EMAIL,
      "⚠️ Google Ads Alert: " + brokenCount + " Broken URLs Found",
      "The broken landing page check found " + brokenCount + " failing landing pages in your Google Ads account.\n\n" +
      "Review the full report here: " + CONFIG.SPREADSHEET_URL
    );
  }
}

function checkUrl(url) {
  try {
    var response = UrlFetchApp.fetch(url, {
      muteHttpExceptions: true,
      followRedirects: true,
      validateHttpsCertificates: true,
      headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }
    });

    var code = response.getResponseCode();
    if (code >= 400) {
      return { ok: false, statusCode: code, error: "HTTP Error " + code };
    }

    var text = response.getContentText();
    var oosPattern = new RegExp(CONFIG.OUT_OF_STOCK_REGEX, "i");
    if (CONFIG.OUT_OF_STOCK_REGEX && oosPattern.test(text)) {
      return { ok: false, statusCode: code, error: "Out of Stock Detected" };
    }

    return { ok: true, statusCode: code, error: "" };
  } catch (err) {
    return { ok: false, statusCode: 0, error: err.toString() };
  }
}

function getOrCreateSheet(url) {
  try {
    var ss = SpreadsheetApp.openByUrl(url);
    var sheet = ss.getActiveSheet();
    if (sheet.getLastRow() === 0) {
      sheet.appendRow(["Timestamp", "Campaign", "Ad Group", "Ad ID", "Final URL", "HTTP Status", "Error Details"]);
      sheet.getRange(1, 1, 1, 7).setFontWeight("bold").setBackground("#f3f4f6");
    }
    return sheet;
  } catch(e) {
    Logger.log("Spreadsheet error: " + e);
    return { appendRow: function() {} };
  }
}

Как это работает

  1. Обходит включённые объявления во включённых кампаниях и группах через AdsApp.ads().withCondition("Status = ENABLED").
  2. Запрашивает каждый конечный URL через UrlFetchApp.fetch() с обычным User-Agent браузера. Запросы Apps Script синхронные, время работы растёт с числом уникальных URL, поэтому проверенные URL кэшируются.
  3. Отмечает ответы 4xx и 5xx и страницы, текст которых совпадает с шаблоном «нет в наличии».
  4. Записывает время, кампанию, группу, URL и ошибку в Google Таблицу, останавливает объявление, если это включено, и присылает сводку на почту.

Установка

  1. В Google Ads откройте Инструменты > Массовые действия > Скрипты.
  2. Нажмите плюс, чтобы создать скрипт.
  3. Вставьте код с этой страницы в редактор.
  4. Создайте Google Таблицу и вставьте её URL в SPREADSHEET_URL.
  5. Нажмите «Авторизовать», чтобы дать скрипту доступ к Google Ads и Таблицам.
  6. Запустите «Предварительный просмотр», затем сохраните и поставьте ежедневный запуск, например в 06:00.

Вопросы

Не замедлит ли это объявления или сайт?

Скрипт работает на стороне Google, вне показа объявлений, так что на них он не влияет. Каждый уникальный URL запрашивается один раз за запуск, проверенные адреса кэшируются.

Проверяет ли он ключевые слова и ситлинки?

Только объявления. Для URL ключевых слов и ситлинков нужен ещё один цикл по AdsApp.keywords() и по ситлинкам через тот же checkUrl().

Нужен скрипт под ваш аккаунт?

Пишем скрипты Google Ads, настраиваем server-side GA4 и собираем отчёты под конкретный вопрос.