Skip to content

Instantly share code, notes, and snippets.

@mktg
Forked from derekmartinla/gdn-placement-analysis
Created January 29, 2016 02:34
Show Gist options
  • Save mktg/13331d7cbea12ff662be to your computer and use it in GitHub Desktop.
Save mktg/13331d7cbea12ff662be to your computer and use it in GitHub Desktop.

Revisions

  1. @derekmartinla derekmartinla renamed this gist Apr 10, 2015. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. @derekmartinla derekmartinla created this gist Apr 10, 2015.
    173 changes: 173 additions & 0 deletions low-converting-gdn-placements
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,173 @@
    // This script reviews your GDN placements for the following conditions:
    // 1) Placements that are converting at less than $40
    // 2) Placements that have cost more than $50 but haven't converted
    // 3) Placements that have more than 5K impressions and less than .10 CTR

    function main() {

    var body = "<h2>Google Display Network Alert</h2>";
    body += "<h3>Placements that are converting at less than $40:</h3> " ;
    body += "<ul>";

    var list = runLowCostAndConvertingReport();

    for (i=0; i < list.length; i++) {
    body += "<li><strong>" + list[i].placement + "</strong> - " + list[i].adgroup + ' - $' + list2[i].cost + "</li>";

    }
    body += "</ul>";

    body += "<h3>Placements that have cost more than $50 but haven't converted:</h3> " ;
    body += "<ul>";

    var list2 = runHighCostNoConversionsReport();

    for (i=0; i < list2.length; i++) {
    body += "<li><strong>" + list2[i].placement + "</strong> - " + list2[i].adgroup + ' - $' + list2[i].cost + "</li>";

    }
    body += "</ul>";

    body += "<h3>Placements that have more than 5K impressions and less than .10 CTR:</h3> " ;
    body += "<ul>";

    var list3 = runLowCtrAndHighImpressionsReport();

    for (i=0; i < list3.length; i++) {
    body += "<li><strong>" + list3[i].placement + "</strong> - " + list3[i].adgroup +" - " + parseFloat(list3[i].clicks/list3[i].impressions).toFixed(4) + "% - " + list3[i].clicks + " clicks - " + list3[i].impressions + ' impressions ' + "</li>";

    }
    body += "</ul>";

    MailApp.sendEmail('[email protected]','Display Network Alerts ', body,{htmlBody: body});
    }

    function runLowCostAndConvertingReport()
    {
    list = [];

    // Any placement detail (individual page) that has converted 2 or more times with CPA below $40
    var report = AdWordsApp.report(
    'SELECT Url, CampaignName, AdGroupName, Clicks, Impressions, Conversions, Cost ' +
    'FROM URL_PERFORMANCE_REPORT ' +
    'WHERE Cost < 40000000 ' +
    'AND Conversions >= 2 ' +
    'DURING LAST_30_DAYS');

    var rows = report.rows();

    while (rows.hasNext()) {

    var row = rows.next();

    var anonymous = row['Url'].match(/anonymous\.google/g);
    if (anonymous == null) {
    var placement = row['Url'];

    var campaign = row['CampaignName'];
    var adgroup = row['AdGroupName'];
    var clicks = row['Clicks'];
    var impressions = row['Impressions'];
    var conversions = row['Conversions'];
    var cost = row['Cost'];

    var placementDetail = new placementObject(placement, campaign, adgroup, clicks, impressions, conversions, cost);

    list.push(placementDetail);
    }
    }
    return list;
    }
    function runLowCtrAndHighImpressionsReport()
    {
    list = [];

    // Any placement detail (individual page) that has converted 2 or more times with CPA below $40
    var report = AdWordsApp.report(
    'SELECT Url, CampaignName, AdGroupName, Clicks, Impressions, Conversions, Cost ' +
    'FROM URL_PERFORMANCE_REPORT ' +
    'WHERE Impressions > 5000 ' +
    'AND Ctr < 0.1 ' +
    'DURING LAST_30_DAYS');

    var rows = report.rows();

    while (rows.hasNext()) {

    var row = rows.next();

    var anonymous = row['Url'].match(/anonymous\.google/g);
    if (anonymous == null) {
    var placement = row['Url'];

    var campaign = row['CampaignName'];
    var adgroup = row['AdGroupName'];
    var clicks = row['Clicks'];
    var impressions = row['Impressions'];
    var conversions = row['Conversions'];
    var cost = row['Cost'];

    var placementDetail = new placementObject(placement, campaign, adgroup, clicks, impressions, conversions, cost);

    list.push(placementDetail);
    }
    }
    return list;
    }

    function runHighCostNoConversionsReport()
    {
    list = [];

    // Any placement detail (individual page) that has converted 2 or more times with CPA below $40
    var report = AdWordsApp.report(
    'SELECT Url, CampaignName, AdGroupName, Clicks, Impressions, Conversions, Cost ' +
    'FROM URL_PERFORMANCE_REPORT ' +
    'WHERE Cost > 50000000 ' +
    'AND Conversions = 0 ' +
    'DURING LAST_30_DAYS');

    var rows = report.rows();

    while (rows.hasNext()) {

    var row = rows.next();

    var anonymous = row['Url'].match(/anonymous\.google/g);
    if (anonymous == null) {
    var placement = row['Url'];

    var campaign = row['CampaignName'];
    var adgroup = row['AdGroupName'];
    var clicks = row['Clicks'];
    var impressions = row['Impressions'];
    var conversions = row['Conversions'];
    var cost = row['Cost'];

    var placementDetail = new placementObject(placement, campaign, adgroup, clicks, impressions, conversions, cost);

    list.push(placementDetail);
    }
    }
    return list;
    }

    function placementObject(placement, campaign, adgroup, clicks, impressions, conversions, cost) {
    this.placement = placement;
    this.campaign = campaign;
    this.adgroup = adgroup;
    this.clicks = clicks;
    this.impressions = impressions;
    this.conversions = conversions;
    this.cost = cost;

    }

    // Helpers
    function warn(msg) {
    Logger.log('WARNING: '+msg);
    }

    function info(msg) {
    Logger.log(msg);
    }