Wasted spend by search term, and cost per conversion by match type
A made-up search terms download for an outdoor shop: 15 search terms spread over several campaigns and ad groups, with the title lines and Total rows a download includes. Computed from search-terms-report.csv (30 rows of made-up data). The Tableau calculation and the SQL below both produce these numbers.
Search terms, totalled across the account
| Search term | Campaigns | Clicks | Cost | Wasted spend | Conversions |
|---|---|---|---|---|---|
| how to clean hiking boots | 1 | 108 | 133.25 | 133.25 | 0 |
| hiking boots pdf size chart | 1 | 71 | 101.43 | 101.43 | 0 |
| boots for snow | 2 | 55 | 88.48 | 88.48 | 0 |
| hiking boot repair near me | 1 | 55 | 75.01 | 75.01 | 0 |
| free hiking boots | 1 | 43 | 62.57 | 62.57 | 0 |
| hiking jobs | 2 | 60 | 46.97 | 27.56 | 0 |
| hiking boots women | 2 | 100 | 150.14 | 0.00 | 2.08 |
| hiking boots | 2 | 87 | 116.58 | 0.00 | 3.28 |
| best hiking boots 2026 | 2 | 60 | 102.02 | 0.00 | 0.53 |
| waterproof hiking boots | 2 | 75 | 101.05 | 0.00 | 1.56 |
| hiking boots wide fit | 1 | 68 | 76.49 | 0.00 | 0.68 |
| hiking socks | 1 | 38 | 69.61 | 0.00 | 0.17 |
| cheap hiking boots | 1 | 32 | 39.52 | 0.00 | 0.23 |
| trail running shoes | 2 | 47 | 35.41 | 0.00 | 0.77 |
| hiking boots sale | 1 | 31 | 32.35 | 0.00 | 0.3 |
By match type
| Match type | Cost | Conversions | Cost per conversion | Conv. value / cost | Share on non-converting terms |
|---|---|---|---|---|---|
| Broad match | 748.68 | 6.19 | 120.95 | 0.87 | 27.7% |
| Exact match (close variant) | 246.77 | 3.16 | 78.09 | 1.16 | 40.6% |
| Phrase match | 235.43 | 0.25 | 941.72 | 0.08 | 85.0% |
Recompute it from your CSV
Download the search terms report as CSV and drop it here. Lines above the header row and rows that start with Total: are skipped, so totals aren't counted twice. Match the columns if your report uses other names. The file is read in this browser; nothing is uploaded.
No file loaded yet. You can also drop a CSV on this box.
Why one ad group at a time hides waste
The report splits each search term by campaign, ad group and match type. A broad-match query that cost a few dollars in each of five ad groups, with no conversions, never stands out in any one of them. Totalled across the account, it is one of your most expensive non-converting queries. The FIXED expression does that totalling before the zero-conversion check, so a term that converted anywhere is never flagged.
Getting the CSV out of Google Ads
- In Google Ads, open the Search terms report for the campaigns you want to check (it sits under Insights and reports).
- Pick a date range, and leave out the last week or so: recent clicks may still convert.
- Make sure the columns include the search term, match type, campaign, ad group, clicks, cost and conversions.
- Download it as .csv and drop it in the box above.
The sample uses column names as they typically appear in that download (Search term, Match type, Added/Excluded, Campaign, Ad group, Clicks, Impr., Cost, Conversions, Conv. value). Your account's language and column choices can change them; the box lets you match each one.
The Tableau calculation
Search terms, totalled across the account
On Rows: [Search term]. Each calculation below is one column.
// Term conversions, whole account
{ FIXED [Search term] : SUM([Conversions]) }
// Campaigns the term matched in
COUNTD([Campaign])
// Clicks
SUM([Clicks])
// Cost
SUM([Cost])
// Wasted spend: cost of terms with no conversions anywhere, not yet excluded
SUM(IF [Term conversions, whole account] = 0 AND [Added/Excluded] <> 'Excluded' THEN [Cost] ELSE 0 END)
// Conversions
SUM([Conversions])By match type
On Rows: [Match type]. Each calculation below is one column.
// Term conversions, whole account
{ FIXED [Search term] : SUM([Conversions]) }
// Cost
SUM([Cost])
// Conversions
SUM([Conversions])
// Cost per conversion
SUM([Cost]) / SUM([Conversions])
// Conversion value per unit of cost (ROAS)
SUM([Conv. value]) / SUM([Cost])
// Share of cost on terms with no conversions anywhere
ZN(SUM(IF [Term conversions, whole account] = 0 THEN [Cost] END)) / SUM([Cost])Reading the match type table
Close variants appear as their own match type labels, such as Exact match (close variant), so you can see whether they convert as well as true exact matches. In Tableau, dividing by a SUM of zero returns NULL, so a match type with no conversions shows a blank cost per conversion; the SQL gets the same with NULLIF.
The equivalent SQL
Search terms, totalled across the account
WITH terms AS (
SELECT * FROM read_csv('search-terms-report.csv', skip = 2, header = true)
WHERE "Search term" NOT LIKE 'Total:%'
),
flagged AS (
SELECT *, SUM("Conversions") OVER (PARTITION BY "Search term") AS term_conversions
FROM terms
)
SELECT "Search term",
COUNT(DISTINCT "Campaign") AS campaigns,
SUM("Clicks") AS clicks,
SUM("Cost") AS cost,
SUM(CASE WHEN term_conversions = 0 AND "Added/Excluded" <> 'Excluded' THEN "Cost" ELSE 0 END) AS wasted_spend,
SUM("Conversions") AS conversions
FROM flagged
GROUP BY "Search term"
ORDER BY wasted_spend DESC, cost DESC;By match type
WITH terms AS (
SELECT * FROM read_csv('search-terms-report.csv', skip = 2, header = true)
WHERE "Search term" NOT LIKE 'Total:%'
),
flagged AS (
SELECT *, SUM("Conversions") OVER (PARTITION BY "Search term") AS term_conversions
FROM terms
)
SELECT "Match type",
SUM("Cost") AS cost,
SUM("Conversions") AS conversions,
SUM("Cost") / NULLIF(SUM("Conversions"), 0) AS cost_per_conversion,
SUM("Conv. value") / SUM("Cost") AS roas,
COALESCE(SUM("Cost") FILTER (WHERE term_conversions = 0), 0) / SUM("Cost") AS share_on_non_converting
FROM flagged
GROUP BY "Match type"
ORDER BY "Match type";Before you add negatives
- Not every query is listed. Google Ads omits search terms that don't have enough query activity to meet its privacy standards. Compare the cost in this file with your campaign totals to see how much spend the rows don't cover.
- Conversion lag. Buyers who take a week or two to convert make recent terms look like waste. Use a date range that ends at least a week ago.
- Single words across many queries. Words like free, jobs or pdf cost money across hundreds of long-tail queries. Flag them with
CONTAINS(LOWER([Search term]), 'jobs'), or split terms into words in SQL withUNNEST(string_split(lower("Search term"), ' '))and total the wasted spend per word.
Questions people ask
Why does adding up the Cost column give me two or three times my spend?
The download ends with Total rows that repeat the sums. The box above skips rows that start with Total:, and the SQL filters them out with WHERE "Search term" NOT LIKE 'Total:%'.
Does a term with conversions in one campaign count as waste elsewhere?
No. The flag looks at the term's conversions across the whole account. To judge each campaign separately, use { FIXED [Search term], [Campaign] : SUM([Conversions]) } instead.
Is my Google Ads data uploaded?
No. The CSV is read and calculated in this browser tab; nothing is sent anywhere.
Related: FIXED expressions, ZN, CONTAINS. Test a formula in the playground.