Saya telah berkecimpung dalam pemasaran internet selama 5 tahun dan menghabiskan sebagian besar waktu saya mengumpulkan laporan penempatan iklan. Menurut pengamatan saya, pemasar tidak sering bertanya pada diri sendiri tentang bagaimana memfasilitasi pengumpulan data pada kampanye iklan untuk seorang analis, atau (saya akan mengatakan hal yang menakutkan sekarang), bagaimana Anda dapat mengumpulkan data sendiri dan menganalisis milik Anda sendiri lalu lintas sendiri.
Saya ingin berbagi praktik terbaik dan memberikan beberapa perkembangan siap pakai yang akan berguna bagi pemasar dan analis pemasaran yang sudah mapan.
Longread ini sepenuhnya dikhususkan untuk masalah yang berhubungan dengan pemasaran web dan didasarkan pada pengalaman pribadi saya bekerja dengan orang-orang dari pemasaran Liga Taruhan. (Saya dapat berbicara tanpa henti tentang periklanan seluler, pemasaran seluler, bagaimana kami membangun Dasbor Pembelian dan analitik pelanggan kembali di mobio.ru, dan mungkin saya akan menulis secara terpisah.)
1) Pentingnya markup
Landasan semua analitik, yang dapat meningkatkan waktu untuk mengumpulkan laporan dari 15 menit menjadi 15 jam atau lebih, adalah markup kampanye iklan.
Pemasaran Internet bekerja dalam model yang berbeda (CPM, CPC untuk media, komisi, RevShare dan CPA untuk pemasaran kinerja). Ada dua poin utama: sumber lalu lintas dan pelacak penempatan. Iblis, seperti yang Anda ketahui, ada dalam detailnya - ada banyak poin kecil dan penting yang ingin saya diskusikan. Tapi hal pertama yang pertama:
"Biaya" penempatan iklan.
(MyTarget, Google Ads, Google DV360, Facebook, DSP), , ( ). Adfox β side . , , , MyTarget Facebook, . / , .
«» .
2021 , , (CPA, RevShare) ( hard- soft- KPI) . Google Analytics. , - (, , ), ( , , ). , .
β .
, β β . , . .
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. . , , , , .