Prijzen updaten in tekstadvertenties

Houdt de prijzen van je producten in tekstadvertenties up-to-date met dit script. Middels een koppeling met Merchant Center, worden de prijzen elk uur gecontroleerd.

Start nu!
Prijzen in tekstadvertenties updaten
Prijzen Get started!

Het is voor elke ecommerce partij de moeite waard om te testen of het gebruik van prijzen in tekstadvertenties leidden tot een hogere CTR. Als je dit op grotere schaal wilt gebruiken, is het belangrijk dat de prijzen van al deze producten actueel zijn. Om ervoor te zorgen dat de prijs op de site gelijk is aan de prijs in de tekstadvertenties, kan je dit proces eenvoudig automatiseren.

Actuele prijzen controleren

Dit script maakt een koppeling met Google Merchant Center en haalt daar alle actuele prijzen op. Wanneer je Merchant Center jouw voorraad en prijzen in de gaten laat houden, is de prijs in Merchant Center altijd actueel. Daarna doorloopt het script alle advertenties in jouw account die je hebt gelabeld om aan te geven dat hier een prijs in staat. Aan de hand van de landingspagina wordt gekeken of de prijs in de advertenties hetzelfde is als de prijs die in Google Merchant Center staat.

Prijzen in textads updaten

Wanneer de prijs vanuit GMC niet in de tekstadvertentie staat, wordt de prijs uit de advertentie vervangen. Hiermee zorg je ervoor dat je advertentie altijd een actuele prijs van het product bevat.

Instellingen

  • LOG: Geef aan of het script de tussenstappen moet rapporteren, door de waarde aan te passen naar 'true'.
  • MERCHANT_ID: Schakel de geavanceerde API 'Shopping Content' in en vul hier het Merchant Center ID in. Zorg ervoor dat de gebruiker die het script draait ook toegang heeft tot GMC.
  • CURRENCY: Specificeer welke munteenheid je gebruikt in je tekstadvertenties.
  • DECIMAL_SEPERATOR: Standaard staan de prijzen in GMC met '.' als decimaalteken. Als je dat wilt veranderen in je advertenties, kan je dat hier aangeven.
  • AD_LABEL_HEADLINE: Geef een label aan alle advertenties die een prijs in een kop hebben staan.
  • AD_LABEL_DESCRIPTION: Geef een label aan alle advertenties die een prijs in een beschrijving hebben staan.

Frequentie: Draai dit script elk uur, daarmee ben je verzekerd van actuele prijzen in je advertenties.

The script
// Copyright 2019. Increase BV. All Rights Reserved.
//
// Created By: Tibbe van Asten
// for Increase B.V.
//
// Created 28-05-2019
// Last update: 10-02-2019
//
// ABOUT THE SCRIPT
// With this script the adcopy will be checked for current pricing
//
////////////////////////////////////////////////////////////////////

var config = {
  
  LOG : true,
  
  // Connect Merchant Center. Add user to MC that runs this script.
  // Also enable Advanced API 'Shopping content'.
  MERCHANT_ID : "127116107",
  
  CURRENCY : "€",
  DECIMAL_SEPERATOR : ",",
  AD_LABEL_HEADLINE : "Price - Headline",
  AD_LABEL_DESCRIPTION : "Price - Description",
  
}

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

function main() {

  checkLabel(config.AD_LABEL_HEADLINE);
  checkLabel(config.AD_LABEL_DESCRIPTION);
  var products = connectMerchant();

  // We will look at all ads with the label stated in the config
  var adIterator = AdsApp
    .ads()
    .withCondition("LabelNames CONTAINS_ANY ['" + config.AD_LABEL_HEADLINE + "','" + config.AD_LABEL_DESCRIPTION + "']")
    .withCondition("Status = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .get();
  
    if(config.LOG === true){
      Logger.log(adIterator.totalNumEntities() + " ads");
    }
  
  while (adIterator.hasNext()) {
    var ad = adIterator.next();
    var adUrl = ad.urls().getFinalUrl();
    
    var price = checkPrice(products, adUrl);
    
    // When no price is found in the feed, the ad with price is paused
    if(price == null){      
      	if(config.LOG == true){
          Logger.log("Ad paused");
          Logger.log(" ");
        }
      
      ad.pause();
      continue;
    }
    
    var headline = [];
    var description = [];
    
    var regex = new RegExp("[0-9]+(\\" + config.DECIMAL_SEPERATOR + "[0-9]{1,2})");
    
    // Find the price and replace it    
    for(var i = 1;i < 4;i++){
      headline[i] = eval("ad.getHeadlinePart" + i + "()");
      
      if(headline[i].indexOf(config.CURRENCY) > -1 && headline[i].indexOf(price) < 0){     
        headline[i] = headline[i].replace(regex, price);        
        var label = config.AD_LABEL_HEADLINE;
      }
      
    } // headlineIterator
    
    for(var n = 1;n < 3;n++){
      description[n] = eval("ad.getDescription" + n + "()");
      
      if(description[n].indexOf(config.CURRENCY) > -1 && description[n].indexOf(price) < 0){        
        description[n] = description[n].replace(regex, price);
        var label = config.AD_LABEL_DESCRIPTION;
      }
      
    } // descriptionIterator
    
    // If a headline or description differs, we'll create a new ad
    if(ad.getHeadlinePart1() != headline[1] || ad.getHeadlinePart2() != headline[2] || ad.getHeadlinePart3() != headline[3] || ad.getDescription1() != description[1] || ad.getDescription2() != description[2]){      
      var adGroup = ad.getAdGroup();
      var adOperation = adGroup.newAd().expandedTextAdBuilder()
        .withHeadlinePart1(headline[1])
      	.withHeadlinePart2(headline[2])
        .withHeadlinePart3(headline[3] || "")
        .withDescription1(description[1])    
        .withDescription2(description[2] || "")    
        .withPath1(ad.getPath1() || "")
      	.withPath2(ad.getPath2() || "")
        .withFinalUrl(adUrl)
        .build();
      
      if(adOperation.getErrors() == ""){
        var newAd = adOperation.getResult().applyLabel(label);
        ad.pause();
      } else {
        Logger.log("Failed to create ad in " + adGroup);
      }
      
      if(config.LOG === true){
        Logger.log("Ad replaced in " + ad.getAdGroup().getName());
      }
      
    } // Check for changes lines
    
  } // ad iterator

} // function main()

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

function checkLabel(label){
  
  if(label !== "" && !AdsApp.labels().withCondition("Name = '"+label+"'").get().hasNext()) {
    AdsApp.createLabel(label);

    	Logger.log("Label " + label + " created");
  }
  
} // function checkLabel()

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

function connectMerchant(){
  
  	if(config.MERCHANT == "123456789"){
      throw Error("Change the Merchant ID in the settings");
    }  
    
  var pageToken;
  var pageNum = 1;
  var maxResults = 250;
  var products = [];
  
  do {
    var productList = ShoppingContent.Products.list(config.MERCHANT_ID, {
      pageToken: pageToken,
      maxResults: maxResults
    });
    
    if (productList.resources) {
      for (var i = 0; i < productList.resources.length; i++) {
        products.push(productList.resources[i]);
      }
    }

    pageToken = productList.nextPageToken;
    pageNum++;
  } while (pageToken);
  
  return products;
  
} // function connectMerchant

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

function checkPrice(products, adUrl){
  
  for (var i = 1; i < products.length; i++) { 
    
    // When the link in the feed is the same as the ad url, the price is retrieved
    if(products[i]["link"] == adUrl) { 
    
      // When the saleprice is in the feed, this will be used. If not, the regular price is used.
      if(products[i]["salePrice"]) {
        var price = products[i]["salePrice"]["value"];
      } else {
        var price = products[i]["price"]["value"];
      }
      
      if(config.DECIMAL_SEPERATOR != "."){
        price = price.replace(".", config.DECIMAL_SEPERATOR);
      }
      
      return price;
      
    } // if statement url
    
  } // for statement
  
} // function checkPrice()
Show whole script!
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