Scripts d’automatisation PPC : requête haute performance vers mot-clé

Ajoutez automatiquement des requêtes de recherche performantes en tant que mots clés à votre campagne de recherche payante. Ce script parcourt votre compte, trouve toutes les requêtes de recherche de conversion qui feraient d’excellents mots-clés et les ajoute automatiquement à votre compte. Ça sonne aussi bien que ça.

Pourquoi avons-nous créé ce script ?

Peu importe la quantité de recherche de mots-clés que vous effectuez, vous ne pouvez jamais être sûr à 100% de ce que les gens vont taper dans Google. Étant donné que les gens recherchent toujours des choses de différentes manières, il y a beaucoup de trafic potentiel qui n’est pas ciblé tous les jours, simplement parce que ces recherches à longue traîne ne sont pas ciblées.

C’est pourquoi nous avons créé ce script (appelé affectueusement « Dave » à Impression HQ, découvrez pourquoi au bas de cet article). Cela fonctionne en parcourant un compte, en trouvant des mots-clés qui convertissent et sont activement recherchés par les utilisateurs et en les ajoutant à une campagne pour vous. Le script surveille en permanence tous les termes de recherche existants dans le compte et ajoute de nouveaux mots clés très performants en quelques secondes, en fonction des paramètres que vous avez définis. Accédez directement au code ici.

Le scénario

/*******************************************************************************
*
* [DAVE] Query To Keyword
* Author: Lauren Capon (@PPCLoz) & Nathan Ifill (@nathanifill), Impression
*
* This script adds search terms with a cost per acquisition (CPA) lower than a
* target (or a ROAS higher than a target) as either an exact, phrase or broad
* match keyword.
*
* v1.14
*
* Any suggestions? Email nathan.ifill@impression.co.uk
*
* Change History:
* v1.14
* - NI changed Broad keywords to add unmodified broad keywords
*
* v1.13
* - NI added label to DAVE-added keywords
*
* v1.12
* - NI stopped email sending if there are no new keywords
*
* v1.11
* - NI added another fix to avoid DSA search terms because the first one in
* version 1.8 was clearly rubbish and didn't work
*
* v1.10
* - NI added a clean log
*
* v1.9
* - NI added impressions as a metric
* - NI added email option to send log once finished
*
* v1.8
* - NI added more stats and details to output - campaign, ad group, clicks, ctr,
* conv. rate, CPA, revenue, roas
* - NI added fix to avoid DSA campaigns and ad groups
* - NI fixed target CPA to be less than or equals to instead of just less than
*
* v1.7
* - NI added parseInt functions to parse CPAs and CPCs and integers
* - NI added support for minimum number of conversions
*
* v1.6
* - NI added function to add keywords with bid set to average CPA
* - NI added error handling for keywords which are longer than 80 chars
* - NI added error handling for keywords with more than 10 words
*
* v1.5
* - NI added support for phrase match
*
* v1.4
* - NI added BMM and exact split
*
* v1.3
* - NI restricted selection to search queries which have not been added or
* excluded in enabled ad groups and campaigns
*
* v1.2
* - NI added new longQuery to speed up script and extend lookback period
*
* v1.1
* - LC fixed CPA bug
*
*******************************************************************************/
var maxCPA = 100;
// Enter the maximum all-time CPA the search term requires above.
// To only consider search terms with a £10 CPA, enter 10. To only consider
// search terms with a £1.50 CPA, enter 1.50.
// Example: var maxCPA = 10;
// Example: var maxCPA = 1.50;

var minROAS = 0;
// Enter the minimum all-time ROAS the search term requires above.
// To only consider search terms with at least a 3.5:1 all-time ROAS, enter 3.5.
// To only consider search terms with at least a 5 to 1 all-time ROAS, enter 5.
// Example: var minROAS = 3.5;
// Example: var minROAS = 5;

var minImpressions = 0;
// Enter the minimum number of all-time impressions the search term requires
// above as an integer. To only consider search terms with 2 or more
// all-time impressions, enter 2.
// Example: var minImpressions = 2;

var minConversions = 0.01;
// Enter the minimum number of all-time conversions the search term requires
// above. To only consider search terms with 2 or more all-time conversions,
// enter 2. To only consider search terms with 0.5 or more all-time
// conversions, enter 0.5.
// Example: var minConversions = 2;
// Example: var minConversions = 0.5;

var yourEmail = "";
// Enter your email above if you'd like to be emailed the log when the script
// has finished running. If you'd rather not receive the email log, leave this
// blank. You can add multiple emails using commas, if you want.
// Example: var yourEmail = "james.jameson@impression.co.uk";
// Example: var yourEmail = "dave@impression.co.uk, becky@impression.co.uk";

var keywordLabel = "DAVE";
// Enter the label that you want applied to keywords which have been added by
// DAVE.
// Example: var keywordLabel = "DAVE";
// Example: var keywordLabel = "Automatically Added";

/******************************************************************************//*                       DON'T TOUCH THE STUFF BELOW                          *//******************************************************************************/
minImpressions--;
minConversions -= 0.01;
minROAS -= 0.01;

var fullCleanLog = ""; // initialise fullCleanLog
var keywordCount = 0; // intialise keyword count

function main() {
  labelMaker(); // runs the label maker if needed

  // Campaign Broad
  var broadCampaignReport = gimmeMyReport("Campaign", "Broad");
  cpaCheck(broadCampaignReport, "broad");
  cleanLog(" ");

  var bmmCampaignReport = gimmeMyReport("Campaign", "BMM");
  cpaCheck(bmmCampaignReport, "broad");
  cleanLog(" ");

  // Ad Group Broad
  var broadAdGroupReport = gimmeMyReport("Ad Group", "Broad");
  cpaCheck(broadAdGroupReport, "broad");
  cleanLog(" ");

  var bmmAdGroupReport = gimmeMyReport("Ad Group", "BMM");
  cpaCheck(bmmAdGroupReport, "broad");
  cleanLog(" ");

  // Campaign Phrase
  var phraseCampaignReport = gimmeMyReport("Campaign", "Phrase");
  cpaCheck(phraseCampaignReport, "phrase");
  cleanLog(" ");

  // Ad Group Phrase
  var phraseAdGroupReport = gimmeMyReport("Ad Group", "Phrase");
  cpaCheck(phraseAdGroupReport, "phrase");
  cleanLog(" ");

  // Campaign Exact
  var exactCampaignReport = gimmeMyReport("Campaign", "Exact");
  cpaCheck(exactCampaignReport, "exact");
  cleanLog(" ");

  // Ad Group Exact
  var exactAdGroupReport = gimmeMyReport("Ad Group", "Exact");
  cpaCheck(exactAdGroupReport, "exact");
  cleanLog(" ");

  if (keywordCount > 0) {
    try {
      var subject = "[DAVE] Keyword Report for " + AdsApp.currentAccount().getName();
      var body = fullCleanLog;
      MailApp.sendEmail(yourEmail, subject, body);
    } catch (e) {
      cleanLog("Unable to send keyword report email. Please check the email "
      + "addresses provided are valid.");
    }
  }

  Logger.log("Added " + keywordCount + " keyword(s).");
}

// Gets the report at either campaign or ad group level of search queries which:
// - have at least the minimum threshold of conversions
// - are not currently being targeted in the account
// - are in enabled ad groups and campaigns
// - have at least the minimum threshold of impressions
function gimmeMyReport(level, matchType) {
  if (level.toLowerCase() == "campaign") {
    reportLevel = "CampaignName";
  } else if (level.toLowerCase() == "ad group") {
    reportLevel = "AdGroupName";
  }
  cleanLog("Level: " + level + ". Match Type: " + matchType);

  var report = AdWordsApp.report(
    "SELECT Query, Conversions, Cost, AdGroupId, QueryTargetingStatus,"
    + " CampaignStatus, AdGroupStatus, CampaignName, AdGroupName, Impressions,"
    + " Clicks, Ctr, ConversionRate, CostPerConversion, ConversionValue,"
    + " QueryMatchTypeWithVariant, KeywordTextMatchingQuery, AverageCpc"
    + " FROM SEARCH_QUERY_PERFORMANCE_REPORT"
    + " WHERE Conversions > "  + minConversions
    + " AND QueryTargetingStatus="NONE" AND"
    + " CampaignStatus="ENABLED" AND AdGroupStatus="ENABLED""
    + " AND Impressions > " + minImpressions
    + " AND KeywordTextMatchingQuery DOES_NOT_CONTAIN 'URL=='"
    + " AND KeywordTextMatchingQuery DOES_NOT_CONTAIN 'CATEGORY=='"
    + " AND KeywordTextMatchingQuery != '*'"
    + " AND " + reportLevel + " CONTAINS_IGNORE_CASE '" + matchType + "'"
  );

  return report;
}

// Checks whether CPA is below target. If so, it checks if checks whether query
// is eligible to be added as a keyword and then adds it if so.
function cpaCheck(report, criterionType) {
  var rows = report.rows();

  while (rows.hasNext()) {

    var row = rows.next();
    var adGroupId = row["AdGroupId"];
    var searchQuery = row["Query"];
    var campaignName = row["CampaignName"];
    var adGroupName = row["AdGroupName"];
    var impr = row["Impressions"];
    var clicks = row["Clicks"];
    var ctr = row["Ctr"];
    var avgCpc = row["AverageCpc"];
    var cost = row["Cost"];
    var conv = row["Conversions"];
    var convRate = row["ConversionRate"];
    var CPA = row["CostPerConversion"]; // can this use CostPerConversion ?
    var revenue = row["ConversionValue"];
    var roas = revenue / cost;
    var kwText = row["KeywordTextMatchingQuery"];

    var stats = ["Search Query: " + searchQuery,
    "Campaign: " + campaignName,
    "Ad Group: " + adGroupName,
    "Keyword: " + kwText,
    "Impressions: " + impr,
    "Clicks: " + clicks,
    "CTR: " + ctr,
    "Avg. CPC: " + avgCpc,
    "Cost: " + cost,
    "Revenue: " + revenue,
    "ROAS: " + roas.toFixed(2),
    "Conversions: " + conv,
    "Conv. rate: " + convRate,
    "CPA: " + CPA];

    var adGroupSelector = AdsApp.adGroups().withIds([adGroupId]);

    var adGroupIterator = adGroupSelector.get();
    while (adGroupIterator.hasNext()) {
      var adGroup = adGroupIterator.next();

      if (CPA <= maxCPA) {
        if (roas >= minROAS) {
          try {
            if (canWeEvenDealWithThisTing(searchQuery)) {
              addThatTing(searchQuery, adGroup, criterionType, CPA, avgCpc, conv, stats);
              keywordCount++;
            }
          } catch (e) {
            cleanLog("Unable to add " + searchQuery + " as keyword.");
          }
        }
      }
    }
  }
}

// Adds the search term as a targeted keyword with either a broad match
// modifier, phrase or exact match type
function addThatTing(thatQuery, thatAdGroup, thatCriterionType,
  thatCPA, bid, thatConv, thatStats) {
    if (thatCriterionType == "broad") {
      //var addedQuery = "+" + thatQuery.replace(/ /g," +"); //for bmm
      var addedQuery = thatQuery;
    } else if (thatCriterionType == "phrase") {
      var addedQuery = '"' + thatQuery + '"';
    } else {
      var addedQuery = "[" + thatQuery + "]";
    }

    var keywordOperation = thatAdGroup.newKeywordBuilder()
    .withText(addedQuery)
    .withCpc(bid)
    .build();

    // Gets the newly built keyword and applies the keyword label
    var keyword = keywordOperation.getResult();
    keyword.applyLabel(keywordLabel);

    cleanLog(" ");

    // Logs statistics and details of the search query to the Logger
    thatStats.forEach(function(stat) {
      cleanLog("- " + stat);
    });
  }

// Logs a message and returns false if query is too long (more than 10 words or
// more than 80 characters) to be added as a targeted keyword
function canWeEvenDealWithThisTing(longQuery) {
  if ((longQuery.match(/s/gi) || []).length > 10) {
    cleanLog(" ");
    cleanLog(">> '" + longQuery
    + "' is more than 10 words so can't be added.");
    return false;
  } else if (longQuery.length > 80) {
    cleanLog(" ");
    cleanLog(">> '" + longQuery
    + "' is longer than 80 characters so can't be " +
    "added.");
    return false;
  } else {
    return true;
  }
}

function cleanLog(input) {
  Logger.log(input);
  fullCleanLog += "n" + input;
}

function labelMaker() {
  try {
    // checks to see if keywordLabel exists
    var labelSelector = AdsApp.labels();
    var labelIterator = labelSelector.get();
    var createKeywordLabel = true;

    while (labelIterator.hasNext()) {
      var label = labelIterator.next();
      var labelName = label.getName();

      if (labelName == keywordLabel) {
        createKeywordLabel = false;
      }
    }

    if (createKeywordLabel) { // if keywordLabel wasn't found amongst labels
      AdsApp.createLabel(keywordLabel); // creates keywordLabel
      Logger.log("Creating keyword label '" + keywordLabel + "'.");
      Logger.log("");
    }
  } catch (e) {
    Logger.log("There was an error creating the keyword label. It might "
    + "already be on this account.");
    Logger.log("");
    // error catching
  }
}

Comment ça marche?

Ce script examine efficacement chaque requête de recherche qui a déclenché vos annonces et conduit à des conversions, telles que les remplissages de formulaires de contact, les appels téléphoniques ou les transactions. Une fois qu’il aura trouvé un candidat suffisant, il les ajoutera à la campagne cible et définira des offres pertinentes pour vous.

A LIRE :  Qu'est-ce qu'une preuve de concept et en avez-vous besoin d'une en 2019?

Étant donné que les performances des termes de recherche peuvent varier au fil du temps, il examine les données de tous les temps pour déterminer exactement quels termes de recherche fonctionnent réellement de manière cohérente. En exécutant le script sur une base quotidienne ou hebdomadaire, vous pouvez maintenir votre compte à jour avec les mots clés les plus performants possibles et développer automatiquement le compte.

Pour décider de l’enchère à attribuer à un mot-clé, ce script définit la valeur moyenne de tous les temps. CPC au niveau des mots clés. Cela n’aura pas trop d’importance si vous utilisez une stratégie d’enchères automatiques, mais si ce n’est pas le cas, vous pouvez être assuré que Dave définit des enchères appropriées à peu près au niveau de ses performances précédentes.

Le script ajoute uniquement les termes de recherche qui n’ont pas déjà été ajoutés en tant que mots clés ciblés ou exclus avec des mots clés négatifs. Si vous avez un terme de recherche à fort taux de conversion mais que vous l’avez bloqué avec un mot-clé négatif, Dave l’ignorera docilement.

Parfois, le script ajoute des fautes d’orthographe et des variantes proches qui fonctionnent bien. Lors de nos tests, les mots-clés ajoutés par le script ont tendance à être beaucoup moins compétitifs que ceux que vous avez déjà dans le compte, donc non seulement vous pouvez apparaître là où vos concurrents ne sont pas, mais vous devriez également vous retrouver avec des clics moins chers et moins chers reconversions aussi.

En fait, cette requête vers un script de mot-clé est si efficace pour trouver ces diamants bruts, que dans l’un de nos comptes, elle a ajouté un mot-clé alternatif qui mène à un 300% d’augmentation des conversions, une Diminution de 17 % de la moyenne. CPC, une 76% de baisse du coût par acquisition et un 257% d’augmentation du taux de conversion. Bien rangé.

Le mot-clé en haut est un mot-clé choisi par un humain avec des années d’expérience en PPC et une familiarité avec l’industrie des clients. Le mot-clé le plus performant ci-dessous a été ajouté par Dave.

C’est pourquoi nous aimons ce script PPC.

Souhaitez-vous obtenir des performances similaires pour les mots clés de votre compte ? Essayez-le aujourd’hui !

Comment l’utiliser ?

Vous pouvez à peu près utiliser ce script sans aucune personnalisation, si vous le souhaitez. Hors de la boîte, il est prêt à basculer, adapté à la majorité des comptes. À condition que vous ayez étiqueté vos campagnes ou groupes d’annonces avec les types de correspondance de mots clés que vous souhaitez que Dave ajoute (par exemple, “Large”, “Exacte” ou “Exact”), le script devrait fonctionner dès le départ.

A LIRE :  Comment retrouver le casier judiciaire d’une personne ? [4 Proven Methods]

Étant donné que Dave examine les noms de vos campagnes ou groupes d’annonces pour déterminer le type de correspondance auquel ajouter les mots clés, si vous avez le mot “Large” dans votre campagne ou groupe d’annonces, Dave ajoutera les mots clés de conversion en tant que mots clés larges (par exemple agence de nottingham ppc). De même, toutes les campagnes ou groupes d’annonces contenant le mot « Exact » ou « Exact » auront une expression (« nottingham ppc agency ») ou exacte ([nottingham ppc agency]) mots-clés ajoutés.

Vous pouvez également mélanger et faire correspondre les types de correspondance de vos mots clés, par exemple, si vous aviez “Large, Phrase & Exact” dans la campagne (ou le groupe d’annonces), cela ajouterait le mot clé comme les trois types de correspondance au groupe d’annonces que le conversion de la requête de recherche convertie en.

Si vous avez différents types de correspondance entre le nom de votre campagne et le nom de votre groupe d’annonces, par exemple, “Exact” au niveau du groupe d’annonces et “Large” au niveau de la campagne – Dave ajoutera à la fois des mots clés modificateurs de requête large et exacts à ce groupe d’annonces.

La seule autre chose à retenir est que vous aurez besoin de données de conversion pour que le script fonctionne et que plus vous avez de données de conversion, mieux c’est. Si vous n’avez pas encore configuré le suivi des conversions, c’est la première chose que vous devez faire. Une fois que vous avez obtenu quelques conversions, vous pouvez configurer Dave pour qu’il garde un œil vigilant sur votre compte. Il ne peut pas créer une campagne à partir de zéro, fondamentalement.

Pour configurer le script, suivez les étapes ci-dessous :

  1. Copier le script

    Accédez à votre compte Google Ads. Cliquez sur Outils et paramètres dans la barre d’outils, puis sur « Scripts » sous Opérations en bloc. Créez un nouveau script, supprimez le code que Google crée, puis collez notre code dans

  2. Définissez les options en haut du code

    maxCPA vous permet de définir le coût par acquisition maximal absolu qu’une requête de recherche est autorisée à avoir pour que vous puissiez envisager de l’ajouter en tant que mot-clé

    minROAS vous permet de définir le retour minimum absolu sur les dépenses publicitaires (revenus divisés par le coût) que la requête de recherche devrait avoir avant d’être ajoutée en tant que mot clé. Si vous ne suivez pas la valeur des revenus/conversions dans votre compte (par exemple, il s’agit d’un compte de génération de leads), définissez simplement cette valeur sur 0.

    minImpressions est le nombre minimum d’impressions de tous les temps que la requête de recherche doit avoir avant que le script ne soit autorisé à l’ajouter en tant que mot clé ciblé. Cela permet d’éviter que le script n’ajoute de nombreuses requêtes de recherche qui ne sont recherchées qu’une seule fois

    minConversions est le paramètre qui vous permet de dire à Dave combien de conversions de tous les temps une requête de recherche doit avoir avant de pouvoir être ajoutée en tant que mot-clé

    yourEmail est l’endroit où vous pouvez entrer votre adresse e-mail afin que le script vous envoie un e-mail lorsqu’il a fini de s’exécuter et vous informe de tous les mots-clés qu’il a ajoutés. Pour ajouter plusieurs adresses e-mail, séparez-les par des virgules

    keywordLabel est l’endroit où vous pouvez définir une étiquette pour les mots clés afin que vous puissiez facilement les identifier dans Google Ads et analyser leurs performances.

  3. Enregistrer et prévisualiser le script

    Il vous demandera probablement d’autoriser le script au moins une fois. Une fois que vous avez cliqué sur Aperçu, vous verrez les mots-clés que le script ajouterait dans la section Modifications ou Journal. Si tout semble bon, exécutez le script pour de vrai !

  4. Créez un calendrier pour que le script s’exécute quotidiennement

    Cela permettra au script d’ajouter constamment de nouveaux mots-clés dès qu’ils répondent à vos exigences définies

Crédit supplémentaire : pourquoi s’appelle-t-il Dave ?

Pour ceux qui mourraient d’envie de savoir, le script s’appelait à l’origine “QTK” – Query to Keyword. Ensuite, nous avons créé une nouvelle version qui a ajouté des mots-clés en fonction de leur CPA et l’a nommée « QTKC » (Query To Keyword – CPA) encore plus déroutante.

Sur la base de la partie “KC” du nom, certains membres du personnel ont dit que nous devrions l’appeler Casey. D’autres ont préféré le nom Quentin, citant le “QT” dans le nom pour étayer leur position. Finalement, deux factions se sont formées et nous avons fini par faire référence au script sous les deux noms ainsi qu’à l’occasion de l’appeler QTKC 1.12 afin d’être plus précis.

Inutile de dire que les choses sont devenues un peu confuses, alors finalement, nous avons décidé de l’appeler simplement Dave, le nom de l’un de nos légendaires gardes de sécurité ici au QG d’Impression.

Bien sûr, quelques rebelles d’Impression l’appellent encore Quentin, mais son nom est bien Dave et notre agent de sécurité en est absolument ravi. (Nous aussi !)


Cet article fait partie d’une série de scripts open source. Cette collection de scripts open source – disponibles pour une utilisation à des fins personnelles et professionnelles – contient une sélection de divers scripts et outils qui ont été créés en interne par l’équipe Impression pour répondre aux demandes et résoudre les défis auxquels nous avons personnellement été confrontés lors de la direction SEO primé et campagnes médiatiques payantes.