Budget Eater Rapport

Analyseer de zoekwoord- en productprestaties over de afgelopen periode. Wat is de invloed van zoekwoorden en producten met slechts 1 of 2 conversies?

Start nu!
Budget eater voor Shopping
Budget Get started!

De 20/80 regel zou je kunnen toepassen in Search en Shopping campagnes. Steek de tijd en aandacht in de 20% van de zoekwoorden en producten die 80% van de omzet moeten opleveren. Dat is een stelling waar de nodige discussie over mogelijk is.

In het geval van Google Shopping heeft SMEC (smarter ecommerce) aangetoond dat dit niet klopt. SMEC heeft onderstaand script geschreven, omdat uit onderzoek blijkt dat 80% van de conversies in Shopping uit 80% van de producten komen. Deze producten hebben dan maar 1 of 2 conversies behaald in de afgelopen 30 dagen. Deze producten worden de Long Tail producten genoemd.
Daarbij komt dat 70% van de kosten naar producten gaat die nooit conversies opleveren.

Inzicht in Long Tail producten en zoekwoorden

Om inzicht te geven in dit fenomeen en te laten zien hoeveel kosten er gaan naar producten en zoekwoorden die geen conversies opleveren, gebruik je onderstaand script. Vanuit het origineel van SMEC zijn er een aantal tweaks en uitbreidingen gedaan. Naast de analyse voor Shopping, kan je ditzelfde doen voor Search. Hierbij wordt dan gekeken naar zoekwoorden die tussen de 1 en de threshold (standaard 3) conversies hebben behaald. Dit resultaat kan je dan vergelijken met Shopping. Daarnaast kan je de resultaten per mail versturen.  

Instellingen

  • LOG: Geef aan of het script de tussenstappen moet rapporteren, door de waarde aan te passen naar 'true'.
  • DATE_RANGE: Geef aan hoeveel dagen het script terug moet kijken, standaard 30 dagen.
  • ANALYSE_KEYWORDS: Analyseer zoekwoorden op dezelfde manier als producten. Zet op 'false' om niet op te nemen.
  • LONG_TAIL_CONVERSIONS_THRESHOLD: Het maximaal aantal conversies om op te nemen in de analyse.
  • EMAIL_REPORT: Zet op 'false' wanneer je geen mail wilt versturen.
  • EMAIL_RECIPIENTS: Geef aan naar wie je de mail verstuurd. Voeg meerdere adressen toe door ze te scheiden met een komma.
  • EMAIL_SUBJECT: Het onderwerp van de mail die verstuurd wordt.

Frequentie: Stel het script in om eenmaal per week of eenmaal per maand te draaien.

The script
// (c) Smarter Ecommerce GmbH. All rights reserved.
// License: MIT
//
// Budget Eater Script         . * ・ 。゚☆━੧[ ✪ ᗜ ✪ ]⊃
//
// Created by: smec Team [smarter-ecommerce.com]
// Extended by: Tibbe van Asten (adsscripts.com)
//
// Created: 27-04-2018
// Last update: 05-01-2021 - Added Search campaigns & email
//
// Overview: You can use this script to evaluate your Long Tail and your
// non-converters from the last 30 days. The script will give you an impression
// of the correlations between costs, conversions, and the Long Tail within
// your account.
//
//
// Twitter: @smec, @adsscripts-com
// Email: scripts@smarter-ecommerce.com
//
////////////////////////////////////////////////////////////////////

var config = {

  LOG : true,

  DATE_RANGE : "LAST_30_DAYS",
  ANALYSE_KEYWORDS : true,

  // Sets the number of conversions threshold for evaluating the Long Tail.
  LONG_TAIL_CONVERSIONS_THRESHOLD : 3,

  // Set email to receive this report in your inbox
  EMAIL_REPORT : true,
  EMAIL_RECIPIENTS : "yourname@company.com",
  EMAIL_SUBJECT : "Budget Eater Report"

}

////////////////////////////////////////////////////////////////////

function main() {

  var emailContent = "";
  
  // Analyse at product-level
  Logger.log("...Starting products analysis...");
  emailContent = analyseCampaigns("Shopping campaigns", "OfferId, Cost, Conversions, ConversionValue, Impressions", "SHOPPING_PERFORMANCE_REPORT", "products", emailContent);

  // Analyse at query-level
  if(config.ANALYSE_KEYWORDS === true){
    Logger.log("...Starting keyword analysis...");
    emailContent = analyseCampaigns("Search campaigns", "Criteria, Cost, Conversions, ConversionValue, Impressions", "KEYWORDS_PERFORMANCE_REPORT", "keywords", emailContent)
  }
  
  // Print results in log
  if(config.LOG === true){
    Logger.log(" ");
    Logger.log(emailContent);
  }

  // Email results
  if(config.EMAIL_REPORT === true){
    emailReport(emailContent.replace(/\n/g,"<br />"));
  }

} // function main()

////////////////////////////////////////////////////////////////////

function analyseCampaigns(type, select, report, name, emailContent){

    // Select cost and conversions for all products during the last 30 days.
    var report = AdsApp.report(
      "SELECT " + select + " " +
      "FROM " + report + " " +
      "DURING "+ config.DATE_RANGE
    );

    var result = {
        nonConverters: { count: 0, cost: 0 },
        longtail: { count: 0, cost: 0, conversions: 0, conversionValue: 0 },
        converters: { count: 0, cost: 0, conversions: 0, conversionValue: 0 }
    };

    // Iterate through all rows and categorize each product by the number of its conversions.
    var rows = report.rows();

    while (rows.hasNext()) {
      var row = rows.next();
      var conversions = parseFloat(row['Conversions'], 10);
      var cost = parseFloat(row['Cost'], 10);
      var conversionValue = parseFloat(row['ConversionValue'], 10);

      if (conversions < 1) {
          result.nonConverters.count += 1;
          result.nonConverters.cost += cost;
      } else if (conversions < config.LONG_TAIL_CONVERSIONS_THRESHOLD) {
          result.longtail.count += 1;
          result.longtail.conversions += conversions;
          result.longtail.cost += cost;
          result.longtail.conversionValue += conversionValue;
      } else {
          result.converters.count += 1;
          result.converters.cost += cost;
          result.converters.conversions += conversions;
          result.converters.conversionValue += conversionValue;
      }
    }
  
      Logger.log(result)

    var totalCost = result.nonConverters.cost + result.longtail.cost + result.converters.cost;
    var totalConversions = result.longtail.conversions + result.converters.conversions;
    var totalConversionValue = result.longtail.conversionValue + result.converters.conversionValue;

    emailContent += "------------------------------------\n";
    emailContent += type + " (" + config.DATE_RANGE + ")\n";
    emailContent += "------------------------------------\n";
    emailContent += "Number of " + name +" without conversions: " + result.nonConverters.count + "\n";
    emailContent += "Number of " + name +" in Long Tail: " + result.longtail.count + "\n";
    emailContent += "Number of " + name +" having at least " + config.LONG_TAIL_CONVERSIONS_THRESHOLD + " conversions: " + result.converters.count + "\n\n";
    emailContent += "Total cost: " + round(totalCost) + "\n";
    emailContent += "Cost for Non-Converters: " + round(result.nonConverters.cost) +
        " (" + round(percentage(result.nonConverters.cost, totalCost)) + "% from total cost)\n\n";
    emailContent += "Total conversion value: " + round(totalConversionValue) + "\n";
    emailContent += "Total conversions: " + round(totalConversions) + "\n";
    emailContent += "Conversions from Long Tail: " + round(result.longtail.conversions) +
        " (" + round(percentage(result.longtail.conversions, totalConversions)) + "% from total conversions)\n\n";
    emailContent += "Total ROI: " + round(totalConversionValue / totalCost) + "\n";
    emailContent += "ROI for Long Tail: " + round(result.longtail.conversionValue / result.longtail.cost) + "\n";
    emailContent += "\n\n";

    return emailContent;

} // function analyseCampaigns()

////////////////////////////////////////////////////////////////////

function round(number) {

  // Rounds the given number to 2 decimals
  return Math.round(number * 100) / 100;

} // function round()

////////////////////////////////////////////////////////////////////

function percentage(value, total) {

  // Returns the percentage of a value for the given total value
  return value / total * 100;

} // function percentage()

////////////////////////////////////////////////////////////////////

function emailReport(emailContent){

  MailApp.sendEmail({
    to: config.EMAIL_RECIPIENTS,
    subject: config.EMAIL_SUBJECT,
    htmlBody: emailContent
  });

} // emailReport()
Show whole script!
Loading Comments
The Experts
Tibbe van Asten Head of PPC @ Increase
Nils Rooijmans Water Cooler Topics
Martijn Kraan Freelance PPC Specialist
Bas Baudoin Teamlead SEA @ Happy Leads
How about you? JOIN US!
Sharing Knowledge
Caring

Kennis delen

Adsscripts.com staat voor het delen van kennis. In de huidige markt houden SEA-specialisten de kennis en ervaring graag voor zich. Wij zijn er van overtuigd dat het delen van kennis ervoor kan zorgen dat iedereen beter wordt in haar of zijn werk. Daarom lopen wij hier graag in voorop, door onze kennis over scripts te delen met iedereen.

Wil jij ook graag een bijdrage leveren? Wij staan open voor nieuwe ideeën en feedback op alles wat je op Adsscripts.com vindt.

Neem contact op

Training &
Workshop
Neem contact op!
Adsscripts Training & Workshop