---
title: "Build a Daily Negative Keyword Shortlist Without Paying an Agency to Check It"
description: "Use a Google Ads Script to flag costly, zero-conversion search terms, check landing-page engagement, and apply reviewed negatives across Search and Performance Max."
image: "https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f908f75564eacc82dbd8_b4bc3b7d-ba89-4ede-bf24-365bae129347.png"
---

September 28, 2026

•

min read

# Build a Daily Negative Keyword Shortlist Without Paying an Agency to Check It

![Young man with curly hair wearing a black shirt outdoors against green foliage background.](https://cdn.prod.website-files.com/6821efca072e48f6f495a47e/68562d390107b3921a6e3d68_1743932904108.jpg)

**Alexander Perleman**, Head Of Product @ groas
Ex-Goldman Sachs and Stanford Computer Science

alex@groas.ai

[LinkedIn](https://groas.com/post/set-up-automated-negative-keyword-exclus#)

![Cover image for: Build a Daily Negative Keyword Shortlist Without Paying an Agency to Check It](https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f908f75564eacc82dbd8_b4bc3b7d-ba89-4ede-bf24-365bae129347.png)

An agency can charge a percentage of your ad spend while someone checks the search terms report every two weeks and calls five exclusions optimization. I’d rather have the account flag costly queries every morning, then spend human attention on the decision that matters: whether those queries deserve to be blocked.

By the end of this walkthrough, you’ll have a daily shortlist of zero-conversion search terms, a way to use GA4 engagement data to investigate them, and negative keyword lists applied where they belong across Search and Performance Max. **The shortlist is automated; the decision to exclude is deliberate.** Google Ads Scripts cannot pull a search term’s GA4 bounce rate in the same search-term query, so a script that automatically blocks every costly, zero-conversion term is not the system this article promises.

Before starting, have these ready:

- **Standard or Administrative access** to your Google Ads account.
- **A linked Google Analytics 4 (GA4) property** and auto-tagging enabled.
- **A conversion baseline:** your target cost per acquisition (CPA), plus the historical bounce rate of the landing pages you’ll inspect.

#### Step 1: Find the queries consuming spend

Open **Campaigns > Insights and reports > Search terms** in Google Ads. Click **Columns > Modify columns** and confirm that **Clicks**, **Cost**, and **Conversions** are visible. Click **Apply**, then set the date range to `Last 30 days`.

Sort by cost and read the actual queries, not just the keywords that matched them. An ad group keyword such as `industrial plumbing software` can buy a click for `free plumbing invoice pdf`. The keyword’s average performance will not tell you that the query was a poor fit.

**Expected result:** You can see which reported search terms spent money without recording a conversion during the selected period.

**Mistake to avoid:** Opening **Search keywords** instead of **Search terms**. The first shows the targeting you entered; the second shows the queries you need to judge.

Do not look for a per-query GA4 bounce-rate column here. A linked GA4 property does not give this report a reliable bounce rate for each search term. Keep the query report open; you’ll use GA4 to investigate the landing page, not pretend it measured each query’s visit separately.

#### Step 2: Set a threshold before a term reaches the list

Use a rule that prevents three clicks and a bad afternoon from becoming a permanent exclusion. Start with all three checks:

1. **Spend:** The query has spent at least `1.0x–1.5x` your target CPA. If average CPC is below `$1.50`, use at least `20 clicks` as an additional volume check.
2. **Conversions:** The query shows `0.00` conversions in the evaluation window.
3. **Engagement investigation:** The landing page receiving the traffic warrants a closer look if its GA4 bounce rate is `75%` or higher, or its average session duration is under `8 seconds`.

For the third check, open the relevant landing-page report in GA4 and compare that page with its own historical baseline. [GA4 defines bounce rate as the percentage of sessions that were not engaged](https://support.google.com/analytics/answer/12195621). That makes it useful context. It does **not** establish that one particular search term produced the bounced sessions.

Say a query has spent `$150` against a `$100` target CPA and has no conversions. If its landing page also shows poor engagement, inspect the query and the page together. A visitor looking for a free template may have landed on a paid-software page. Equally, a page problem could be affecting otherwise useful traffic. Read the words in the query before deciding which explanation fits.

**Expected result:** A small set of expensive, zero-conversion queries that merit review, with landing-page engagement available as supporting evidence.

**Mistake to avoid:** Calling high page-level bounce an automatic diagnosis of query-level intent mismatch. Exclude the query because its meaning is wrong for the offer, not because two numbers look bad beside each other.

#### Step 3: Choose the narrowest negative that fixes the problem

Before adding anything, decide what you mean to block. Negative match types do not expand the way positive broad match does. In particular, [negative keywords do not automatically cover close variants such as plurals and misspellings](https://support.google.com/google-ads/answer/2453972). Check the wording you actually see in the report.

- **Negative exact match:** `[free plumbing templates]` blocks that query without extending the exclusion to queries with extra words. Use it when the particular search is wrong but its component words might be useful elsewhere.
- **Negative phrase match:** `"free download"` blocks queries containing that word sequence in that order. Use it when the phrase consistently signals an offer you do not provide.
- **Negative broad match:** `free` blocks queries containing that word. For multiword broad negatives, the query must contain every word, though their order can differ. Use a single-word exclusion only when that word has no value anywhere the list applies.

For example, if you sell commercial accounting software and `accounting course syllabus` repeatedly wastes spend, `accounting` is a terrible account-wide negative. Try the narrower `"accounting course"` or, if it is universally irrelevant, `syllabus`. The goal is to stop the wrong search without amputating the right one.

For more candidates to inspect, use our [Google Ads negative keywords list](https://groas.com/post/google-ads-negative-keywords-list-2026-comprehensive-guide-by-category-industry). Treat it as a review list, not a paste-and-pray file. Our [guide to negative keywords in Google Ads and Performance Max](https://groas.com/post/google-ads-negative-keywords-complete-guide) goes deeper on match types.

![Diagram comparing positive broad-match expansion with the narrower behavior of negative match types.](https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f909f75564eacc82dc10_84e2dde6-5d62-4d66-849e-de0c331f0b4b.png)

**Expected result:** Each candidate has a proposed negative and match type you can defend in one sentence.

**Mistake to avoid:** Promoting an ambiguous query to a broad, account-wide negative just because it crossed your spend floor. A hard stop is not a bid adjustment.

#### Step 4: Apply reviewed negatives to Search

Keep recurring exclusions in one place instead of chasing the same query through twenty ad groups.

1. Go to **Tools and settings > Shared library > Negative keyword lists**.
2. Click `+` and name the list `High-Bounce Intent Mismatches`.
3. Paste **reviewed** negatives using the match syntax you chose in Step 3, then click **Save**.
4. Select the list, click **Apply to campaigns**, select the Search campaigns where every entry is inappropriate, and confirm.

**Expected result:** The shared list is attached to the intended Search campaigns. Future eligible searches matching its negatives will not trigger those campaigns.

**Mistake to avoid:** Assuming *shared* means *safe for every campaign*. If one product line should still buy a query, do not attach the list to that campaign. Split offer-specific exclusions from universal ones before you apply anything widely.

#### Step 5: Cover Performance Max without blocking a good offer

The Search list does not protect Performance Max merely because you created it. Decide how widely each exclusion should apply, then use the corresponding route:

1. **Universal junk:** Go to **Admin > Account settings > Negative keywords**. Click `+`, add the reviewed broad or phrase negatives, and click **Save**. Use this route only for intent with no commercial value anywhere in the account, such as an irrelevant `"careers"` or `"support"` search. Account-level negatives affect more than the Search campaigns you selected in Step 4.
2. **Offer-specific mismatch:** Open the relevant Performance Max campaign, then go to **Settings > Additional settings > Negative keywords**. Add the applicable negatives or select the relevant list where the campaign interface offers that option, then save. Keep the exclusion at campaign level when another offer in the account could benefit from the query.

For the other exclusion controls, see our [Performance Max negative keyword walkthrough](https://groas.com/post/how-to-set-up-negative-keywords-performance-max-campaigns-pmax-exclusions-guide).

**Expected result:** The reviewed negatives are applied to the intended Performance Max campaign or at account level when they truly belong everywhere.

**Mistake to avoid:** Putting a low-margin SKU’s query into account-level negatives while another campaign sells that SKU as its main offer. Account-wide means account-wide. Check the scope before you click **Save**.

#### Step 6: Schedule a daily shortlist, not a blind blocklist

A weekly report leaves several days between inspections. Use a Google Ads Script to log costly, zero-conversion search terms each day. It will not read GA4 bounce rate, judge the query’s intent, or add a negative on your behalf. That restraint is a feature here.

Go to **Tools and settings > Bulk actions > Scripts**. Click `+`, name the script `Daily Negative Candidate Scanner`, and replace the editor’s default code with this:

```javascript
function main() {
  const SPEND_THRESHOLD = 150.00; // Set this from your target CPA.

  const query = `
    SELECT search_term_view.search_term, metrics.cost_micros, metrics.conversions
    FROM search_term_view
    WHERE segments.date DURING LAST_30_DAYS
      AND metrics.conversions = 0
      AND metrics.cost_micros > ${SPEND_THRESHOLD * 1000000}
    ORDER BY metrics.cost_micros DESC
  `;

  const report = AdsApp.search(query);
  while (report.hasNext()) {
    const row = report.next();
    const term = row.searchTermView.searchTerm;
    const cost = (row.metrics.costMicros / 1000000).toFixed(2);

    Logger.log(`Review: "${term}" | Cost: $${cost} | Conversions: 0`);
  }
}
```

Set `SPEND_THRESHOLD` to the spend floor you chose in Step 2; `$150` is the example value, not a universal setting. Click **Authorize** and grant the requested permissions. Click **Preview** to inspect the log, then **Save**. Set the frequency to `Daily` and the execution time to `06:00 AM`.

**Expected result:** Each run logs reported search terms that crossed your spend floor with zero conversions in the last 30 days. Review those entries against the query’s meaning, the offer, and the relevant landing page’s GA4 engagement before adding any negative through Steps 3–5. The script does not change campaigns.

**Mistake to avoid:** Replacing `Logger.log()` with an automatic negative-keyword action just to make the workflow feel more automated. [Scripts can work with shared negative keyword lists](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_negativekeywordlist), but this query supplies ad-platform cost and conversion metrics, not the GA4 engagement evidence your exclusion rule calls for. It also is not a complete substitute for reviewing Performance Max’s own search-term reporting.

![Linocut-style clockwork mechanism filtering a stream of paper tapes.](https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f908f75564eacc82dc0b_a2dd845b-f596-4406-b5f9-0854b4c51122.png)

##### Where the script stops

A `$151` query with zero conversions can be wasted spend. It can also be early-stage research for a longer sales cycle, or traffic sent to a page that briefly failed. **A negative keyword is a hard stop**, not a cheaper bid. The daily log finds work worth doing; it does not settle the case.

That distinction is why I prefer accountable execution to either a fortnightly agency check-in or an unsupervised bucket of script-generated exclusions. [groas](https://groas.com/paid-search) pairs continuous, specialized-model execution with guardrails, action logs, and a named human strategist. The point is not to remove judgment. It is to stop paying a percentage of spend for someone to open a report late.

#### Step 7: Audit the list, then verify the exclusions

Once a week, check what was blocked and whether the scope still makes sense:

1. Open **Tools and settings > Shared library > Negative keyword lists** and select `High-Bounce Intent Mismatches`.
2. Review recently added entries. For the highest-spending candidates, check CRM or assisted-conversion context before leaving an exclusion in place.
3. Check the affected campaigns under **Campaigns** and compare their impressions and conversion trends before and after the changes. If a sudden drop coincides with an exclusion, open **Tools and settings > Change history** and inspect what was added.
4. Revisit account-level and Performance Max exclusions separately. A term that is wrong for one offer may still be right for another.

To verify a particular negative, return to **Campaigns > Insights and reports > Search terms** and filter for `Added/Excluded = Excluded` where that status is available. Confirm the intended term is marked excluded and the negative is attached at the intended scope. **Do not expect its historical impression count to become zero.** The report still includes what happened before the exclusion; inspect subsequent days to see whether matching traffic stops.

The first thing to change once the process runs cleanly is the spend floor, not the match type. If your reviewed candidates consistently prove irrelevant and conversion volume holds, move the example threshold from `1.5x` target CPA toward `1.0x`. Keep the same intent review. Catching waste earlier is useful; blocking a valuable query earlier is just a faster way to waste money.

## Related Posts

[![](https://cdn.prod.website-files.com/plugins/Basic/assets/placeholder.60f9b1840c.svg) ##### Autonomous Ad Budget Allocation: Cost and How It Works FAQ Wasting ad budget and can't optimize fast enough? How real-time AI budget allocation works, what autonomous setup costs, and what to use at scale. September 28, 2026 • min read Written by](https://groas.com/post/autonomous-ad-budget-allocation-cost-faq)

[![](https://cdn.prod.website-files.com/plugins/Basic/assets/placeholder.60f9b1840c.svg) ##### AI Agents vs PPC Agencies: When to Fire Your Google Ads Agency Paying $4k/month with no improvement in 6 months? Learn when AI beats your agency, what fees buy, and how to switch without losing performance. September 28, 2026 • min read Written by](https://groas.com/post/ai-agents-vs-ppc-agencies)

[![Cover image for: The Fully Autonomous Google Ads Sales Page That Explains Nothing](https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f962a6f05098a5427812_1857e562-347b-480f-a838-1dee0315bba6.png) ##### The Fully Autonomous Google Ads Sales Page That Explains Nothing A straight-faced parody of the AI Google Ads pitch, with five questions its sales page hopes you never ask. September 28, 2026 • min read Written by](https://groas.com/post/the-fully-autonomous-human-led-ai-powere)

![](https://cdn.prod.website-files.com/6821efca072e48f6f495a47e/6823c03839b2b618430d5ae6_Light-p-500.png)

[![White stylized owl eyes with green background icon.](https://cdn.prod.website-files.com/6821efca072e48f6f495a47e/6a68a036a5dd5627409d3579_Groas%20Icon.png)](https://groas.com/post/set-up-automated-negative-keyword-exclus#)

[contact](mailto:scale@groas.ai)

Explore

[Home](https://groas.com/)[Philosophy](https://groas.com/our-philosophy)[Blog](https://groas.com/blog)

What We Do

[Paid Search](https://groas.com/paid-search)[Earned Search](https://groas.com/earned-search)

Who We Serve

[Businesses](https://groas.com/for-businesses)[Agencies](https://groas.com/for-agencies)

MCP

[ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6a9c2d7108f08191beb5b3d736be8655?q=groas)[Claude](https://claude.ai/directory/mcp-groas-ai)

Legal

[Privacy Policy](https://groas.com/legal/privacy-policy)[Terms of Service](https://groas.com/legal/terms)

Get Started

[Apply](https://groas.typeform.com/to/xC1bQNUT)

© 2026 groas 🇺🇸

[![](https://cdn.prod.website-files.com/62434fa732124a0fb112aab4/62434fa732124a389912aad8_linkedin%20small.svg)](https://www.linkedin.com/company/groas/)

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "",
      "@id": "https://www.groas.com/post/set-up-automated-negative-keyword-exclus#article",
      "headline": "Build a Daily Negative Keyword Shortlist Without Paying an Agency to Check It",
      "description": "Use a Google Ads Script to flag costly, zero-conversion search terms, check landing-page engagement, and apply reviewed negatives across Search and Performance Max.",
      "url": "https://www.groas.com/post/set-up-automated-negative-keyword-exclus",
      "image": {
        "@type": "ImageObject",
        "url": "https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f908f75564eacc82dbd8_b4bc3b7d-ba89-4ede-bf24-365bae129347.png"
      },
      "thumbnailUrl": "https://cdn.prod.website-files.com/6823bbd57170ea42b357cf81/6ab9f908f75564eacc82dbd8_b4bc3b7d-ba89-4ede-bf24-365bae129347.png",
      "datePublished": "2026-09-28T05:20:09.994Z",
      "dateModified": "2026-09-28T05:20:09.994Z",
      "inLanguage": "en-US",
      "isAccessibleForFree": true,
      "articleSection": "",
      "keywords": "Google Ads, ",
      "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": "https://www.groas.com/post/set-up-automated-negative-keyword-exclus"
      },
      "author": { "@id": "https://www.groas.com/author/#person" },
      "publisher": { "@id": "https://www.groas.com#organization" },
      "about": [
        { "@type": "Thing", "name": "Google Ads" },
        { "@type": "Thing", "name": "Pay-per-click advertising" },
        { "@type": "Thing", "name": "Performance marketing" }
      ],
      "mentions": [
        { "@type": "Organization", "name": "groas", "url": "https://www.groas.com" },
        { "@type": "Thing", "name": "Google Ads" }
      ],
      "speakable": {
        "@type": "SpeakableSpecification",
        "cssSelector": ["h1"]
      }
    },
    {
      "@type": "Person",
      "@id": "https://www.groas.com/author/#person",
      "name": "",
      "description": "",
      "jobTitle": "",
      "email": "",
      "url": "https://www.groas.com/author/",
      "image": {
        "@type": "ImageObject",
        "url": ""
      },
      "sameAs": [
        ""
      ],
      "knowsAbout": [
        "Google Ads",
        "Performance Max",
        "AI Max",
        "Pay-per-click advertising",
        "Conversion tracking",
        "Bid management",
        "Search advertising"
      ],
      "worksFor": { "@id": "https://www.groas.com#organization" }
    },
    {
      "@type": "Organization",
      "@id": "https://www.groas.com#organization",
      "name": "groas",
      "alternateName": "groas.com",
      "url": "https://www.groas.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://cdn.prod.website-files.com/6821efca072e48f6f495a47e/6834a970e03a7016560e3515_Logo%20Design%20256x256.png"
      },
      "description": "Dedicated strategists run your account and a proprietary engine trained on $500B in profitable ad spend optimises the execution underneath them",
      "sameAs": [
        "https://www.linkedin.com/company/groas"
      ],
      "knowsAbout": [
        "Google Ads",
        "Performance Max",
        "AI Max for Search",
        "Pay-per-click advertising",
        "Autonomous campaign management",
        "AI advertising agents"
      ],
      "areaServed": "Worldwide"
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Home",
          "item": "https://www.groas.com"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "Blog",
          "item": "https://www.groas.com/blog"
        },
        {
          "@type": "ListItem",
          "position": 3,
          "name": "",
          "item": "https://www.groas.com/category/"
        },
        {
          "@type": "ListItem",
          "position": 4,
          "name": "Build a Daily Negative Keyword Shortlist Without Paying an Agency to Check It",
          "item": "https://www.groas.com/post/set-up-automated-negative-keyword-exclus"
        }
      ]
    }
  ]
}
```
