Bodaanpassingen voor doelgroepen

Pas automatisch bodaanpassingen toe op doelgroepen in campagnes. 

Start nu!
Bodaanpassingen voor doelgroepen
Bodaanpassingen Get started!

Om meer inzicht te verkrijgen in de prestaties van je bezoekers en klanten, voeg ik altijd doelgroepen toe aan campagnes. Hiermee kan je dan bodaanpassingen doen op basis van de prestaties van deze doelgroepen. Afhankelijk van de klant hebben we soms 100 verschillende doelgroepen toegevoegd aan een campagne. In plaats van deze doelgroepen elke week na te lopen en bodaanpassingen te veranderen, hebben we dit proces geautomatiseerd.

We hebben ook scripts voor bodaanpassingen op locaties, apparaten en voor elk uur van de dag. Start gelijk met het automatiseren van alle bodaanpassingen in jouw accounts!

Instellingen

In het script kan je slechts de volgende zaken aanpassen:

  • LOG: Geef aan of het script de tussenstappen moet rapporteren, door de waarde aan te passen naar 'true'.
  • DATE_RANGE: Het script kijkt naar de conversies en kosten over deze periode.
  • MINIMUM_CONVERSIONS: Minimaal aantal conversies. Wanneer een doelgroep minder conversies heeft, wordt er geen bodaanpassing gedaan.
  • MINIMUM_COST: Minimale kosten voor een doelgroep. Wanneer een doelgroep minder uitgaven heeft, wordt er geen bodaanpassing gedaan.
  • CAMPAIGN_LABEL: Gebruik een label om campagnes te selecteren
  • MAX_BID: De bodaanpassing wordt nooit hoger dan hier ingesteld.
  • MIN_BID: De bodaanpassing wordt nooit lager dan hier ingesteld.

Frequentie: Om voldoende data te genereren adviseren we om het script eenmaal per dag of week te draaien.

The script
// Copyright 2020. Increase BV. All Rights Reserved.
//
// Created By: Tibbe van Asten
// for Increase B.V.
// 
// Created: 01-03-2019
// Last update: 20-05-2020
//
// ABOUT THE SCRIPT
// With this script we adjust the biddings for audiences in 
// active campaigns.
//
////////////////////////////////////////////////////////////////////

var config = {

  LOG : true,
  DATE_RANGE : "LAST_30_DAYS",
  
  // Optional: Use minimum conversions and/or cost to select audiences
  // Leave empty to skip
  MINIMUM_CONVERSIONS : "",
  MINIMUM_COST : "",
  
  // Optional: Use a campaignlabel to make a selection.
  // Leave empty to skip
  CAMPAIGN_LABEL : "",
  
  // Bidadjustments won't be higher then MAX_BID and not lower then MIN_BID
  // Examples: 1.2 = +20%, 0.8 = -20%, 2 = +100%
  MAX_BID : 1.2,
  MIN_BID : 0.8
  
}

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

function main() {
  
  // We start by getting all active campaigns
  var campaignIterator = campaignSelector();
  
  while(campaignIterator.hasNext()) {
  	var campaign = campaignIterator.next();    
    var campaignCpa = campaign.getStatsFor(config.DATE_RANGE).getCost() / campaign.getStatsFor(config.DATE_RANGE).getConversions();
    
    	if(config.LOG === true) {
        	Logger.log("Campagne: " + campaign.getName()); 
          	Logger.log("Campagne CPA: " + campaignCpa); 
          	Logger.log("-----");
        }
    
    // Within the campaign, we will check for audiences
    var audienceIterator = audienceSelector(campaign);

    while(audienceIterator.hasNext()) {
      var audience = audienceIterator.next();

      var audienceCpa = audience.getStatsFor(config.DATE_RANGE).getCost() / audience.getStatsFor(config.DATE_RANGE).getConversions();
      var newAudienceBid = campaignCpa / audienceCpa;

        if(config.LOG === true && isNaN(newAudienceBid) === false && isFinite(audienceCpa) === true && audience.isEnabled() === true && isNaN(audienceCpa) === false) {
          Logger.log("Audience: " + audience.getName()); 
          Logger.log("Audience CPA: " + audienceCpa);
          Logger.log("Suggested Audience bid: " + newAudienceBid);
        }         	
      
      // If there is an audience CPA, we will place a bidadjustment
      if(isNaN(newAudienceBid) === false && isFinite(audienceCpa) === true && audience.bidding().getBidModifier() !== newAudienceBid && audience.isEnabled() === true) {
        	if(newAudienceBid < config.MIN_BID) { newAudienceBid = config.MIN_BID; }
        	if(newAudienceBid > config.MAX_BID) { newAudienceBid = config.MAX_BID; }
        
        	audience.bidding().setBidModifier(newAudienceBid);        
        	Logger.log("Bidadjustment " + audience.getName() + " changed to " + newAudienceBid);
        	Logger.log(" ");
      }

    } // audience iterator    
    
    if(config.LOG === true){
      Logger.log(" ");
    }
    
  } // campaign iterator
  
} // function main()

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

function campaignSelector(){

  if(config.CAMPAIGN_LABEL != ""){
    var campaignSelector = AdsApp
      .campaigns()
      .withCondition("Status = ENABLED")
      .withCondition("LabelNames CONTAINS_ANY ['" + config.CAMPAIGN_LABEL + "']")
      .get();
  } else{
    var campaignSelector = AdsApp
      .campaigns()
      .withCondition("Status = ENABLED")
      .get();
  }
  
  return campaignSelector;
  
} // function campaignSelector()

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

function audienceSelector(campaign){

  // When no limitations are set
  if(config.MINIMUM_CONVERSIONS == "" && config.MINIMUM_COST == ""){
    var audienceSelector = campaign
      .targeting()
      .audiences()
      .get();
  }
  
  // When a CONVERSIONS minimum is set
  if(config.MINIMUM_CONVERSIONS != "" && config.MINIMUM_COST == ""){
    var audienceSelector = campaign
      .targeting()
      .audiences()
      .withCondition("Conversions > " + config.MINIMUM_CONVERSIONS)
      .forDateRange(config.DATE_RANGE)
      .get();
  }
  
  // When a cost minimum is set
  if(config.MINIMUM_CONVERSIONS == "" && config.MINIMUM_COST != ""){
    var audienceSelector = campaign
      .targeting()
      .audiences()
      .withCondition("Cost > " + config.MINIMUM_COST)
      .forDateRange(config.DATE_RANGE)
      .get();
  }
  
  // When cost and conversion minima are set
  if(config.MINIMUM_CONVERSIONS != "" && config.MINIMUM_COST != ""){
    var audienceSelector = campaign
      .targeting()
      .audiences()
      .withCondition("Conversions > " + config.MINIMUM_CONVERSIONS)
      .withCondition("Cost > " + config.MINIMUM_COST)
      .forDateRange(config.DATE_RANGE)
      .get();
  }
  
  return audienceSelector;
  
} // function audienceSelector()
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