In Google Ads MCC accounts is het lastig om dagelijks te controleren of al je accounts nog actief vertoningen genereren. Soms wordt een campagne gepauzeerd zonder dat je het weet, of zijn er andere problemen waardoor een account geen impressies meer krijgt.
Met dit MCC-script kun je dat automatisch controleren: het script bekijkt elke ochtend of er accounts zijn die op de dag ervoor nul impressies hebben gehad, en geeft je daarvan een overzicht per e-mail, in een Google Sheet of beide.
Wat controleert het script?
Het script draait binnen je Google Ads MCC-account en controleert per subaccount:
- Of er actieve campagnes zijn
- Hoeveel campagnes er gepauzeerd zijn
- Of er afgekeurde advertenties zijn
- Wat de dagbudgetten per campagne zijn
- Of er kosten zijn gemaakt, ondanks dat er geen vertoningen waren
Je krijgt per account een overzicht van deze informatie, zodat je direct weet of het om een bewust gepauzeerd account gaat, of dat er misschien een probleem speelt zoals disapprovals of targeting die niets oplevert.
Notificaties via e-mail, opslaan in Google Sheets of beide
Het script is flexibel. In de opties kun je aangeven of je de notificaties per e-mail wil ontvangen, wil opslaan in een Google Sheet, of allebei. Dat doe je via deze regel:
var MODE = 'BOTH'; // Opties: 'MAIL', 'SHEET', of 'BOTH'
Dus:
‘MAIL’ : je ontvangt alleen een e-mail
‘SHEET’ : de resultaten worden alleen opgeslagen in je Google Sheet
‘BOTH’ : je krijgt een e-mail en het wordt opgeslagen in de sheet
Google Sheet logs per dag
Als je kiest voor opslaan in Sheets, maakt het script automatisch een nieuw tabblad aan voor elke dag waarop het draait. Zodat je kan zien welke accounts waarom geen impressies hadden.
De sheet bevat de volgende kolommen:
- Datum
- Account ID
- Accountnaam
- Aantal gepauzeerde campagnes
- Aantal afgekeurde advertenties
- Overzicht van campagnes en hun budget
- Eventuele kosten zonder vertoningen
Instellen van het script
- Ga naar je MCC-account
- Bij Tools -> Bulk Actions ga je naar ‘Scripts’
- Klik op de blauwe + om een nieuw script toe te voegen
- Plak het script en geef het een naam (bv MCC – Impressions Anomaly)
- Autoriseer het script om e-mail te versturen en toegang tot je Google Sheet te geven
- Stel een planning in (bijvoorbeeld dagelijks om 07:00)
Maak een Google Sheet aan en plak de URL hiervan in de variable in het script:
var SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXX/edit';
Waarom gebruik je dit script?
- Je bent er snel bij als accounts zonder impressies komen
- Je krijgt inzicht in disapprovals of budgetproblemen zonder handmatig te controleren
Het volledige script
/*
* MCC-script dat accounts zonder impressies logt via e-mail, Sheets of beide.
*
* Instellingen:
* - MODE: 'MAIL', 'SHEET', of 'BOTH'
* - SPREADSHEET_URL: link naar Google Sheet
* - recipients: array met e-mailadressen
*
* Logt per account:
* - Account ID & naam
* - Aantal gepauzeerde campagnes
* - Aantal afgekeurde advertenties
* - Budget per campagne
* - Kosten zonder impressies
*
* Dennis Stopa
* Nodeyn Interactive
*
* dennis@nodeyn.nl
* https://nodeyn.nl
*/
var MODE = 'BOTH'; // Opties: 'MAIL', 'SHEET', 'BOTH'
var SPREADSHEET_URL = ''; // Hier je Google Sheets URL
var recipients = [
'hier@jouw.email' // Hier jouw e-mailadres(sen)
// Voeg hier meer e-mails toe indien gewenst tussen '' en vergeet niet de , achter de eerste regel
];
function main() {
var sheet = null;
if (MODE === 'SHEET' || MODE === 'BOTH') {
sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
// Genereer tabbladnaam op basis van maand + jaar (bijv. "April 2025")
var maandNamen = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'];
var now = new Date();
var maandNaam = maandNamen[now.getMonth()];
var jaar = now.getFullYear();
var tabName = maandNaam.charAt(0).toUpperCase() + maandNaam.slice(1) + ' ' + jaar;
// Haal of maak het maandoverzicht-tabblad
var sheetExists = sheet.getSheetByName(tabName);
if (sheetExists) {
sheet = sheetExists;
} else {
sheet = sheet.insertSheet(tabName);
sheet.appendRow([
'Datum',
'Account ID',
'Account Naam',
'Gepauzeerde campagnes',
'Afgekeurde advertenties',
'Campagnes + Budget',
'Kosten zonder impressies'
]);
}
}
var dagNamen = ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'];
var maandNamen = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'];
var now = new Date();
var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
var yesterday = new Date(now.getTime() - MILLIS_PER_DAY);
var dagNaam = dagNamen[yesterday.getDay()];
var dag = yesterday.getDate();
var maandNaam = maandNamen[yesterday.getMonth()];
var jaar = yesterday.getFullYear();
var leesbareDatum = dagNaam + " " + dag + " " + maandNaam + " " + jaar;
var formattedDate = jaar + ('0' + (yesterday.getMonth() + 1)).slice(-2) + ('0' + dag).slice(-2);
var accountIterator = MccApp.accounts().withLimit(50).get();
var mailLines = [];
var ctr = 0;
while (accountIterator.hasNext()) {
var account = accountIterator.next();
MccApp.select(account);
var stats = AdsApp.currentAccount().getStatsFor(formattedDate, formattedDate);
var impressions = stats.getImpressions();
var cost = stats.getCost();
if (impressions === 0) {
ctr++;
var accountId = account.getCustomerId();
var accountName = account.getName();
// Paused campagnes
var pausedCampaigns = AdsApp.campaigns()
.withCondition("Status = PAUSED")
.get();
var pausedCount = pausedCampaigns.totalNumEntities();
// Afgekeurde advertenties
var disapprovedCount = 0;
var adIterator = AdsApp.ads().get();
while (adIterator.hasNext()) {
var ad = adIterator.next();
if (ad.getPolicyApprovalStatus() === 'DISAPPROVED') {
disapprovedCount++;
}
}
// Budget info
var campaignIterator = AdsApp.campaigns().get();
var budgetInfo = [];
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
var budget = campaign.getBudget();
budgetInfo.push(campaign.getName() + ": €" + budget.getAmount().toFixed(2));
}
// Kosten zonder impressies?
var costNote = cost > 0 ? "€" + cost.toFixed(2) : "";
// Voeg toe aan e-mail
if (MODE === 'MAIL' || MODE === 'BOTH') {
var line = ctr + ". " + accountId + " - " + accountName + "\n";
if (pausedCount > 0) line += pausedCount + " gepauzeerde campagnes\n";
if (disapprovedCount > 0) line += disapprovedCount + " afgekeurde advertenties\n";
if (budgetInfo.length > 0) line += "Budgetten: " + budgetInfo.join(" | ") + "\n";
if (costNote) line += "Kosten zonder impressies: " + costNote + "\n";
line += "\n";
mailLines.push(line);
}
// Voeg toe aan Sheet
if (MODE === 'SHEET' || MODE === 'BOTH') {
sheet.appendRow([
leesbareDatum,
accountId,
accountName,
pausedCount,
disapprovedCount,
budgetInfo.join(" | "),
costNote
]);
// Sorteer op datum, nieuwste bovenaan
sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn())
.sort({column: 1, ascending: false});
}
}
}
// Verstuur e-mail als nodig
if ((MODE === 'MAIL' || MODE === 'BOTH') && mailLines.length > 0) {
var header = "Accountcheck: geen impressies op " + leesbareDatum + "\n\n";
var body = header + mailLines.join('');
for (var i = 0; i < recipients.length; i++) {
MailApp.sendEmail(recipients[i], 'Accounts met 0 impressies op ' + leesbareDatum, body);
}
}
}