Skript, který pomůže mít CPA pod kontrolou

Možná si vzpomínáte, že Olena na PPC barbecue zmiňovala jeden ze svých skriptů, který ve Webnode používají. Jedná se o super vychytávku, oštítkuje totiž kampaně s informací o tom, zda byste měli snížit nebo zvýšit bidy. Teď se rozhodli, že ho s námi nasdílí!

Jak to funguje?

  • Bere data ze Google spreadsheetu, kde uvádíte název kampaní a jejich cílová CPA
  • Skript zkontroluje průměrná CPA za posledních 7 dní a srovná s cílem
  • Jestliže se hodnoty liší o +/- 5%, kampaň dostane štítek „Close to %goal%“, pokud je to o více, pak si vyslouží oštítkování „Grow till %goal%“/ „Lower till %goal%“

Pozor, Olena přidává také pár upozornění:

  • Číselné hodnoty musí být v tabulce v anglickém formátu, tedy s tečkami
  • Log skriptu může ukázat: „311 changes, 25 errors“. To je prý v pohodě, stává se to pokud máte stejné cíle pro více kampaní (label už existuje a skript ho nemůže znovu vytvořit). Zprávu můžete vesele ignorovat :)
  • Pro 20 účtů skript běží 1 minutu, takže je to celkem rychlovka. Rychlost by se dala ještě zoptimalizovat, ale Olena je zatím s výkonem spokojená.
// non changeable things

var SPREADSHEET_URL = "PASTE_HERE_LINK_TO_YOUR_EXCEL_FILE_IN_GOOGLE_DOCS";
var TIMEFRAME = "LAST_7_DAYS"; // because i want to compare with data for last 7 days
var DATA_RANGE = 'A:B'; // first 2 columns in the excel file
var SIG_FIGS = 100; // necessary for rounding cpa to 2 decimals

 

function main() { 
 
// get my file, get data specified in first 2 columns and let's say 1st column is campaign name then provide me value in 2nd (cuz there's campaign's cpa goal)
 
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
 var allSheets = spreadsheet.getSheets();
 var allData = [];
 for(var i in allSheets) {
 var sheet = allSheets[i];
 var data = sheet.getRange(DATA_RANGE).getValues();
 } 
function getGoalCPA(data, Campaign) {
 for (var i = 0; i < data.length; i++) {
 var row = data[i];
 if(Campaign == row[0]) return row[1];
 }
} 
 
 
 
// since we're on MCC, commands for getting campaigns' name starting from MCC level
 
var accountIt = MccApp.accounts()
 .withCondition("LabelNames CONTAINS 'New accounts'")
 .get();
 
var mccAccount = AdWordsApp.currentAccount();

while (accountIt.hasNext()) {
 var account = accountIt.next();
 MccApp.select(account)
 

var CampIt = AdWordsApp.campaigns().withCondition("Status = ENABLED").get(); 
 
// when running script each time I need this to delete previous labels
 
 function remove_previous_labels() {
 
var accountIt = MccApp.accounts()
 .get();

while (accountIt.hasNext()) {
 var account = accountIt.next();
 MccApp.select(account) 
 
var CampIt = AdWordsApp.campaigns().withCondition("Status = ENABLED").get(); 
while(CampIt.hasNext()) {
 var Camp = CampIt.next();
 var campaignName = Camp.getName();
 
 
 var labelIterator = AdWordsApp.labels()
 .withCondition("Name CONTAINS 'Grow'")
 .get();
 
 if (labelIterator.hasNext()) {
 label = labelIterator.next();
 label.remove();
 }
 
 
 var labelIterator2 = AdWordsApp.labels()
 .withCondition("Name CONTAINS 'Close'")
 .get();
 
 if (labelIterator2.hasNext()) {
 label2 = labelIterator2.next();
 label2.remove();
 }
 
 
 var labelIterator3 = AdWordsApp.labels()
 .withCondition("Name CONTAINS 'Lower'")
 .get();
 
 if (labelIterator3.hasNext()) {
 label3 = labelIterator3.next();
 label3.remove();
 }
 }
 }
 }
 
 
 
while(CampIt.hasNext()) { 
 var Camp = CampIt.next(); 
 var campaignName = Camp.getName();
 
 
 
// define current cpa we have in last 7 days; if there're no conversions take a value of cost
 
if (Camp.getStatsFor(TIMEFRAME).getConvertedClicks() > 0) {
 var RealCPA = Camp.getStatsFor(TIMEFRAME).getCost() / Camp.getStatsFor(TIMEFRAME).getConvertedClicks();
 } 
 else { 
 var RealCPA = Camp.getStatsFor(TIMEFRAME).getCost();
 }
 
 
 
// match my campaigns in the account with their info from the file 
var GoalCPA = getGoalCPA(data, campaignName);
 
 
 
// make labels names
var LowCPA = 'Grow till '+ GoalCPA;
var OkCPA = 'Close to '+ GoalCPA;
var HighCPA = 'Lower till '+ GoalCPA;
 

 
// condition of comparing goal and real cpa
 
if(RealCPA <= GoalCPA / 100 * 94) { 
 AdWordsApp.createLabel(LowCPA, "", "#4986CC");
 Camp.applyLabel(LowCPA);} 
 
 
if(RealCPA > GoalCPA / 100 * 94 && RealCPA < GoalCPA/100*106) { 
 AdWordsApp.createLabel(OkCPA, "", "#D3D3D3");
 Camp.applyLabel(OkCPA);}
 
 
if(RealCPA >= GoalCPA / 100 * 106) { 
 AdWordsApp.createLabel(HighCPA, "", "#CE2337");
 Camp.applyLabel(HighCPA);}
 
 
 
 
// write me in the log what campaigns get what cpas - goal and real 
 Logger.log(account.getName() + " : " + Camp + " : " + Math.round(RealCPA * SIG_FIGS) / SIG_FIGS + " -> " + GoalCPA);
 
 }
 }
}

One Comment

  1. Jiří Homola

    10.2.2015 at 11:16

    Super a jak je spokojená Olena tak je to v pohodě :D

    Reply

Komentovat

Váš email nebude zveřejněn.Povinná pole jsou označena *

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

About Markéta

Baví mě pracovat na věcech, které dávají smysl. Ráda objevuji a jsem hladová po nových informacích. Jsem nenapravitelný optimista a věřím, že: „where there is a will, there is a way“. A nespokojuji se s průměrem!