Automatisering av negativa sökord i Google Ads med AI

Automatisering av negativa sökord i Google Ads med AI

Google Ads Negative Keywords AI Automation

Förståelse för oönskad annonsspendering på sökord

Oönskad annonsspendering på sökord uppstår när dina annonser visas i sökresultat som inte matchar det du säljer. Detta kan snabbt tömma din budget, eftersom varje irrelevant klick kostar pengar utan att leda till försäljning. Till exempel, om ett företag som säljer exklusiva läderskor riktar sig mot breda sökord som ”köpa skor”, kan de få klick från personer som är intresserade av sneakers eller sandaler, vilket inte är vad de erbjuder. Denna felmatchning i sökordsinriktning kan leda till bortkastad annonsspendering och lägre ROI. Företag behöver förstå detta för att undvika onödiga ekonomiska förluster och fokusera sin budget på rätt sökord.

Negativa sökords roll

Negativa sökord är ett viktigt verktyg i alla Google Ads-kampanjer. De låter annonsörer exkludera specifika söktermer från att utlösa deras annonser, så att endast relevanta sökningar leder till annonsvisningar. Till exempel kan användning av negativa sökord som ”billiga” eller ”rabatt” hjälpa läderskoföretaget att undvika klick från personer som inte är intresserade av premiumprodukter. Genom att noggrant skapa en lista över negativa sökord kan företag optimera sin annonsspendering, minska oönskade klick och öka kampanjens totala effektivitet.

Användning av AI för sökordshantering

Artificiell intelligens (AI) förändrar hur annonsörer hanterar Google Ads-kampanjer. AI-verktyg som FlowHunt är skapade för att gruppera sökord, vilket hjälper företag att identifiera och organisera relaterade sökord mer effektivt. Denna automatisering förenklar processen att hitta både positiva och negativa sökord, vilket minskar det manuella arbetet vid kampanjhantering. AI-driven sökordshantering möjliggör realtidsförändringar baserat på prestationsdata, så att annonsspenderingen kontinuerligt optimeras för bästa möjliga ROI.

Strategier för att minska oönskad annonsspendering

För att minska oönskad annonsspendering på sökord bör företag tillämpa flera strategier:

  • Uppdatera din sökordslista regelbundet för att matcha förändrade marknadstrender och konsumentintressen.
  • Implementera en stark strategi för negativa sökord genom att ständigt undersöka och uppdatera listan över termer du vill exkludera.
  • Övervaka och justera kampanjer baserat på prestationsdata.
  • Analysera vilka sökord som leder till försäljning och vilka som inte gör det för att förfina inriktningen och maximera annonsspenderingen.

Fallstudie: PostAffiliatePros tillvägagångssätt

PostAffiliatePro stod inför problem med sin månatliga annonsspendering och hade svårt att få den ROI de önskade från sina Google Ads-kampanjer. De bestämde sig för att använda AI för att lösa detta problem. Genom att införa AI-drivna verktyg automatiserade de sin sökordshantering och identifierade både positiva och negativa sökord mer exakt. Denna förändring gjorde att de kunde optimera sin annonsspendering, minska kostnaderna avsevärt och förbättra kampanjernas effektivitet. Deras erfarenhet understryker fördelarna med att använda AI-teknik för att effektivt hantera sökordsutgifter. Analyser av varje nytt sökord körs inom en timme från den första visningen av sökordet. Hastigheten hjälper till att fånga negativa sökord innan besökare kan klicka på Google-annonsen.

improved conversion rate Förbättrad konverteringsgrad (endast relevanta sökningar ger fler försäljningar)

Ytterligare resurser

För dig som vill lära dig mer om effektiv sökordshantering och AI-optimering, överväg att utforska dessa resurser:

Här är vårt skript som vi kör varje timme för att utvärdera sökordskluster.

Detta skript syftar till att automatisera flera uppgifter relaterade till hantering av Google Ads-kampanjer. Det interagerar med Google Sheets för konfiguration och inställningar, och utför operationer på Google Ads-konton, såsom analys av söktermer, tillägg eller exkludering av sökord samt integration med FlowHunt API för avancerad AI-sökordsgruppering.

Google Sheet to manage script settings Google Sheet för att hantera skriptinställningar

Negative keywords automatically applied to Ad groups Negativa sökord appliceras automatiskt på annonsgrupper

Huvudfunktion

  • Den centrala styrlogiken finns i funktionen main(). Denna funktion öppnar det Google Sheets-dokument som anges av spreadsheetURL, hämtar nödvändiga konfigurationsinställningar såsom apiKey, country, language och andra.
  • Systemet försöker först lägga till nya positiva sökord till FlowHunt-klustret. Om det lyckas fortsätter det med att analysera icke-tilldelade söktermer.

Sökordsanalys

  • Analys av icke-tilldelade ord: Funktionen går igenom alla annonsgrupper i Ads-kontot som är markerade med en specifik etikett. Den hämtar söktermer från Google Ads som för närvarande inte är inriktade och har haft minst ett visningstillfälle.
  • Systemet använder FlowHunt API för att hitta liknande sökord till det som analyseras och filtrerar dem baserat på ett angivet minimumMatch-kriterium.
  • Söktermer som uppfyller kriterierna läggs till som positiva sökord eller markeras som negativa om minimikraven inte är uppfyllda, och denna information uppdateras i relevant Google Sheet samt i dina Google Ads-kampanjer.

FlowHunt-integration

  • API-integration: Skriptet förlitar sig på funktionen callFlowHuntApi() för att interagera med FlowHunt API för olika uppgifter, inklusive att hämta arbetsytans ID och gruppera sökord.
  • Lägg till sökord i kluster: Denna funktion skickar positiva sökord tillbaka till FlowHunt för gruppering, så att de baseras på live sökfrågedata från Google Ads.
  • Tillagda och negativa sökord loggas i separata blad för löpande uppföljning och granskning.

Användning

För att använda detta skript behöver användare:

  • Ange en giltig Google Sheets-URL och se till att nödvändiga blad (“Settings”, “AddedKW”, “NegativeKW”) finns.
  • Konfigurera Google Sheets med korrekt FlowHunt API-nyckel, landskoder och andra driftsinställningar.
  • Säkerställ att skriptet körs i en Google Ads Script-miljö med rätt API-åtkomst aktiverad.

Add script to your Google Ads in menu Tools -> Bulk Actions -> Scripts Lägg till skriptet i dina Google Ads via menyn Verktyg -> Massåtgärder -> Skript.

Glöm inte att ange den faktiska länken till ditt Google Sheet-dokument. Resten är vår magi. Vi identifierar sökord som tillhör kampanjen och automatiserar hanteringen av sökord (både negativa och positiva).

//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;
}

Vanliga frågor

Varför är negativa sökord viktiga i Google Ads?

Negativa sökord förhindrar att dina annonser visas för irrelevanta sökningar, minskar bortkastad annonsspendering och förbättrar kampanjens ROI genom att fokusera endast på de mest relevanta sökningarna.

Hur automatiserar AI hanteringen av negativa sökord?

AI-verktyg som FlowHunt analyserar sökdata i realtid, identifierar irrelevanta sökord och uppdaterar automatiskt dina kampanjer med negativa sökord, vilket sparar tid och ökar effektiviteten.

Vilka resultat kan jag förvänta mig av att automatisera negativa sökord med AI?

Förvänta dig högre konverteringsgrad, minskad annonsspendering på irrelevanta klick och mer effektiva kampanjer när AI kontinuerligt optimerar dina sökordslistor och målgrupper.

Hur sätter jag upp FlowHunts automatisering för mina Google Ads?

Du behöver koppla ditt Google Ads-konto, konfigurera inställningar i ett Google Sheet och implementera det tillhandahållna skriptet för att möjliggöra automatiserad sökordshantering med FlowHunts AI.

Viktor Zeman är delägare i QualityUnit. Även efter 20 år som ledare för företaget är han främst mjukvaruingenjör, specialiserad på AI, programmatisk SEO och backendutveckling. Han har bidragit till många projekt, inklusive LiveAgent, PostAffiliatePro, FlowHunt, UrlsLab och många andra.

Viktor Zeman
Viktor Zeman
VD, AI-ingenjör

Automatisera dina Google Ads med AI

Redo att maximera din ROI från Google Ads? Upptäck hur AI-driven automatisering hanterar dina negativa sökord och optimerar annonsspenderingen.

Lär dig mer

PPC AI-agent med automatisering av negativa sökord
PPC AI-agent med automatisering av negativa sökord

PPC AI-agent med automatisering av negativa sökord

Automatisera negativa sökord i Google Ads med FlowHunts PPC AI-agent. Exkludera irrelevanta sökfrågor, minska bortkastade utgifter och förbättra konverteringar ...

2 min läsning
PPC AI +3
Söktermisolering är avgörande för optimering av PPC-annonser
Söktermisolering är avgörande för optimering av PPC-annonser

Söktermisolering är avgörande för optimering av PPC-annonser

Lär dig varför söktermisolering är avgörande för att optimera PPC-annonser. Upptäck hur du kan rikta in dig på högpresterande söktermer, öka ROI, sänka kostnade...

7 min läsning
PPC Search Term Isolation +5
AI Google Ads Rubrikgenerator
AI Google Ads Rubrikgenerator

AI Google Ads Rubrikgenerator

Generera högkonverterande, Google Ads-kompatibla rubriker direkt med vårt AI-drivna verktyg. Perfekt för marknadsförare, byråer och företag som vill skapa övert...

2 min läsning
Google Ads PPC +4