Obecnie 236 forumowiczów jest online
Obecnie 236 forumowiczów jest online
Dla pytań związanych z funkcjami remarketingu, strategii stawek, Edytor AdWords i skryptów AdWords.
Poprowadź mnie
star_border
Odpowiedz

[Nowy skrypt] Liczy średni CPA i informuje gdy coś jest droższe

[ Edytowane ]
Profesjonalista ✭

Cześć,

 

Podrzucam nowy skrypt.

 

Co robi?
Sprawdza średni CPA i daje znać gdy, któreś słowa kluczowe lub produkty są znacznie powyżej średniej.

 

Na jakie dane patrzy?

Na początku liczony zostaje średni CPA (ostanie 14 dni*).

Osobno dla kampanii zakupowych i osobno dla kampanii tekstowych.

 

Dalej liczony jest CPA dla poszczególnych słów kluczowych i produktów (ostatnie 7 dni).

Następnie porównywane jest ich CPA z średnim CPA.

Na koniec wysyłany jest email z listą słów kluczowych i produktów, które były znacznie droższe niż średni CPA.

 

*Średni CPA liczony jest dla 14 dni aby mięć więcej danych.

 

 

 

Jak często uruchamiać?

Raz w tygodniu - najlepiej poniedziałek rano.

 

Konfiguracja:

Możemy sami ustawić co to znaczy "drogie" CPA.
Standardowo ustawione jest 50% więcej niż średni CPA.

 

 

U mnie obecna konfiguracja sprawdza się bardzo dobrze.

Zalecam po prostu wstawić email i będzie ok.

 

 

 

Jeśli pojawią się jakieś pytania to chętnie pomogę.

 

Pozdrawiam.

Krzysiek

 

// Konfiguracja wymagana:
  var emails = ['TUTAJ WSTAW EMAIL'];

// Konfiguracja opcjonalna.
// O ile wiekszy moze byc CPA 
  var kwValue = 1.5; // dla słów kluczowych: 1.5 to o 50% większy, 1.8 to o 80% większy itp
  var itemValue = 1.5; // dla produktów z kampanii zakupowych: 1.5 to o 50% większy, 1.8 to o 80% większy itp
// Koniec konfiguracji

  var badKeywords = [];
  var badItems = [];

function main() {
  isEmailOk(emails);
  
  if (isSearchActive()) {
    findBadKeywords();
  } else {
       Logger.log("Nie było aktywnych kampanii zakupowych w ostatnich 14 dniach")
  }
  
  if (isShoppingActive()) {  
findBadItems();
  } else {
    Logger.log("Nie było aktywnych kampanii zakupowych w ostatnich 14 dniach")
  }

  if (isShoppingActive() || isSearchActive()) {
Logger.log(badKeywords);
Logger.log(badItems);
sendEmails();
  }
    
}


function findBadItems(){
  var productGroups = AdWordsApp
  .productGroups()
  .withCondition("Clicks > 1")
  .forDateRange('LAST_7_DAYS')
  .get(); 
  var avgItemCpa = calcSearchAvgCpa();
  while (productGroups.hasNext()) {
  var productGroup = productGroups.next();
  var productItemId = productGroup.asItemId();
  var itemId = productItemId.getValue();
  var itemCampaignName = productGroup.getCampaign();
  var itemAdgroupName = productGroup.getAdGroup();
  var itemStats = productItemId.getStatsFor('LAST_7_DAYS');
  var itemConv = itemStats.getConversions();
  var itemCost = itemStats.getCost();
    if (itemConv > 0.9) {
    var itemCpa = itemCost / itemConv;
    itemCpa = itemCpa.toFixed(2);
   if (itemId) {
   if (itemCpa > (itemValue * avgItemCpa)) {
      badItems.push(itemCampaignName.getName() + "\\" + itemAdgroupName.getName() + "\\" + itemId + " miał CPA: " + itemCpa); 
}
}
}
}
}

function findBadKeywords(){
  var keywords = AdWordsApp
  .keywords()
  .withCondition("Clicks > 1")
  .forDateRange('LAST_7_DAYS')
  .get();
  var avgKwCpa = calcSearchAvgCpa();
  while(keywords.hasNext()) {
  var keyword = keywords.next();
  var kwStats = keyword.getStatsFor('LAST_7_DAYS'); 
  var kwConv = kwStats.getConversions();
  var kwCost = kwStats.getCost();
  var kwName = keyword.getText();
  var kwCampaignName = keyword.getCampaign();
  var kwAdgroupName = keyword.getAdGroup();
    if (kwConv > 0.9) {
    var kwCpa = kwCost / kwConv;
    kwCpa = kwCpa.toFixed(2);
   if (kwCpa > (kwValue * avgKwCpa)) {
      badKeywords.push(kwCampaignName.getName() + "\\" + kwAdgroupName.getName() + "\\" + kwName + " miał CPA: " + kwCpa); 
   }
}
  }
}

function calcSearchAvgCpa(){
 var campaigns = AdWordsApp
  .campaigns()
  .forDateRange('LAST_14_DAYS')
  .get();  
  var costSum = []; 
  var convSum = [];
  while(campaigns.hasNext()) {
  var campaign = campaigns.next();
  var campaignStats = campaign.getStatsFor('LAST_14_DAYS'); 
  costSum.push(campaignStats.getCost());
  convSum.push(campaignStats.getConversions());
  }
  var theResult = sumStats(costSum) / sumStats(convSum);
  theResult = theResult.toFixed(2);
  return theResult;
}

function calcShoppingAvgCpa(){
 var campaigns = AdWordsApp
  .shoppingCampaigns()
  .forDateRange('LAST_14_DAYS')
  .get();  
  var costSum = []; 
  var convSum = [];
  while(campaigns.hasNext()) {
  var campaign = campaigns.next();
  var campaignStats = campaign.getStatsFor('LAST_14_DAYS'); 
   costSum.push(campaignStats.getCost());
   convSum.push(campaignStats.getConversions());
  }
  var theResult = sumStats(costSum) / sumStats(convSum);
  theResult = theResult.toFixed(2);
  return theResult;

}

function sumStats(sum){
    var total = 0;
    for(var i = 0;i < sum.length; i++) { 
        total+=sum[i];
    }
    return total;
}

function sendEmails(){
 MailApp.sendEmail(emails.join(','), 
                 'Masz słowa kluczowe, które generują duże koszty.',
                  'Cześć, \n\nŚredni CPA dla kampanii tekstowych w ostatnich 14 dniach wynosił: ' + calcSearchAvgCpa() + '\n\nTe słowa kluczowe były znacznie droższe:\n\n'+ badKeywords.join("\n") +
                   '\n\nŚredni CPA dla kampanii zakupowych w ostatnich 14 dniach wynosił: ' + calcShoppingAvgCpa() + '\n\nTe produkty były znacznie droższe:\n\n' + badItems.join("\n"));
  
}

function isShoppingActive(){
  var shoppingCampaigns = AdWordsApp
  .shoppingCampaigns()
  .withCondition("Clicks > 1")
  .forDateRange('LAST_14_DAYS')
  .get(); 
  if (shoppingCampaigns.totalNumEntities() > 0) {
    var theResult = true;
  } else {
    var theResult = false;
  }
  Logger.log(shoppingCampaigns.totalNumEntities() + " aktywnych kampanii zakupowych");
  return theResult;
}

function isSearchActive(){
  var searchCampaigns = AdWordsApp
  .campaigns()
  .withCondition("Clicks > 1")
  .forDateRange('LAST_14_DAYS')
  .get(); 
  if (searchCampaigns.totalNumEntities() > 0) {
    var theResult = true;
  } else {
    var theResult = false;
  }
  Logger.log(searchCampaigns.totalNumEntities() + " aktywnych kampanii tekstowych");
  return theResult;
}

function isEmailOk(email) {
  if (email && email[0] == 'TUTAJ WSTAW EMAIL') {
    throw new Error('Aby uruchomic skrypt podaj swoj adres email');
  }
}

 

Czy moja odpowiedź była pomocna? Jeśli tak, oznacz ją jako „najlepszą odpowiedź”