QuantumAdsLab Logo Quantum Ads Lab
How to find duplicate keywords in Google Ads: auditing a keyword export across ad groups
Learning how to find duplicate keywords in Google Ads what the copies actually cost, and how to surface them at scale

HOW TO FIND DUPLICATE KEYWORDS IN GOOGLE ADS

Summary

What you'll learn in this article

  • What duplicates actually cost you in the auction and the myth that inflates the fear
  • The two-pass method I run on accounts with thousands of terms
  • Why the exact-text pass finds the smaller half of the problem
  • How I decide which copy survives when both have history
  • What a duplicate-heavy account is really telling you about how it was built

Every Google Ads account I inherit above roughly two thousand terms has duplicates in it. Not sometimes every one. So the question isn't whether you have them, it's how to find duplicate keywords in Google Ads fast enough that the audit is worth the afternoon it takes.

The reason they accumulate is boring: someone builds a campaign from a planner export, someone else clones an ad group for a landing page test, a bulk upload runs twice. Nobody thinks to check for duplicate entries against what's already live, because nothing breaks when they don't.

Duplicate keywords Google Ads: what they really cost

Start with the good news, because it kills the myth that makes people fix the wrong thing. You are not bidding against yourself. Google's own documentation on ad group prioritisation is unambiguous: when several of your keywords are eligible for the same search term, only one enters the auction. Exact terms identical to the query win first, then identical phrase and broad terms, then AI-based relevance, with Ad Rank breaking ties.

So your cost per click doesn't inflate. The damage is quieter, and it lands in this order of severity.

The wrong copy wins. This is the one that costs real money. You wrote a tight ad and a matched landing page for one ad group, and the selection logic hands the query to a copy sitting in a generic group with weaker creative. You never see it happen you just see a conversion rate that doesn't match the ad you thought was serving.

Performance data splits. Two rows each carrying half the history. On a term doing forty conversions a month that's invisible. On one doing eight, you now have two rows doing four, and neither has enough signal to be trusted downstream.

Smart Bidding learns slower. Fragmented history is thin history. I've seen consolidation be the single change that got a stalled tROAS campaign moving.

Signals dilute. Your click through rate spreads across copies instead of concentrating on one row, and reporting stops being decidable the same term appears three times at three CPAs.

None of it shows as an error. That's why duplicates survive audits that catch everything louder.

Pass one: the exact-text sweep in Google Ads Editor

Editor has a built-in finder and it takes four minutes. Download the account, open the keywords view, run the duplicate tool. You pick the scope whole account, campaign or ad group and whether match type has to match too. Two settings decisions matter more than people expect.

Run it account-wide. Duplicates inside a single ad group are harmless housekeeping. The expensive ones sit across campaigns, because that's where bids, budgets and landing pages genuinely diverge and where the wrong copy winning changes the outcome.

Run it twice on match type. First with match type included, which gives true duplicates. Then with it ignored, which gives the overlap set: the same text as exact in one place and phrase in another. That second list isn't a bug list much of it is deliberate but it's where the accidents hide.

What the exact-text pass misses

Here's the limit, and it's why a lot of duplicate audits feel like they accomplished nothing. String matching finds identical text. It does not find two different terms chasing the same query, which on modern match types is most of the real problem. On broad-heavy accounts I'd estimate this pass surfaces a third of the actual overlap.

Still worth doing first cheap and unambiguous. But don't call the account clean here. If your keyword lists were built loosely, review the underlying keyword strategy before pruning rows.

Pass two: finding collisions in the search terms report

This is the pass that finds the money, and almost nobody runs it.

Export ninety days of search terms with the keyword and ad group columns included. Pivot on the search term and count distinct ad groups per term. Anything returning two or more is a collision that query reached your account through more than one route. A conditional formatting rule highlighting any count above one makes the sheet scannable in seconds.

Sort by cost descending and stop at the top thirty rows. Twenty minutes, and it finds more waste than the Editor pass, because it surfaces functional overlap rather than typographic overlap. A broad term eating queries that belong to a specific group won't appear in any duplicate finder it's a different string entirely.

Reading the collision list

Not every collision is a defect; brand and non-brand splits collide by design. I'm looking for one shape: high-cost queries where the winning ad group isn't the one built for that intent. That's usually fixed by adding the term as a negative keyword in the losing group rather than deleting anything, making it a list hygiene question.

One caveat on large accounts: the export isn't complete. Low-volume and privacy-thresholded queries never appear, so the list understates the problem treat it as the visible portion, not the total.

Deciding which copy survives

Keep the better structural home, not the better CPA

Keep the copy whose ad group has the creative and landing page matching the term's intent. Performance follows structure over the next quarter; structure doesn't follow performance.

When structure ties, keep the volume

The row with more clicks carries the Quality Score history and the conversion signal. Merging into the thinner row restarts learning you already paid for.

Pause first, remove later

I never delete on the first pass. I pause the losers, label them with the audit date, and check the survivors two weeks later worth knowing exactly how keyword statuses behave before touching hundreds of rows at once.

Negate rather than delete across campaigns

When copies live in campaigns with different budgets, deleting one just moves traffic somewhere you didn't choose. Negating in the losing campaign makes the routing explicit and reversible.

What a duplicate-heavy account is telling you

Duplicates aren't a hygiene problem. They're a symptom of an account with no ownership rule. In every heavily duplicated account I've audited, nobody had decided which ad group owns which intent. Campaigns got built additively, and new terms were never reconciled against what was already live.

The tell is the distribution. Scattered evenly, it's drift and a cleanup fixes it. Clustered inside two or three campaigns built around the same time, you're not looking at a duplicate problem you're looking at two campaigns that should be one, and cleaning rows just lets the mess regrow within a quarter.

Second inference: duplicate volume tracks how many people have touched the account, not how big it is. A ten-thousand-term account with one owner is usually cleaner than a two-thousand-term account that's passed through three agencies.

The practical takeaway

Two passes, in order. Editor account-wide for identical strings, run twice on the match-type setting. Then a search terms pivot counting ad groups per query, sorted by cost, top thirty rows. The first finds the smaller half; the second is where the waste lives.

Keep the copy with the better structural home. Pause before you delete, negate before you delete across campaigns. And when duplicates cluster rather than scatter, fix the campaign overlap that produced them.

FAQ: duplicate keywords in Google Ads

Do duplicates make me bid against myself?
No. Only one of your eligible keywords enters any given auction, so you aren't paying twice for the same click. The real cost is that the copy which wins may not be the one with your best ad and landing page.
Is the same term in different match types a duplicate?
Technically an overlap, not a duplicate and often intentional. Run the Editor check both with and without match type included: the first list gives true duplicates, the second shows which overlaps were deliberate.
Which copy do I remove when both have history?
Keep the one whose ad group matches the term's intent, even if its CPA currently looks worse. If both homes are equally good, keep the row with more clicks it carries the signal you've already paid to build.