Automatización de la recogida de datos para empresas de publicidad: hazle la vida más fácil

He estado en marketing en Internet durante 5 años y paso la mayor parte de mi tiempo recopilando informes de ubicación de anuncios. Según mis observaciones, los especialistas en marketing no se preguntan a menudo cómo facilitar la recopilación de datos sobre campañas publicitarias para un analista o (diré algo aterrador ahora), cómo puede recopilar datos usted mismo y analizar los suyos. traficar usted mismo.





Me gustaría compartir las mejores prácticas y brindar algunos desarrollos listos para usar que serán útiles tanto para los especialistas en marketing como para los analistas de marketing establecidos.





Este libro está completamente dedicado a los problemas que trata el marketing web y se basa en mi experiencia personal de trabajar con los chicos de marketing de Betting League. (Puedo hablar interminablemente sobre publicidad móvil, marketing móvil, cómo creamos Buying Dashboard y análisis de clientes en mobio.ru, y tal vez escriba por separado).





1) La importancia del marcado

La piedra angular de todos los análisis, que pueden aumentar el tiempo para recopilar un informe de 15 minutos a 15 horas o más, es el marcado de las campañas publicitarias.





El marketing en Internet funciona en diferentes modelos (CPM, CPC para medios, comisión, RevShare y CPA para marketing de resultados). Hay dos puntos principales: la fuente de tráfico y el rastreador de ubicaciones. El diablo, como saben, está en los detalles: hay muchos puntos pequeños e importantes que me gustaría discutir. Pero lo primero es lo primero:





  1. "Costo" de la colocación publicitaria.





    (MyTarget, Google Ads, Google DV360, Facebook, DSP), , ( ). Adfox — side . , , , MyTarget Facebook, . / , .





  2. «» .





    2021 , , (CPA, RevShare) ( hard- soft- KPI) . Google Analytics. , - (, , ), ( , , ). , .





  3. — .





    , — — . , . .





    Google Analytics , ? .





    :





    • (utm_source)





    • (utm_campaign)





    • (utm_medium)





    • (utm_content)





    • (utm_term)





    - , .





    , :





    • / , URL- , .





    • - (, ) , : (cashback, kashback, cashback10, cash10)





    • -, , / (mobile_640x480, 640x480_mobile).





    • ( ), utm_content, utm_campaign.





    , :





    Utm_source — //,





    Utm_campaign — ,





    Utm_medium — , cpm/cpc





    Utm_content — ,





    { }_{ }|{ }. . 





    — , . Adfox : . , - , . , {utm_campaign} - { utm_content} - { } | { }.





    ( 15 ), .





    . , ( ). / , . ,





2)   

Adfox . . Adfox , . «» . «» API», Adfox. , API .





            . .





1.     : 





function getCampaignList(key) {

var key = '' // INSERT YOUR API TOKEN HERE

var url =  'https://adfox.yandex.ru/api/v1?object=account&action=list&actionObject=campaign&show=common&limit=200'  

var table = []

var option = { headers : {'X-Yandex-API-Key' : key}

var request = UrlFetchApp.fetch(url, option);

//decode data    

var text = request.getContentText("windows-1251");

var cdata = text.split('<ID>')

 //parse data

// Adfox   ,       

// <ID>

  for(var i in cdata)if(i!=0){

  var id = cdatat[i].split('</ID>')[0]

  var cname = test[i].split('<name>')[1].split('</name>')[0]

  var row = [id,cname]

  table.push(row)

    }
      
      



2.     , . , , UTM . :





function getBannersList(){

//get campaign info

var key = '' // INSERT YOUR API TOKEN HERE

var campdata = getCampaignList(key)

var table = [];

table.push(['Campaign ID','Campaign Name','Banner ID','Banner Name'])

 //get paginated list of banners.   ,      //   100   URL   

 for(var a in campdata){

 var campbanners = []

  var campid = campdata[a][0];

  var cname = campdata[a][1];

var url =

 'https://adfox.yandex.ru/api/v1?object=campaign&action=list&actionObject=banner&show=common&limit=1000&objectID='+campid

 var option = {

 headers : {  'X-Yandex-API-Key' : key  }  }

     var request = UrlFetchApp.fetch(url, option);

  //decode

     var text = request.getContentText("windows-1251");

    var test = text.split('<ID>')

  //  parse

    for(var i in test)if(i!=0){

      var bid = test[i].split('</ID>')[0];

      var bname = test[i].split('<name>')[1].split('</name>');

      campbanners.push(bid);

      table.push([campid,cname,bid,bname])

 }

//pagination    

   var a = campbanners.length

    for(var x=0; x<a; x = x + 100){

  var start = x;

  var end = x + 100;

  if(a>end)var banners = campbanners.slice(start, end);

  else{banners = campbanners.slice(x,a)};

  var banners = campbanners.slice(start, end)

  banners = '['+banners.toString()+']'

  //get taskid for the data batch

  var taskid = orderData(banners,key) //    

 // Logger.log(taskid); //For testing Purposes

  Utilities.sleep(5000) //its better to have a 5 sec delay

  var data = getData(taskid,cname,bname,key); // SEE the code in utilities.gs

    }

  }

SpreadsheetApp.getActive().getSheetByName('banner list').getRange(1,1,table.length,table[0].length).setValues(table);

 

    return;

  

  addCorectBname()

  return test;

}
      
      



3.     :





function orderData(banners,key,date){ //gets taskId for the batch

//      ""

//        date   .

  var date = new Date();

  date.setHours(-20);

date = date.toISOString().substr(0,10)

var datefrom = date  //'2020-08-01';

var dateto = date   //'2020-09-27'

var url = 

"https://adfox.yandex.ru/api/report/banner?name=days&bannerId="+banners+"&dateFrom="+datefrom+"&dateTo="+dateto+"&precision=high";

var option = { headers : {  'X-Yandex-API-Key' : key  }  }

var request = UrlFetchApp.fetch(url, option);

var text = request.getContentText();

var json = JSON.parse(text);

var taskid = json['result']['taskId'];

return taskid;

}

 

//     id    

function getData(taskId,campname,banname,key){ //gets Report via task ID

  var url = 'https://adfox.yandex.ru/api/report/result?taskId='+taskId;

var option = { headers : { 'X-Yandex-API-Key' : key  }   }

var request = UrlFetchApp.fetch(url, option);

var text = request.getContentText();

var json = JSON.parse(text);

var table = []

var title = json['result']['fields'];

var tab = json['result']['table'];

for(var i in tab){

            var row = tab[i]

row.push(campname,banname);

            table.push(row)

             }

if(table.length > 0){var t = 

SpreadsheetApp.getActive().getSheetByName('data').getDataRange().getValues();

SpreadsheetApp.getActive().getSheetByName('data').getRange(t.length+1,1,table.length,table[0].length).setValues(table);

                      }

  

  return json;

}
      
      



Adfox. API .





3)

Google Analytics ( ). API Google Analytics . GA.









:





function nextDay(date,loop){

 // var loop = 0 // 0 - ,   -  +,  - -

 // var date = new Date()

  var day = 1000 * 60 * 60 * 24;

  var b = new Date(date.getTime()+loop*day)

  b = b.toISOString().substr(0,10); // -       

  return b;

}

 

function runDemo() {

  var date = new Date();

  date.setHours(12);

  for(var i=1;i<=1;i++){

  var datefrom = nextDay(date,-1*i)

  var dateto=datefrom;

  try {

      

        var firstProfile = getFirstProfile();

        var results = getReportDataForProfile(firstProfile,datefrom,dateto);

      outputToSpreadsheet(results);

  

    } 

    catch(error) {

        Browser.msgBox(error.message);

    }

  }

}
  

function getFirstProfile() {

    var accounts = Analytics.Management.Accounts.list();

    if (accounts.getItems()) {

        var firstAccountId = accounts.getItems()[0].getId();

      Logger.log(firstAccountId)

        var webProperties = Analytics.Management.Webproperties.list(firstAccountId);

        if (webProperties.getItems()) {

            var firstWebPropertyId = webProperties.getItems()[0].getId();

           Logger.log(firstWebPropertyId)

            var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId);

            if (profiles.getItems()) {

                var firstProfile = profiles.getItems()[0];

              var tolog = firstProfile.getId()

              Logger.log(tolog)

                return firstProfile;

            } 

            else {

                throw new Error('No views (profiles) found.');

            }

        } 

        else {

            throw new Error('No webproperties found.');

        }

    } 

    else {

        throw new Error('No accounts found.');

    }

  return;

}

function getReportDataForProfile(firstProfile,datefrom,dateto) {

    var profileId = firstProfile.getId();

    var tableId = 'ga:' + profileId;

    var startDate = datefrom 

    var endDate = dateto

    var optArgs = {

      'dimensions':'ga:source,ga:campaign,ga:medium,ga:adContent,ga:date', // Comma separated list of dimensions.

      'metrics': 'ga:users,ga:sessions,ga:newUsers,ga:bounces,ga:goal10Completions',

        'segment': 'gaid::-1'//

        'samplingLevel': 'HIGHER_PRECISION',

        'start-index': '1',

        'max-results': '1000000'

    };

  

    // Make a request to the API.

    var results = Analytics.Data.Ga.get(

        tableId,                    // Table id (format ga:xxxxxx).

        startDate,                  // Start-date (format yyyy-MM-dd).

        endDate,                    // End-date (format yyyy-MM-dd).

        'ga:sessions',//,ga:pageviews', // Comma seperated list of metrics.

        optArgs);

  

    if (results.getRows()) {

        return results;

    } 

    else {

        throw new Error('No views (profiles) found');

    }

}

function outputToSpreadsheet(results) {

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("GA");

  var indexFrom = sheet.getDataRange().getValues().length 

  var headerNames = ['ga:source','ga:campaign','ga:medium','ga:adContent','date','ga:users','ga:sessions','ga:newUsers','ga:bounces','1 ']

    sheet.getRange(1, 1, 1, headerNames.length).setValues([headerNames]);

    sheet.getRange(indexFrom+1, 1, results.getRows().length, headerNames.length).setValues(results.getRows());

}
      
      



. Google Data Studio. . , , , , .








All Articles