← Back to Blog

High Bids Kill Your ROAS: Find the Bid Sweet Spot

Eight years ago when I started running Google Ads for my own DTC stores, there was a standard quick-test playbook: set the initial bid at 2x your historical CPC, let Google Ads flood traffic in, and within a few days you'd have enough conversion data to know whether the category was worth scaling. Then you'd gradually tighten from there.

That playbook worked back then. It doesn't anymore.

Last month I ran that exact script on a new product category — and burned through a four-figure budget before I understood why. Google Ads' bidding system has become a black box, and the more you feed it, the more eagerly it dumps garbage traffic on you. From the system's perspective, you've signaled that you're happy to pay a premium for those clicks.

This post is the full story of how I burned the money, and the two bidding rules I pulled out of the wreckage. Both rules now run inside ADM (an AI agent that optimizes Google Ads automatically — basically my eight years of hard-won habits, productized). I'll call out which ADM rule maps to which principle as we go.

A four-figure tuition bill

Quick context: one-person operation. I run a handful of DTC stores on the cross-border e-commerce side, and every ad I manage is for my own products. Eight years in and I've never hired an agency — I'm introverted enough that I'd rather stare at spreadsheets than coordinate with account managers, and I've always believed the person closest to the data should be the one making the calls.

Last month I wanted to test a new product category, so I opened a Standard Shopping Campaign and, out of old habit, set the initial bid to 2x the stable CPC from similar products. The reasoning was simple: I wanted data fast.

The money left fast. The conversions didn't follow.

The next morning I pulled the top 20 high-click search terms from the previous 24 hours and filtered them for product relevance. Here's what I saw:

  • Out of the top 20 search terms, 15 had essentially zero product relevance — immediate negative keyword candidates
  • Real "quality traffic" (terms actually matching the product) was only about 25%
  • The other 75% of the budget? Funding Google's black box.

I stared at that 25% number for a while. If you've ever run Google Ads, you know the feeling — the money is already gone, and half your report reads like "what does this query even have to do with my product?"

Two moves, two weeks, 25% → 70%

My response was simple:

  1. Added the 15 high-spend / zero-conversion terms to negative keywords
  2. Cut the bid in half

Pay attention to step two. By the old playbook, cutting a bid in half should collapse your traffic. But I was past caring about volume — I needed to stop the bleeding first.

Two weeks later I ran the same check:

  • Quality traffic share went from 25% up to ~70%
  • Over the full month, the new category roughly broke even

Yes, the negative keywords helped. But Standard Shopping search terms are impossible to fully exhaust — the real driver of the improvement wasn't the negatives. It was cutting the bid itself.

Looking back at that cleanup process, I realized the whole sequence was rule-shaped: scan every keyword and ad, surface the high-spend / zero-conversion items, auto-pause them. It became one of the earliest pieces I built into ADM — now the Zombie_Cleanup rule, and I no longer babysit it.

Low bids ≠ quality traffic

Before you take the wrong lesson from this: I'm not preaching "always bid low."

Low bids don't bring quality traffic. Finding the bid sweet spot does.

Bid too low and you don't get enough impressions to learn anything. Bid too high and Google Ads' bidding system starts dumping every ambiguous-intent, weakly-matched search query into your campaign — because the signal you're sending is "I'll pay for those clicks."

The sweet spot is the point where you're getting enough visibility to see real data, but not so much that the system is selling you traffic you'd never have chosen yourself.

The question is: how do you find it?

Two rules (also how ADM runs now)

Rule 1: Anchor your initial bid to account history

When I said "cut the bid in half," that number wasn't random. The reason it was "half" is that my original bid was 2x to begin with. The real anchor is the stable CPC from my own account — same price tier, same category, or whatever's been running profitably for a while.

Concretely:

  • Before launching a new product, query the stable CPC for same price tier or same category from your historical data
  • Use that as your baseline initial bid
  • If you want faster data, add a little on top — but don't go above 2x

My rule of thumb after eight years: initial bid at 1.2x–1.5x the historical baseline usually gets me enough data within a week to make a call, without torching the budget on noise. Push past 2x and "quick test" quietly becomes "quick burn."

Rule 2: Never adjust by more than 20% at a time

Two failure modes to avoid when you're adjusting bids:

  • Adjusting too often: the system barely learns anything before you overrule it — it never stabilizes
  • Adjusting too hard: anything like +100% or −50% kicks you right back into the learning phase

What I do now: keep every adjustment within 20%, then observe for at least 3–5 days. Look at whether conversions are persistently trending up — not a one-day spike, a 3–5 day direction.

If you raise the bid and conversions actually drop (after ruling out seasonality, landing page changes, and other externals), that means the previous bid was the current sweet spot. Stop fiddling.

This ±20% cap is the hardcoded constraint of ADM's CPC_Adjustment rule. The full logic: when a keyword's ROAS runs more than 20% above target, ADM auto-raises the bid by 20%; when ROAS drops below 80% of target, ADM auto-lowers by 20%. The trigger threshold and the adjustment size are the same 20% — no aggressive doubling-down, no nervous micro-tweaks. That number isn't something I made up; it's what eight years of being punished by Google's learning phase taught me.

The sweet spot drifts, too. Competitors launch new creatives, you change your landing page, seasonality shifts — and it moves. Back when I was doing this by hand, I'd check in every couple of weeks and nudge. Now ADM runs that review loop in the background and I just read the report.

Why the old playbook broke

The real cause isn't "bidding strategy changed." It's that the Google Ads auction itself changed.

Eight years ago Google Ads was relatively "honest": a higher bid meant the search queries matching your keyword were more likely to show your ad. That's no longer true. Smart Bidding, broad match expansion, audience signals, and a stack of internal algorithms I'll never see all sit between your bid and who actually gets shown your ad.

The levers advertisers can pull are shrinking every year.

Put it differently: eight years ago you could brute-force the system into listening. Today, the same high bid becomes a signal — "this guy doesn't mind spending money" — and the system hands you every vaguely-matched query it can find. It's not malicious. It's just optimizing its own eCPM.

Which is why I've moved further and further toward "observe + small adjustments," and away from "big bid + let it rip for a few days."

One thing ADM handles well, and one thing it doesn't yet

Since we're on the topic of Standard Shopping, let me be honest about where ADM stands on negative keywords today — what it handles well, and what's still missing.

What ADM does today: On every optimization round, the AI engine sweeps the search terms report across all your campaigns, picks out the "spent money, zero conversions, not previously processed" terms, and suggests adding them to negative keywords — and not as one undifferentiated list, but at the right level. For terms that have nothing to do with your business at all (job, career, salary), the suggestion goes account-level and nukes them across every campaign. For terms that only underperform in one campaign, it's added at campaign level. For ad-group-specific noise, it's added at ad-group level. Every suggestion comes with match type (EXACT / PHRASE) and target level, and one click pushes it through the Google Ads API.

Where it falls short: This is all reactive — the AI has to see search term data before it can suggest anything. Back to my opening story: on day one of that new category, I burned 75% of the budget on garbage terms, and at that point ADM's AI had no search term data from that campaign yet. It couldn't have told me in advance "don't waste money on free and DIY." I had to clean up the first wave manually — and only after the campaign had been running long enough to produce dirty search terms could the AI step in on the next optimization round. By then, the first tuition bill was already paid.

So the real gap is pre-emptive filtering. Most product categories share a set of near-universal garbage roots (free, how to make, DIY, tutorial, reddit, meme) that don't require any data to predict. If ADM could auto-preload a category-specific negative keyword list the moment you create a new campaign (I've been calling this Smart Negative List internally), you'd skip the 3–7 day tuition phase entirely — and the AI's reactive cleanup could shift from "front-line defense" to "mopping up the strays."

ADM doesn't do this yet. It's on the backlog, and it ships when enough users ask for it and the priority gets pushed high enough. I won't commit to a release date, but I can promise that every item on that backlog comes from real advertising scenarios — not from product managers inventing features in a conference room.

If you've been bitten by the "day-one garbage burn" pattern yourself, tell me. Every piece of user feedback pushes that priority up a notch.

When you're in a hurry, especially don't hurry

Back to the opening line: the more black-box the Google Ads auction gets, the less you can afford to rush.

When you want to test a new category fast, the worst move is pulling bid and budget up at the same time. The move that actually works is to slow down:

  • Pull the historical baseline first
  • Raise bids in small steps
  • Let the system gradually figure out who your real buyers are, instead of dumping money into the traffic pool all at once

A little background on ADM itself. I built it for a simple reason: eight years of running my own ad spend gave me a pile of specific rules, and I wanted something that would run those rules for me — and for anyone else running ads on their own stores without an agency babysitter.

Everything ADM does today is the direct output of some past "expensive lesson." CPC_Adjustment is the bidding discipline from this post. Zombie_Cleanup is the high-spend / zero-conversion cleanup. Negative_Conflict catches the landmines where you've accidentally negated your own targeting keyword. There are more than a dozen other rules, each with a similar origin story. And yes — the Smart Negative List idea from earlier is on the backlog. It'll ship when enough of you push the priority up.

If you're tired of staring at reports every week and manually tuning bids, and you don't want to hire an agency, come check out adm.cc. Free 14-day trial — during that time, you won't need to touch a single bid in the Google Ads UI. ADM handles all the moves described above, and for every change, it tells you exactly why.

Ready to optimize your Google Ads?

Start your 14-day free trial today.

Start Free Trial

Our site uses cookies. By continuing to use our site, you agree to the use of cookies. For more information about the use of cookies on our website, please see our Cookie Policy.