Google Ads Negatieve Zoekwoorden Automatisering met AI

FlowHunt automatiseert het beheer van negatieve zoekwoorden in Google Ads met AI, waardoor bedrijven kosten besparen, advertentie-uitgaven optimaliseren en moeiteloos betere campagneresultaten behalen.

Google Ads Negatieve Zoekwoorden Automatisering met AI

Begrijpen van Ongewenste Zoekwoorduitgaven

Ongewenste zoekwoorduitgaven ontstaan wanneer je advertenties verschijnen bij zoekopdrachten die niet aansluiten bij wat je aanbiedt. Dit kan je budget snel uitputten, omdat elke irrelevante klik geld kost zonder tot een verkoop te leiden. Stel bijvoorbeeld dat een bedrijf dat luxe leren schoenen verkoopt brede zoekwoorden als “schoenen kopen” target; het kan dan klikken krijgen van mensen die op zoek zijn naar sneakers of sandalen, terwijl zij deze niet aanbieden. Dit verkeerde zoekwoordtargeting leidt tot verspilde advertentie-uitgaven en een lagere ROI. Bedrijven moeten dit concept begrijpen om onnodige financiële verliezen te voorkomen en hun budget te richten op de juiste zoekwoorden.

De Rol van Negatieve Zoekwoorden

Negatieve zoekwoorden zijn een essentieel hulpmiddel in elke Google Ads-campagne. Ze stellen adverteerders in staat om specifieke zoektermen uit te sluiten, zodat alleen relevante zoekopdrachten tot advertentieweergaven leiden. Bijvoorbeeld, door negatieve zoekwoorden zoals “goedkoop” of “korting” te gebruiken, kan het schoenenbedrijf klikken voorkomen van mensen die niet geïnteresseerd zijn in premium producten. Door zorgvuldig een lijst met negatieve zoekwoorden samen te stellen, kunnen bedrijven hun advertentiebudget optimaliseren, ongewenste klikken verminderen en de effectiviteit van hun campagne verhogen.

AI Gebruiken voor Zoekwoordenbeheer

Kunstmatige intelligentie (AI) verandert de manier waarop adverteerders hun Google Ads-campagnes beheren. AI-tools zoals FlowHunt zijn ontworpen voor zoekwoordgroepering en helpen bedrijven om gerelateerde zoekwoorden effectiever te identificeren en organiseren. Deze automatisering vereenvoudigt het proces van het vinden van zowel positieve als negatieve zoekwoorden en vermindert het handmatige werk dat komt kijken bij campagnebeheer. AI-gestuurd zoekwoordenbeheer maakt realtime aanpassingen mogelijk op basis van prestatiegegevens, waardoor advertentie-uitgaven continu worden geoptimaliseerd voor het beste rendement op investering.

Strategieën om Ongewenste Zoekwoorduitgaven te Verminderen

Om ongewenste zoekwoorduitgaven te beperken, kunnen bedrijven verschillende strategieën toepassen:

  • Werk je zoekwoordenlijst regelmatig bij om in te spelen op veranderende markttrends en consumentinteresses.
  • Implementeer een sterke negatieve zoekwoordenstrategie door constant onderzoek te doen en de lijst met uit te sluiten termen te actualiseren.
  • Monitor en optimaliseer campagnes op basis van prestatiegegevens.
  • Analyseer welke zoekwoorden tot verkoop leiden en welke niet om je targeting te verfijnen en je advertentiebudget maximaal te benutten.

Praktijkvoorbeeld: De Aanpak van PostAffiliatePro

PostAffiliatePro kampte met problemen in hun maandelijkse advertentie-uitgaven en slaagde er niet in het gewenste rendement uit hun Google Ads-campagnes te halen. Ze besloten AI in te zetten om dit probleem aan te pakken. Door AI-gestuurde tools te integreren, automatiseerden ze hun zoekwoordenbeheer en identificeerden ze zowel positieve als negatieve zoekwoorden nauwkeuriger. Deze verandering stelde hen in staat hun advertentie-uitgaven te optimaliseren, de kosten aanzienlijk te verlagen en de efficiëntie van hun campagnes te verbeteren. Hun ervaring benadrukt de voordelen van AI-technologie voor effectief zoekwoordbeheer. Analyses van elk nieuw zoekwoord worden binnen een uur na de eerste vertoning uitgevoerd. De snelheid helpt om negatieve zoekwoorden te onderscheppen voordat bezoekers op de Google-advertentie klikken.

improved conversion rate Verbeterde conversieratio (alleen relevante zoekopdrachten zorgen voor meer verkopen)

Aanvullende Bronnen

Voor wie meer wil leren over effectief zoekwoordenbeheer en AI-optimalisatie, bekijk deze bronnen:

Hier is ons script, dat we elk uur uitvoeren om zoekwoordclusters te evalueren.

Dit script is bedoeld om verschillende taken met betrekking tot het beheer van Google Ads-campagnes te automatiseren. Het werkt samen met Google Sheets voor configuratie en instellingen en voert bewerkingen uit op Google Ads-accounts, zoals het analyseren van zoektermen, het toevoegen of uitsluiten van zoekwoorden en het koppelen met de FlowHunt API voor geavanceerde AI-zoekwoordclustering.

Google Sheet to manage script settings Google Sheet om scriptinstellingen te beheren

Negative keywords automatically applied to Ad groups Negatieve zoekwoorden automatisch toegepast op advertentiegroepen

Hoofdfunctie

  • De belangrijkste logica bevindt zich in de main() functie. Deze functie opent het Google Sheets-document zoals gespecificeerd in spreadsheetURL en haalt de benodigde configuratie-instellingen op, zoals apiKey, country, language en andere.
  • Het systeem probeert eerst eventuele nieuwe positieve zoekwoorden toe te voegen aan het FlowHunt-cluster. Als dit lukt, worden niet-toegewezen zoektermen geanalyseerd.

Zoekwoordanalyse

  • Analyseren van Niet-toegewezen Woorden: De functie doorloopt alle advertentiegroepen in het Ads-account die zijn gemarkeerd met een specifiek label. Het haalt zoektermen op uit Google Ads die momenteel niet getarget zijn en minimaal één vertoning hebben gehad.
  • Het systeem gebruikt de FlowHunt API om vergelijkbare zoekwoorden te vinden bij het momenteel geanalyseerde zoekwoord, waarbij deze worden gefilterd op een gespecificeerde minimumMatch-criterium.
  • Zoektermen die aan de criteria voldoen, worden toegevoegd als positieve zoekwoorden of als negatieven gemarkeerd als de minimale criteria niet zijn gehaald, met een update in de relevante Google Sheet en een aanpassing in je Google Ads-campagnes.

FlowHunt-integratie

  • API-interactie: Het script maakt gebruik van de functie callFlowHuntApi() om met de FlowHunt API te communiceren voor verschillende taken, waaronder het ophalen van workspace-ID’s en het clusteren van zoekwoorden.
  • Zoekwoorden toevoegen aan cluster: Deze functie stuurt positieve zoekwoorden terug naar FlowHunt voor clustering, waarbij ze gebruik maken van live zoekopdrachtgegevens uit Google Ads.
  • Toegevoegde en negatieve zoekwoorden worden geregistreerd in aparte sheets voor voortdurende monitoring en evaluatie.

Gebruik

Om dit script te implementeren, moeten gebruikers:

  • Een geldige Google Sheets-URL opgeven en ervoor zorgen dat de benodigde sheets (“Settings”, “AddedKW”, “NegativeKW”) aanwezig zijn.
  • De Google Sheet configureren met de juiste FlowHunt API-sleutel, landcodes en andere operationele instellingen.
  • Controleren dat het script wordt uitgevoerd in een Google Ads Script-omgeving met de juiste API-toegang.

Add script to your Google Ads in menu Tools -> Bulk Actions -> Scripts Voeg het script toe aan je Google Ads via het menu Hulpprogramma’s -> Bulkacties -> Scripts.

Vergeet niet de echte link naar je Google Sheet-document in te stellen. De rest is onze magie. Wij identificeren zoekwoorden die bij de campagne horen en automatiseren het beheer van zoekwoorden (zowel negatief als positief).

//Global variables
var spreadsheetURL;
var spreadsheet;
var sheetSettings; 
var sheetAddedKW;
var sheetNegativeKW;
var apiKey;
var labelName;
var country;
var language;
var location;
var urlsCount;
var minimumMatch;
var workspaceId;

function main() {
    // Provide the Google Sheets URL here
  spreadsheetURL = "https://docs.google.com/spreadsheets/d/....... FULL URL TO GOOGLE SHEET";
  spreadsheet = SpreadsheetApp.openByUrl(spreadsheetURL);
  sheetSettings = spreadsheet.getSheetByName("Settings"); 
  sheetAddedKW = spreadsheet.getSheetByName("AddedKW");
  sheetNegativeKW = spreadsheet.getSheetByName("NegativeKW");
  apiKey = getSettingValue("FlowHuntAPIkey")
  labelName = getSettingValue("LabelName")
  country = getSettingValue("CountryCode")
  language = getSettingValue("LanguageCode")
  location = getSettingValue("Location")

  urlsCount = getSettingValue("TopUrlsCount")
  minimumMatch = getSettingValue("MinimumMatch")
  workspaceId = getWorkspaceId()
  
  if (workspaceId.length < 10) {
    Logger.log("Failed to load workspace id from FlowHunt, check API key");
    return;
  }
  
  Logger.log("FlowHunt WorkspaceId: " + workspaceId);
  
  if (addPositiveKWsToCluster() == 0) {
    // Analyze new keywords just if all positive keywords added already
    analyzeNotAssignedWords();
  }
}

function analyzeNotAssignedWords() {
  Logger.log("*** START Checking not assigned keywords");
  
  // Iterate through all ad groups in the account
  var adGroupsIterator = AdsApp.adGroups().get();
  
  while (adGroupsIterator.hasNext()) {
    var adGroup = adGroupsIterator.next();
    var groupName = adGroup.getId() + " - " + adGroup.getName();
    if (hasLabel(adGroup, labelName)) {
      // Get the search terms for the current ad group ordered by clicks in the last X days
      var searchTermsQuery = "SELECT Query FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
        "WHERE AdGroupId = " + adGroup.getId() +
        " AND QueryTargetingStatus = \"NONE\" " +
        "DURING TODAY";

      var searchTermsIterator = AdsApp.report(searchTermsQuery).rows();
      var adGroupKeywords = [];
      while (searchTermsIterator.hasNext()) {
        var searchTerm = searchTermsIterator.next();
        var searchTermText = searchTerm["Query"].trim();
        var similarQueries = getSimilarQueries(groupName, searchTermText)
        var filteredSimilarQueries = getFilteredSimilarQueries(similarQueries);
        if (filteredSimilarQueries.length > 0) {
          var keywordOperation = adGroup.newKeywordBuilder().withText("[" + searchTermText + "]").build();
          if (keywordOperation.isSuccessful()) {
            adGroupKeywords.push(searchTermText);
            var rowData = [groupName, searchTermText, new Date(), "ADDING AS POSITIVE, REVIEW!", JSON.stringify(filteredSimilarQueries)];
            sheetAddedKW.appendRow(rowData);
          } else {
            Logger.log("Failed to add keyword as positive:" + searchTermText)
          }
        } else {
          // add to negative
           adGroup.createNegativeKeyword("[" + searchTermText + "]");
          Logger.log("Excluded search term in ad group '" + groupName + "': " + searchTermText);
          var rowData = [groupName, "[" + searchTermText + "]", new Date(), JSON.stringify(similarQueries)];
          sheetNegativeKW.appendRow(rowData);
        }
      }
      if (adGroupKeywords.length > 0) {
        //Add all keywords in the list to FlowHunt Cluster
        addKeywordsToFlowHunt(groupName, adGroupKeywords);
      }
    }
  }
  Logger.log("*** FINISHED Checking not assigned keywords");
}

function getSimilarQueries(groupName, query) {
  result = callFlowHuntApi("/serp/serp/cluster/query_intersections?workspace_id="+workspaceId, "POST", {
    "query": query,
    "country": country,
    "language": language,
    "location": location,
    "group_name": groupName,
    "live_mode": true,
    "max_position": urlsCount
  });
  Logger.log(result)
  if (result.status=="SUCCESS") {
    return JSON.parse(result.result);
  }
  return []
}

function getFilteredSimilarQueries(similarQueries) {
  filtered = [];
  for (var i=1; i<similarQueries.length; i++){
    if (similarQueries[i].count>=minimumMatch) {
      filtered.push(similarQueries[i]);
    }
  }
  return filtered;
}

function addPositiveKWsToCluster() {
  Logger.log("*** START Checking new campaign keywords");
  // Iterate through all ad groups in the account
  var adGroupsIterator = AdsApp.adGroups().get();
  var processedKWs = sheetAddedKW.getDataRange().getValues();
  var processedKWsMap = {};
  var rowsAdded = 0;
  
  for (var i = 1; i < processedKWs.length; i++) { // Start at 1 to skip header row if exists
    var groupName = processedKWs[i][0];
    var keyword = processedKWs[i][1];
    processedKWsMap[groupName + '|' + keyword] = true;
  }
  
  while (adGroupsIterator.hasNext()) {
    var adGroup = adGroupsIterator.next();
    var groupName = adGroup.getId() + " - " + adGroup.getName();
    if (hasLabel(adGroup, labelName)) {
      var keywordsIterator = adGroup.keywords().get();
      var adGroupKeywords = [];
      while (keywordsIterator.hasNext()) {
        var keyword = keywordsIterator.next();
        if (keyword.isEnabled()) {
          var key = groupName + '|' + keyword.getText();
          if (!processedKWsMap[key]) {
            adGroupKeywords.push(keyword.getText());
            var rowData = [groupName, keyword.getText(), new Date(), "Already present in campaign"];
            sheetAddedKW.appendRow(rowData);
            processedKWsMap[key] = true; 
          }
        }
      }
      if (adGroupKeywords.length > 0) {
        //Add all keywords in the list to FlowHunt Cluster
        addKeywordsToFlowHunt(groupName, adGroupKeywords);
      } else {
        Logger.log("No new keywords in Group: " + groupName);
      }
      rowsAdded = rowsAdded + adGroupKeywords.length
    }
  }
  Logger.log("*** FINISHED Checking new campaign keywords");
  return rowsAdded;
}

function addKeywordsToFlowHunt(GroupName, adGroupKeywords) {
  requests = []
  adGroupKeywords.forEach(function(keyword) {
    requests.push(
        {
          "query": keyword,
          "country": country,
          "language": language,
          "location": location,
          "group_name": GroupName,
          "count_urls": 30
        }
      );
    });
  callFlowHuntApi("/serp/serp/cluster/add_queries?workspace_id="+workspaceId, "POST", {"requests":requests});
}

function getSettingValue(settingName) {
    var data = sheetSettings.getDataRange().getValues();
    for (var i = 0; i < data.length; i++) {
        if (data[i][0] === settingName) {
            return data[i][1];
        }
    }
    return null;
}
  
function getWorkspaceId() {
  result = callFlowHuntApi("/auth/me", "GET")
  if (result !== null) {
    return result.api_key_workspace_id;
  }
}

function callFlowHuntApi(endpoint, method, requestBody) {
    var url = "https://api.flowhunt.io/v2" + endpoint;
    var headers = {
        "Api-Key": apiKey,
        "Content-Type": "application/json"
    };
    var options = {
        "method" : method,  // or "post", "put", etc.
        "headers" : headers,
        "payload": JSON.stringify(requestBody)
    };
    
    try {
        var response = UrlFetchApp.fetch(url, options);
        var responseData = JSON.parse(response.getContentText());
        Logger.log(responseData);
        return responseData;
    } catch (e) {
        Logger.log("An error occurred: " + e.message);
    }
    return null;
}

function hasLabel(adGroup, labelName) {
  var labels = adGroup.labels().get();
  while (labels.hasNext()) {
    var label = labels.next();
    if (label.getName() === labelName) {
      Logger.log("Processing Adgroup " + adGroup.getName());
      return true;
    }
  }
  return false;
}

Veelgestelde vragen

Waarom zijn negatieve zoekwoorden belangrijk in Google Ads?

Negatieve zoekwoorden voorkomen dat je advertenties verschijnen bij irrelevante zoekopdrachten, waardoor je verspilde uitgaven vermindert en de ROI van je campagne verbetert door je alleen te richten op de meest relevante zoekopdrachten.

Hoe automatiseert AI het beheer van negatieve zoekwoorden?

AI-tools zoals FlowHunt analyseren realtime zoekgegevens, identificeren irrelevante zoekwoorden en werken je campagnes automatisch bij met negatieve zoekwoorden. Dit bespaart tijd en verhoogt de efficiëntie.

Welke resultaten kan ik verwachten van het automatiseren van negatieve zoekwoorden met AI?

Je kunt hogere conversieratio's, minder advertentie-uitgaven aan irrelevante klikken en efficiëntere campagnes verwachten, omdat AI je zoekwoordenlijsten en targeting continu optimaliseert.

Hoe stel ik de automatisering van FlowHunt voor mijn Google Ads in?

Je moet je Google Ads-account koppelen, instellingen configureren in een Google Sheet en het bijgeleverde script implementeren om geautomatiseerd zoekwoordenbeheer mogelijk te maken met de AI van FlowHunt.

Viktor Zeman is mede-eigenaar van QualityUnit. Zelfs na 20 jaar leiding te hebben gegeven aan het bedrijf, blijft hij in de eerste plaats een software engineer, gespecialiseerd in AI, programmatische SEO en backend-ontwikkeling. Hij heeft bijgedragen aan tal van projecten, waaronder LiveAgent, PostAffiliatePro, FlowHunt, UrlsLab en vele anderen.

Viktor Zeman
Viktor Zeman
CEO, AI Engineer

Automatiseer je Google Ads met AI

Klaar om het maximale uit je Google Ads te halen? Ontdek hoe AI-gestuurde automatisering je negatieve zoekwoorden beheert en advertentie-uitgaven optimaliseert.

Meer informatie