+ OPTMYZR.COM - PPC AUTOMATION AND TOOLS
+ ---------------------------------------
+ Script by Optmyzr Inc. 2016
+ This script checks whether an AdWords account has gone offline, possibly due to a declined credit card.
+ It does this by checking if a selected metric (like impressions) has accrued some value over a chosen
+ number of hours. The user can choose the number of hours to look back so that they can account for
+ expected periods of non-activity (e.g. due to dayparting)
+ 1. update the value for EMAIL_ADDRESS_TO_NOTIFY (use comma separated email addresses if you want to send a notification to several email addresses)
+ 2. update the value for NUM_HOURS_TO_CHECK (set this at least as long as the duration of expected hours of inactivity. E.g. if your ads are offline for 8 hours due to dayparting, set a value of at least 9 here)
+ 3. update the value for METRIC_TO_CHECK (normally you'd use 'Impressions' but you can also use 'Cost' or 'Conversions' if you prefer to be notofied when these metrics accrue no activity)
+ This script does NOT make changes to your account. It only emails when an account appears to have become inactive.
+var EMAIL_ADDRESS_TO_NOTIFY = "frederick@optmyzr.com";
+var NUM_HOURS_TO_CHECK = 1;
+var METRIC_TO_CHECK = "Impressions";
+Date.prototype.yyyymmdd = function() {
+ var yyyy = this.getFullYear().toString();
+ var mm = (this.getMonth()+1).toString();
+ var dd = this.getDate().toString();
+ return yyyy + (mm[1]?mm:"0"+mm[0]) + (dd[1]?dd:"0"+dd[0]);
+function getDateRangeYesterdayToToday() {
+ var currentDate = new Date();
+ var tempDate = new Date();
+ tempDate.setDate(tempDate.getDate()-1);
+ var yesterdayDate = tempDate;
+ return yesterdayDate.yyyymmdd() + "," + currentDate.yyyymmdd();
+ function sendEmailNotifications(emailAddresses, subject, body, emailType ) {
+ if(emailType.toLowerCase().indexOf("warning") != -1) {
+ var finalSubject = "[Warning] " + subject + " - " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ")"
+ } else if(emailType.toLowerCase().indexOf("notification") != -1) {
+ var finalSubject = "[Notification] " + subject + " - " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ")"
+ if(DEBUG == 1) Logger.log("email sent to " + emailAddresses + ": " + finalSubject);
+ var dateRange = getDateRangeYesterdayToToday();
+ var currentDate = new Date();
+ var queryText = "SELECT " + METRIC_TO_CHECK + ", DayOfWeek, HourOfDay FROM ACCOUNT_PERFORMANCE_REPORT DURING " + dateRange;
+ var result = AdWordsApp.report(queryText);
+ var rows = result.rows();
+ daysMapping["Sunday"] = 0;
+ daysMapping["Monday"] = 1;
+ daysMapping["Tuesday"] = 2;
+ daysMapping["Wednesday"] = 3;
+ daysMapping["Thursday"] = 4;
+ daysMapping["Friday"] = 5;
+ daysMapping["Saturday"] = 6;
+ var impressionsByHour = {};
+ while(rows.hasNext()) {
+ var currentRow = rows.next();
+ var dayFactor = daysMapping[currentRow["DayOfWeek"]];
+ var hourFactor = parseFloat(currentRow["HourOfDay"]);
+ var actualHour = dayFactor * 24 + hourFactor;
+ // Logger.log(dayFactor +","+ hourFactor + " => " + currentRow["Impressions"]);
+ impressionsByHour[actualHour] = currentRow["Impressions"];
+ // check if an entry exists for any of the last 6 hours
+ var foundEntry = false;
+ var numHoursToCheck = NUM_HOURS_TO_CHECK + 1;
+ for(var i=1;i<numHoursToCheck;i++){
+ var tempDate = new Date(currentDate.getTime());
+ tempDate.setHours(tempDate.getHours() - i);
+ var hourIndexToCheck = tempDate.getDay() * 24 + tempDate.getHours();
+ if(impressionsByHour[hourIndexToCheck] != undefined){
+ Logger.log("ALL OK! The Account seems to be active in the last " + NUM_HOURS_TO_CHECK + " hours.");
+ var subject = "AdWords Account getting no impressions";
+ var body = "AdWords Account " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ") seems to be getting no impressions in the last 6 hours. You may want to check this out.";
+ sendEmailNotifications(EMAIL_ADDRESS_TO_NOTIFY, subject, body, "warning");
+ Logger.log("WARNING: The Account seems to be inactive in the last " + NUM_HOURS_TO_CHECK + " hours.");