
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...

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.
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.
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.
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.
For å kutte ned på uønsket søkeordforbruk bør bedrifter ta i bruk flere strategier:
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.

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.


main(). Denne funksjonen åpner Google-arket angitt av spreadsheetURL, henter nødvendige konfigurasjonsinnstillinger som apiKey, country, language og andre.minimumMatch-grense.callFlowHuntApi() for å samhandle med FlowHunt API for ulike oppgaver, inkludert henting av arbeidsområde-ID og gruppering av søkeord.For å ta i bruk dette skriptet må brukere:

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

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

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

Søk uten klikk oppstår når en søkemotor besvarer brukerens forespørsel direkte på søkeresultatsiden (SERP), slik at det ikke er nødvendig å klikke seg inn på no...

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...
Informasjonskapselsamtykke
Vi bruker informasjonskapsler for å forbedre din surfeopplevelse og analysere vår trafikk. See our privacy policy.