Google Ads Negative Keywords Automatisering med AI

Google Ads Negative Keywords Automatisering med AI

FlowHunt automatiserer Google Ads negative søgeordshåndtering med AI, så virksomheder kan reducere omkostninger, optimere annonceforbrug og forbedre kampagneresultater uden besvær.

Forståelse af uønsket forbrug på søgeord

Uønsket forbrug på søgeord opstår, når dine annoncer vises i søgeresultater, der ikke matcher det, du sælger. Dette kan hurtigt tømme dit budget, da hvert irrelevant klik koster penge uden at føre til et salg. For eksempel, hvis en virksomhed, der sælger eksklusive lædersko, målretter brede søgeord som “køb sko”, kan de tiltrække klik fra folk, der er interesseret i sneakers eller sandaler – produkter, de ikke tilbyder. Denne uoverensstemmelse i søgeords-målretning kan føre til spildt annonceforbrug og lavere ROI. Virksomheder skal forstå dette for at undgå unødvendige økonomiske tab og fokusere deres budget på de rette søgeord.

Negative søgeords rolle

Negative søgeord er et vigtigt værktøj i enhver Google Ads-kampagne. De gør det muligt for annoncører at udelukke specifikke søgetermer fra at udløse deres annoncer, så kun relevante søgninger fører til annoncevisninger. For eksempel kan brug af negative søgeord som “billig” eller “rabat” hjælpe læderskovirksomheden med at undgå klik fra personer, der ikke er interesseret i premium-produkter. Ved nøje at udarbejde en liste over negative søgeord kan virksomheder optimere deres annonceforbrug, reducere uønskede klik og øge kampagnens samlede effektivitet.

Brug af AI til søgeordshåndtering

Kunstig intelligens (AI) ændrer måden, annoncører håndterer Google Ads-kampagner på. AI-værktøjer som FlowHunt er udviklet til søgeordsgruppering og hjælper virksomheder med at identificere og organisere relaterede søgeord mere effektivt. Denne automatisering gør det lettere at finde både positive og negative søgeord og mindsker det manuelle arbejde med kampagnestyring. AI-drevet søgeordshåndtering muliggør realtidsændringer baseret på performance-data, så annonceforbruget løbende optimeres for bedst mulig ROI.

Strategier til at reducere uønsket søgeordsforbrug

For at reducere uønsket forbrug på søgeord bør virksomheder følge flere strategier:

  • Opdater regelmæssigt din søgeordsliste for at matche ændrede markedstendenser og forbrugerinteresser.
  • Implementér en stærk strategi for negative søgeord ved løbende at undersøge og opdatere listen over termer, du vil udelukke.
  • Overvåg og tilpas kampagner baseret på performance-data.
  • Analyser hvilke søgeord der fører til salg og hvilke der ikke gør for at finjustere målretning og maksimere annonceforbruget.

Case: PostAffiliatePro’s tilgang

PostAffiliatePro stod over for udfordringer med deres månedlige annonceforbrug og havde svært ved at opnå den ønskede ROI fra deres Google Ads-kampagner. De besluttede at bruge AI til at løse dette problem. Ved at inddrage AI-drevne værktøjer automatiserede de deres søgeordshåndtering og identificerede både positive og negative søgeord mere præcist. Denne ændring gjorde det muligt at optimere annonceforbruget, betydeligt reducere omkostninger og øge kampagneeffektiviteten. Deres erfaring fremhæver fordelene ved at bruge AI-teknologi til effektivt at styre forbruget på søgeord. Analyser af hvert nyt søgeord udføres inden for en time fra første visning af søgeordet. Hastigheden hjælper med at fange negative søgeord, før besøgende kan klikke på Google-annonce.

improved conversion rate Forbedret konverteringsrate (kun relevante søgninger giver flere salg)

Yderligere ressourcer

For dig, der vil lære mere om effektiv søgeordshåndtering og AI-optimering, kan du med fordel udforske disse ressourcer:

Her er vores script, som vi kører hver time for at evaluere søgeordsklynger.

Dette script har til formål at automatisere flere opgaver relateret til håndtering af Google Ads-kampagner. Det interagerer med Google Sheets for konfiguration og indstillinger og udfører operationer på Google Ads-konti, såsom analyse af søgetermer, tilføjelse eller udelukkelse af søgeord, samt integration med FlowHunt API’en for avanceret AI-baseret søgeordsklyngedannelse.

Google Sheet to manage script settings Google Sheet til at styre scriptindstillinger

Negative keywords automatically applied to Ad groups Negative søgeord anvendt automatisk på annoncegrupper

Hovedfunktion

  • Den centrale styringslogik findes i funktionen main(). Denne funktion åbner Google Sheets-dokumentet angivet i spreadsheetURL og henter nødvendige konfigurationsindstillinger som apiKey, country, language m.fl.
  • Systemet forsøger først at tilføje eventuelle nye positive søgeord til FlowHunt-klyngen. Hvis det lykkes, analyseres eventuelle ikke-tildelte søgetermer.

Søgeordsanalyse

  • Analyse af ikke-tildelte ord: Funktionen gennemgår alle annoncegrupper i Ads-kontoen markeret med et bestemt label. Den henter søgetermer fra Google Ads, der ikke aktuelt målrettes, og som har haft mindst én visning.
  • Systemet bruger FlowHunt API til at finde lignende søgeord til det søgeord, der analyseres, og filtrerer dem baseret på et angivet minimumMatch-kriterium.
  • Søgetermer, der matcher kriterierne, tilføjes enten som positive søgeord eller markeres som negative, hvis minimumskriterierne ikke er opfyldt. Det relevante Google Sheet opdateres herefter, og dine Google Ads-kampagner opdateres tilsvarende.

FlowHunt-integration

  • API-interaktion: Scriptet benytter funktionen callFlowHuntApi() til at kommunikere med FlowHunt API for bl.a. at hente workspace-id’er og danne søgeordsklynger.
  • Tilføj søgeord til klynge: Denne funktion sender positive søgeord tilbage til FlowHunt til klyngedannelse, så de baseres på live søgeforespørgselsdata fra Google Ads.
  • Tilføjede og negative søgeord logges i særskilte sheets til løbende opfølgning og gennemgang.

Brug

For at implementere dette script skal brugeren:

  • Angive en gyldig Google Sheets-URL og sikre, at de nødvendige sheets (“Settings”, “AddedKW”, “NegativeKW”) findes.
  • Konfigurere Google Sheets med korrekt FlowHunt API-nøgle, landekoder og andre relevante indstillinger.
  • Sikre, at scriptet afvikles i et Google Ads Script-miljø med den nødvendige API-adgang aktiveret.

Add script to your Google Ads in menu Tools -> Bulk Actions -> Scripts Tilføj scriptet til dine Google Ads i menuen Værktøjer -> Massehandlinger -> Scripts.

Glem ikke at indsætte det rigtige link til dit Google Sheet-dokument. Resten er vores magi. Vi identificerer søgeord, der tilhører kampagnen, og automatiserer håndteringen af søgeord (både negative og positive).

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

Ofte stillede spørgsmål

Hvorfor er negative søgeord vigtige i Google Ads?

Negative søgeord forhindrer dine annoncer i at blive vist for irrelevante søgninger, hvilket reducerer spildt forbrug og forbedrer kampagnens ROI ved kun at fokusere på de mest relevante forespørgsler.

Hvordan automatiserer AI håndteringen af negative søgeord?

AI-værktøjer som FlowHunt analyserer realtids søgerdata, identificerer irrelevante søgeord og opdaterer automatisk dine kampagner med negative søgeord, hvilket sparer tid og øger effektiviteten.

Hvilke resultater kan jeg forvente ved at automatisere negative søgeord med AI?

Forvent højere konverteringsrater, reduceret annonceforbrug på irrelevante klik og mere effektive kampagner, da AI kontinuerligt optimerer dine søgeordslister og målretning.

Hvordan opsætter jeg FlowHunts automatisering til mine Google Ads?

Du skal forbinde din Google Ads-konto, konfigurere indstillinger i et Google Sheet og implementere det medfølgende script for at aktivere automatiseret søgeordshåndtering drevet af FlowHunts AI.

Viktor Zeman er medejer af QualityUnit. Selv efter 20 år som leder af virksomheden er han først og fremmest softwareingeniør med speciale i AI, programmatisk SEO og backend-udvikling. Han har bidraget til adskillige projekter, herunder LiveAgent, PostAffiliatePro, FlowHunt, UrlsLab og mange flere.

Viktor Zeman
Viktor Zeman
CEO, AI-ingeniør

Automatisér dine Google Ads med AI

Klar til at maksimere din Google Ads ROI? Opdag hvordan AI-drevet automatisering håndterer dine negative søgeord og optimerer annonceforbruget.

Lær mere

PPC AI Agent med automatisk håndtering af negative søgeord
PPC AI Agent med automatisk håndtering af negative søgeord

PPC AI Agent med automatisk håndtering af negative søgeord

Automatisér negative søgeord i Google Ads med FlowHunt's PPC AI Agent. Ekskludér irrelevante søgninger, reducer spildt annoncebudget og forbedr konverteringer m...

2 min læsning
PPC AI +3
Søgeterm-isolering er afgørende for optimering af PPC-annoncer
Søgeterm-isolering er afgørende for optimering af PPC-annoncer

Søgeterm-isolering er afgørende for optimering af PPC-annoncer

Lær hvorfor søgeterm-isolering er afgørende for at optimere PPC-annoncer. Opdag hvordan du kan målrette højtydende søgetermer, øge ROI, reducere omkostninger og...

7 min læsning
PPC Search Term Isolation +5
AI-søgeordsforskning med SEO-målinger
AI-søgeordsforskning med SEO-målinger

AI-søgeordsforskning med SEO-målinger

Denne arbejdsgang automatiserer søgeordsforskning ved at generere en detaljeret tabel over relaterede søgeord til din målsætning, inklusive vigtige SEO-målinger...

3 min læsning