Google Ads Negative Keywords Automatisering med AI

Google Ads Negative Keywords Automatisering med AI

FlowHunt automatiserer håndtering av negative søkeord i Google Ads med AI, og hjelper bedrifter å kutte kostnader, optimalisere annonsebudsjett og forbedre kampanjeresultater uten anstrengelse.

Forståelse av uønsket søkeordforbruk

Uønsket søkeordforbruk oppstår når annonsene dine vises i søkeresultater som ikke samsvarer med det du selger. Dette kan raskt tømme budsjettet ditt, ettersom hvert irrelevant klikk koster penger uten å føre til et salg. For eksempel, hvis et firma som selger eksklusive skinnsko retter seg mot brede søkeord som “kjøp sko”, kan de tiltrekke klikk fra personer som er interessert i joggesko eller sandaler, som ikke er det de tilbyr. Denne feiljusteringen i søkeordmålretting kan føre til bortkastede annonsekostnader og lavere ROI. Bedrifter må forstå dette konseptet for å unngå unødvendige økonomiske tap og fokusere budsjettet på de riktige søkeordene.

Rollen til negative søkeord

Negative søkeord er et essensielt verktøy i enhver Google Ads-kampanje. De lar annonsører ekskludere spesifikke søkebegreper fra å utløse annonsene sine, slik at bare relevante søk fører til annonsevisninger. For eksempel kan bruk av negative søkeord som “billig” eller “rabatt” hjelpe skinnskofirmaet å unngå klikk fra personer som ikke er interessert i premiumprodukter. Ved å nøye utarbeide en liste over negative søkeord kan bedrifter optimalisere annonseforbruket, redusere uønskede klikk og øke kampanjens totale effektivitet.

Bruk av AI for søkeordhåndtering

Kunstig intelligens (AI) endrer måten annonsører håndterer Google Ads-kampanjer på. AI-verktøy som FlowHunt er laget for søkeordgruppering, og hjelper bedrifter med å identifisere og organisere relaterte søkeord mer effektivt. Denne automatiseringen forenkler prosessen med å finne både positive og negative søkeord, og reduserer det manuelle arbeidet som kreves for å håndtere kampanjer. AI-drevet søkeordhåndtering gir mulighet for sanntidsendringer basert på resultatdata, noe som sikrer at annonseforbruket kontinuerlig optimaliseres for best mulig ROI.

Strategier for å redusere uønsket søkeordforbruk

For å kutte ned på uønsket søkeordforbruk bør bedrifter ta i bruk flere strategier:

  • Oppdater søkeordlisten din jevnlig for å tilpasse deg endrede markedstrender og forbrukerinteresser.
  • Implementer en sterk negativ søkeordstrategi ved å stadig forske på og oppdatere listen over begreper du vil ekskludere.
  • Overvåk og juster kampanjer basert på resultatdata.
  • Analyser hvilke søkeord som fører til salg og hvilke som ikke gjør det for å forbedre målretting og maksimere annonseforbruket.

Casestudie: PostAffiliatePros tilnærming

PostAffiliatePro hadde utfordringer med sine månedlige annonseutgifter og slet med å få den ROI-en de ønsket fra Google Ads-kampanjene sine. De bestemte seg for å bruke AI for å løse dette problemet. Ved å ta i bruk AI-drevne verktøy automatiserte de søkeordhåndteringen sin og identifiserte både positive og negative søkeord mer nøyaktig. Denne endringen gjorde det mulig for dem å optimalisere annonseforbruket, redusere kostnadene betydelig og forbedre kampanjeeffektiviteten. Deres erfaring fremhever fordelene med å bruke AI-teknologi for å håndtere søkeordforbruk effektivt. Analyser av hvert nytt søkeord kjøres innen en time fra første visning av søkeordet. Hastigheten hjelper til å fange negative søkeord før besøkende kan klikke på Google-annonsen.

improved conversion rate Forbedret konverteringsrate (bare relevante søk gir flere salg)

Ytterligere ressurser

For de som ønsker å lære mer om effektiv søkeordhåndtering og AI-optimalisering, vurder å utforske disse ressursene:

Her er vårt skript, som vi kjører hver time for å evaluere søkeordklynger.

Dette skriptet har som mål å automatisere flere oppgaver relatert til håndtering av Google Ads-kampanjer. Det samhandler med Google Sheets for konfigurasjon og innstillinger, og utfører operasjoner på Google Ads-kontoer, som å analysere søketermer, legge til eller ekskludere søkeord, samt integrere med FlowHunt API for avansert AI-søkeordgruppering.

Google Sheet to manage script settings Google-ark for å administrere skriptinnstillinger

Negative keywords automatically applied to Ad groups Negative søkeord automatisk lagt til annonsegrupper

Hovedfunksjon

  • Kjernelogikken ligger i funksjonen main(). Denne funksjonen åpner Google-arket angitt av spreadsheetURL, henter nødvendige konfigurasjonsinnstillinger som apiKey, country, language og andre.
  • Systemet forsøker først å legge til nye positive søkeord i FlowHunt-klyngen. Hvis det lykkes, fortsetter det med å analysere ikke-tildelte søketermer.

Søkeordanalyse

  • Analyse av ikke-tildelte ord: Funksjonen itererer gjennom alle annonsegrupper i Ads-kontoen merket med en spesifikk etikett. Den henter søketermer fra Google Ads som ikke er målrettet og som har hatt minst ett visning.
  • Systemet bruker FlowHunt API for å finne lignende søkeord til det som analyseres, og filtrerer dem basert på en spesifisert minimumMatch-grense.
  • Søketermer som oppfyller kriteriene legges til som positive søkeord eller markeres som negative hvis minimumskriteriene ikke er oppfylt. Dette oppdaterer det aktuelle Google-arket og også Google Ads-kampanjene dine.

FlowHunt-integrasjon

  • API-integrasjon: Skriptet benytter funksjonen callFlowHuntApi() for å samhandle med FlowHunt API for ulike oppgaver, inkludert henting av arbeidsområde-ID og gruppering av søkeord.
  • Legg til søkeord i klynge: Denne funksjonen sender positive søkeord tilbake til FlowHunt for gruppering, slik at de informeres av live søkespørsmål fra Google Ads.
  • Både la til og negative søkeord logges i egne ark for løpende sporing og gjennomgang.

Bruk

For å ta i bruk dette skriptet må brukere:

  • Oppgi en gyldig Google Sheets-URL og sørge for at nødvendige ark (“Settings”, “AddedKW”, “NegativeKW”) er tilstede.
  • Konfigurere Google-arket med riktig FlowHunt API-nøkkel, landskoder og andre driftsinnstillinger.
  • Sørge for at skriptet kjøres i et Google Ads Script-miljø med riktig API-tilgang aktivert.

Add script to your Google Ads in menu Tools -> Bulk Actions -> Scripts Legg til skript i Google Ads under menyen Verktøy -> Massehandlinger -> Skript.

Ikke glem å angi den faktiske lenken til Google-arket ditt. Resten er vår magi. Vi identifiserer søkeord som tilhører kampanjen og automatiserer håndteringen av søkeord (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;
}

Vanlige spørsmål

Hvorfor er negative søkeord viktig i Google Ads?

Negative søkeord forhindrer at annonsene dine vises for irrelevante søk, reduserer bortkastede kostnader og forbedrer kampanjens ROI ved å fokusere kun på de mest relevante søkeordene.

Hvordan automatiserer AI håndteringen av negative søkeord?

AI-verktøy som FlowHunt analyserer sanntids søkedata, identifiserer irrelevante søkeord og oppdaterer automatisk kampanjene dine med negative søkeord, noe som sparer tid og øker effektiviteten.

Hvilke resultater kan jeg forvente av å automatisere negative søkeord med AI?

Forvent økt konverteringsrate, reduserte annonsekostnader på irrelevante klikk og mer effektive kampanjer ettersom AI kontinuerlig optimaliserer søkeordlister og målretting.

Hvordan setter jeg opp FlowHunts automatisering for mine Google Ads?

Du må koble din Google Ads-konto, konfigurere innstillinger i et Google-ark og distribuere det medfølgende skriptet for å aktivere automatisert søkeordhåndtering drevet av FlowHunts AI.

Viktor Zeman er medeier av QualityUnit. Selv etter 20 år som leder av selskapet, er han fortsatt først og fremst en programvareingeniør, med spesialisering innen AI, programmatisk SEO og backend-utvikling. Han har bidratt til en rekke prosjekter, inkludert LiveAgent, PostAffiliatePro, FlowHunt, UrlsLab og mange flere.

Viktor Zeman
Viktor Zeman
CEO, AI-ingeniør

Automatiser dine Google Ads med AI

Klar til å maksimere din Google Ads ROI? Oppdag hvordan AI-drevet automatisering håndterer dine negative søkeord og optimaliserer annonsebudsjettet.

Lær mer

PPC AI-agent med automatisering av negative søkeord
PPC AI-agent med automatisering av negative søkeord

PPC AI-agent med automatisering av negative søkeord

Automatiser negative søkeord i Google Ads med FlowHunts PPC AI-agent. Ekskluder irrelevante søk, reduser bortkastet annonsebudsjett og forbedre konverteringer m...

2 min lesing
PPC AI +3
Søkeordsisolering er avgjørende for PPC-annonseringsoptimalisering
Søkeordsisolering er avgjørende for PPC-annonseringsoptimalisering

Søkeordsisolering er avgjørende for PPC-annonseringsoptimalisering

Lær hvorfor søkeordsisolering er avgiktig for å optimalisere PPC-annonser. Oppdag hvordan du kan målrette høytytende søkeord, øke ROI, redusere kostnader og for...

6 min lesing
PPC Search Term Isolation +5
GoogleSearch-komponent
GoogleSearch-komponent

GoogleSearch-komponent

FlowHunts GoogleSearch-komponent forbedrer chatbotens nøyaktighet ved å bruke Retrieval-Augmented Generation (RAG) for å få tilgang til oppdatert kunnskap fra G...

4 min lesing
AI Components +4