Google Ads Search Terms: A Weekly Triage with a Free Script, Make and AI

Disclosure: This page contains affiliate links. If you buy through them we may earn a commission, at no extra cost to you.

The short answer

Google Ads search terms show what people actually typed before they clicked your ad. Review them weekly: a free Google Ads script copies last week’s terms into a Google Sheet, an AI model in Make suggests which to exclude, you tick the ones you agree with, and the next run adds them to a negative keyword list. Nothing is excluded without a person’s tick.

Start here: the free script

Best for: any Search campaign. It lists last week’s search terms in a sheet and adds the ones you tick as negatives, with no API access or paid tool.

Line not to cross: letting anything add negatives without a person’s tick.

Add AI suggestions: Make

Best for: accounts with more terms than you want to read cold. Make sends each term to Claude and writes a one-line suggestion next to it. Its Free plan includes 1,000 credits a month.

Line not to cross: trusting a suggestion on a term with conversions. The script skips those even if they’re ticked.

Skip Make’s Google Ads app for now

Best for: teams that already have Google Ads API access set up in a Google Cloud project.

Line not to cross: setting up API access just for this. Since 9 September 2026, new projects start with test accounts only.

Google Ads search terms illustration: a sheet of search terms with some rows marked for exclusion, an AI suggestion card, a script window, a weekly calendar and a negative keyword list
On this page

Why Google Ads search terms need a weekly look

Your keywords are what you bid on; Google Ads search terms are what people actually typed. The gap keeps widening: broad match and AI Max match your ads to searches you never listed, so the search terms report is where you see what you really paid for.

Two limits are worth knowing before you automate anything:

  • Not every term is shown. Google omits search terms that don’t have enough query activity, to meet its privacy standards. Your sheet will only ever hold part of what you paid for.
  • Negatives are literal. Google says negative keywords won’t match close variants, so excluding “shoe” doesn’t exclude “shoes”. Add singular, plural and synonyms yourself; misspellings and capital letters are handled for you.

A weekly look keeps the list short enough to read. This guide turns it into a routine: one copy-paste script, one optional Make scenario, and a few minutes of your judgment each week. Search terms are one block of a wider weekly check; our Google Ads checklist covers the other four in about 20 minutes.

How the weekly triage works

Your Google Ads search terms land in one Google Sheet, on a tab called Search terms. Each week has four steps:

  1. Monday morning, the script runs. It adds every term you ticked last week to a negative keyword list, then replaces the tab with the last 7 days’ Google Ads search terms that got at least one click.
  2. An hour later, Make runs. It sends each new term to Claude with a short brief about your business and writes back one line: NEGATIVE, CHECK or KEEP, with a reason.
  3. During the week, you review. Tick Negate? for the terms you agree with and set the match type.
  4. Next Monday, the script adds your ticks and starts the next round. Terms with conversions are never added, even if ticked.

The sheet has nine columns: Search term, Campaign, Ad group, Clicks, Cost, Conversions, AI suggestion, Negate? and Match type. The script writes all of them except AI suggestion, which Make fills in.

Step 1: the sheet and the negative keyword list

You need two things: a sheet that holds this week’s Google Ads search terms, and a list that holds the ones you exclude. Create a Google Sheet and rename the first tab Search terms. Leave it empty: the script writes the headers on its first run. Copy the sheet’s URL.

Then create the list the script adds to. Google’s help on negative keyword lists gives the steps: open Keywords in the Campaigns menu, select the Negative keywords tab and the plus button, choose a campaign, enter one term you already know you never want, tick Save to new or existing list, and name the list Weekly triage.

Finally, apply the list to every Search campaign you want covered: go to Exclusion lists in the Tools menu, select the Negative keywords lists tab, tick Weekly triage and choose Apply to campaigns. A list does nothing until it’s applied. Each list holds up to 5,000 negative keywords, and an account can have 20 lists.

Step 2: the Google Ads script

In Google Ads, click the Tools icon, open Bulk actions and choose Scripts, then click the plus button (Google’s scripts help has screenshots). Name the script, delete the sample code and paste this:

// Weekly search-term triage for Google Ads (MarketingStackHub)
// Each run: 1) adds the terms you ticked to a negative
// keyword list, 2) writes the last 7 days' search terms
// to the sheet for next week's review.

const SPREADSHEET_URL = 'PASTE YOUR SHEET URL HERE';
const SHEET_NAME = 'Search terms';
const LIST_NAME = 'Weekly triage';
const MIN_CLICKS = 1;

const HEADERS = ['Search term', 'Campaign', 'Ad group',
  'Clicks', 'Cost', 'Conversions', 'AI suggestion',
  'Negate?', 'Match type'];

function main() {
  const sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL)
    .getSheetByName(SHEET_NAME);
  // Preview changes nothing in Google Ads but still
  // writes to sheets, so the sheet is left alone then.
  const preview = AdsApp.getExecutionInfo().isPreview();
  const added = addTickedNegatives(sheet);
  exportSearchTerms(sheet, added, preview);
}

function addTickedNegatives(sheet) {
  const lists = AdsApp.negativeKeywordLists()
    .withCondition("shared_set.name = '" + LIST_NAME + "'")
    .get();
  if (!lists.hasNext()) {
    throw new Error('No negative keyword list: ' + LIST_NAME);
  }
  const list = lists.next();
  const added = new Set();
  const rows = sheet.getDataRange().getValues().slice(1);
  rows.forEach(function (row) {
    const term = String(row[0]).trim().toLowerCase();
    if (row[7] !== true || !term || added.has(term)) return;
    if (Number(row[5]) > 0) {
      Logger.log('Skipped, has conversions: ' + term);
      return;
    }
    try {
      list.addNegativeKeyword(formatKeyword(term, row[8]));
      added.add(term);
    } catch (e) {
      Logger.log('Could not add "' + term + '": ' + e);
    }
  });
  Logger.log(added.size + ' negatives added to ' + LIST_NAME);
  return added;
}

function formatKeyword(term, matchType) {
  const type = String(matchType || 'exact').toLowerCase();
  if (type === 'phrase') return '"' + term + '"';
  if (type === 'broad') return term;
  return '[' + term + ']';
}

function exportSearchTerms(sheet, added, preview) {
  const query = 'SELECT search_term_view.search_term, ' +
    'campaign.name, ad_group.name, metrics.clicks, ' +
    'metrics.cost_micros, metrics.conversions ' +
    'FROM search_term_view ' +
    'WHERE segments.date DURING LAST_7_DAYS ' +
    "AND campaign.advertising_channel_type = 'SEARCH' " +
    "AND search_term_view.status = 'NONE' " +
    'AND metrics.clicks >= ' + MIN_CLICKS + ' ' +
    'ORDER BY metrics.cost_micros DESC';
  const rows = [];
  const search = AdsApp.search(query);
  while (search.hasNext()) {
    const r = search.next();
    const term = r.searchTermView.searchTerm;
    if (added.has(term.toLowerCase())) continue;
    rows.push([term, r.campaign.name, r.adGroup.name,
      Number(r.metrics.clicks),
      Math.round(Number(r.metrics.costMicros) / 1e4) / 100,
      Number(r.metrics.conversions), '', false, 'Exact']);
  }
  Logger.log(rows.length + ' search terms to review');
  if (preview) return;
  sheet.getRange('H2:H').removeCheckboxes();
  sheet.clearContents();
  sheet.getRange(1, 1, 1, HEADERS.length).setValues([HEADERS]);
  if (rows.length) {
    sheet.getRange(2, 1, rows.length, HEADERS.length)
      .setValues(rows);
    sheet.getRange(2, 8, rows.length, 1).insertCheckboxes();
  }
}

Replace PASTE YOUR SHEET URL HERE with your sheet’s URL. If you named the tab or the list differently, change those two lines too, and keep apostrophes out of the list name. Then:

  1. Click Authorize now, then Grant access. The script needs your Google Ads account and your Google Sheets.
  2. Click Preview. Google’s preview mode makes no changes to campaigns but still writes to spreadsheets, so this script checks for preview and leaves the sheet alone. The log says how many search terms it would write.
  3. Click Run once to fill the sheet for the first time.
  4. On the Scripts page, click the pencil in the Frequency column and choose a day of the week: Monday, early morning.

What it does, in plain words: it reads the rows where Negate? is ticked, skips any with conversions, and adds the rest to Weekly triage as exact match unless you chose Phrase or Broad. Then it pulls last week’s Google Ads search terms from Search campaigns with at least one click, leaves out terms that are already keywords or already excluded, and writes them sorted by cost. Google lets a single run last up to 30 minutes, far more than this needs.

We tested the script’s logic offline against mock Google Ads and Sheets data: ticked terms, terms with conversions, duplicates, a keyword Google would reject, an empty sheet, a missing list and preview mode. It hasn’t run in your account, so preview it first and read the log after the first real run.

Step 3: the AI step in Make

The script alone is enough for a small account. When the list of Google Ads search terms gets long, an AI first pass saves reading every term cold, and Make runs it without code. Build a new scenario with three modules:

  1. Google Sheets: Search Rows. Pick your sheet and the Search terms tab, filter for rows where AI suggestion is empty, and cap the number of rows so a busy week can’t run up credits.
  2. Anthropic Claude: Create a Prompt. Connect it with an API key from the Anthropic Console, paste the prompt below, and map the cells from Search Rows wherever the prompt has square brackets.
  3. Google Sheets: Update a Row. Map the row number from Search Rows and put Claude’s reply in the AI suggestion column.

Fill in your business on the second and third lines of the prompt, then schedule the scenario weekly on Monday, an hour after the script.

You review Google Ads search terms for a business.
Business: [what you sell, where, and to whom]
Never advertise: [jobs, free, DIY, used, or anything
else you don't offer]

Reply with one line only, in one of these forms:
NEGATIVE – reason (the searcher can't want what we sell)
CHECK – reason (unclear, a person should decide)
KEEP – reason (relevant to what we sell)

Rules:
- A term with conversions is never NEGATIVE.
- Competitor brand names are CHECK, not NEGATIVE.
- Keep the reason under 12 words.

Search term: [Search term]
Campaign: [Campaign], ad group: [Ad group]
Clicks: [Clicks], cost: [Cost], conversions: [Conversions]

What it costs. Make bills in credits, and most actions use one. This scenario uses about two per search term (the Claude call and the row update) plus one for the search, so 100 terms is roughly 200 credits a run, or 800 to 1,000 for a month of Mondays. That’s about the whole Free plan of 1,000 credits a month. Core includes 10,000 credits for $9 a month billed annually, or $10.59 billed monthly (Make’s pricing page, 23 October 2026). Anthropic bills the API calls separately.

Claude’s Simple Text Prompt module needs no API key, but it runs on Make’s own AI provider, which Make says can use more credits per action. If you’d rather use ChatGPT or Gemini, Make has apps for both, and the same prompt works.

Step 4: your weekly review

Open the sheet once during the week. Your Google Ads search terms are sorted by cost, so the ones that matter most are at the top.

  • NEGATIVE: read the term and the reason, and tick Negate? if you agree. Exact match blocks that search only. Choose Phrase to block every search containing those words in that order, or Broad to block any search containing all of them in any order.
  • CHECK: these need your knowledge of the business. Competitor names, places you don’t serve and ambiguous product words usually land here.
  • KEEP: skim them. A KEEP term with clicks and no conversions may need a better ad or landing page rather than a negative, or it may be a keyword worth adding.

Two habits keep the list healthy. When you negate a word, add its plural or synonym yourself, because negatives don’t match close variants. And go easy on Phrase and Broad negatives: a single word such as “free” can also block searches you want, like “free delivery”.

Why not use Make’s Google Ads app?

Make has a Google Ads Campaign Management app with a module called Add a Negative Keyword to a Negative Keyword List, so the whole loop could live in Make. The catch is access. The app talks to the Google Ads API, and Google changed how API access works on 9 September 2026: developer tokens were retired, and access levels now belong to a Google Cloud project. A new project starts with Test access, which works on test accounts only. Explorer access, which Google says is usually approved automatically, allows up to 2,880 operations a day on real accounts. Make’s setup notes still described the older developer-token steps on 23 October 2026, so expect some trial and error.

A Google Ads script needs none of this: it runs inside your account, under your own sign-in. That’s why this setup uses the script to read Google Ads search terms and add negatives, and keeps Make for the AI step.

Without Make or AI

You can run the script on its own and review your Google Ads search terms unaided. For a small account, that’s the quickest routine of all. Or skip Make and paste the sheet into an AI assistant: the search-term triage skill in our guide to AI for Google Ads does the same first pass in Claude, Gemini or ChatGPT. If you’d like the script and prompt kept with a full version history, our guide to GitHub for marketers shows a simple setup.

For other ways to connect Google Ads to the rest of your tools, see our PPC tools guide and Zapier vs Make.

Guardrails

Automating Google Ads search terms is safe when a person keeps the last word. This setup is built that way:

  • A person ticks every negative. The script never adds a term that isn’t ticked.
  • Terms with conversions are skipped even when ticked, and the log says so.
  • Preview before you schedule, and check the log after the first real run.
  • Watch the list size. A list holds 5,000 negatives; when you get close, start a second list and change LIST_NAME in the script.
  • Search terms can include names or other details people typed. Check your AI provider’s data terms before you send them, and send only the columns the prompt needs.

The bottom line

Google Ads search terms are where wasted spend shows up first, and a weekly look is the cheapest fix there is. Start with the free script and your own judgment. Add Make and an AI model when the list gets too long to read, and keep the final tick for a person.

Frequently asked questions

How often should I check Google Ads search terms?

Weekly suits most accounts. Check more often after a big change, such as switching keywords to broad match or turning on AI Max, or if you spend a lot each day.

Why are some Google Ads search terms missing from the report?

Google leaves out search terms that don’t have enough query activity, to meet its privacy standards. The terms you can see are only part of what triggered your ads.

Can a Google Ads script add negative keywords automatically?

Yes. Scripts can add keywords to a negative keyword list in exact, phrase or broad match. The script in this guide only adds the terms a person has ticked, and never a term with conversions.

Do I need Google Ads API access for this?

Not for the script: it runs inside your account. Make’s Google Ads app does need API access, which since 9 September 2026 is managed per Google Cloud project.

How many Make credits does the AI step use?

About two per search term plus one per run, so 100 terms is roughly 200 credits. A month of weekly runs at that size uses most of the Free plan’s 1,000 credits.

Will a negative keyword also block plurals and synonyms?

No. Negative keywords don’t match close variants, so add plurals and synonyms yourself. Misspellings and capital letters are covered automatically.

Can I use ChatGPT or Gemini instead of Claude?

Yes. Make has apps for OpenAI and Google Gemini, and the same prompt works. Keep the one-line reply format so the sheet stays easy to scan.

Does the script cover Performance Max?

No, it reads Search campaigns only. Performance Max reports its search terms separately, so review those in the Google Ads interface.

Similar Posts