Internal competition
Two dealerships were competing for the same customer instead of covering more of the market.
At Rooks Advertising, I led regional performance marketing for Cadillac dealerships across the Southeastern United States. One dealer group operated two adjacent stores serving overlapping markets, but their Google Ads account treated them as competitors instead of complementary businesses. Both stores bid on the same search terms, driving up costs while competing for the same customers. At the same time, broad keyword targeting surfaced ads for vehicles that weren't even in inventory, generating clicks with no chance of converting.
Two dealerships were competing for the same customer instead of covering more of the market.
Campaigns entered the same auctions, increasing CPCs and reducing budget efficiency.
Ads appeared for unavailable inventory, paying for traffic that could never convert.
For dealership accounts, the addressable audience is geographic. The original account used radius targeting, which caused the two neighboring Cadillac stores to compete wherever their trade areas overlapped. Every search within that intersection entered both campaigns into the same auction.
I restructured the account around zip codes instead. Each zip code belonged to a single campaign, creating clear ownership of every search and eliminating internal competition by design.
Illustrative schematic of the campaign architecture, not performance data. Grid cells stand in for zip codes; store positions and coverage are notional.
Rather than radius targeting, I parsed the entire trade area into individual zip codes and built a separate campaign for each, ensuring no zip code ever appeared in more than one campaign. That removed the self-competing bids at the root instead of managing them.
I applied the same zip-level division to the nearest competitor’s DMA, splitting territory so the two stores maximized coverage against an outside rival without reintroducing overlap between themselves.
We built a live data feed from the pre-owned database and converted it into broad-match-modified keywords bound to actual stock, so an ad could only serve against a car on the lot. Generic terms were eliminated, and keywords were reviewed on a regular cycle as inventory turned.
The second fix bound the keyword set to the pre-owned database. A live feed generated broad-match-modified keywords from actual stock, so an ad could only serve against a car physically on the lot. When a vehicle sold, its keyword retired with it. Generic terms, which could never match a specific car, were eliminated entirely.
+2015 +ford +f150 Generated from the feed +2013 +chevrolet +malibu Retired on the next sync used ford Never generated Illustrative schematic of the feed logic, not performance data. Vehicles shown are examples of the three cases the feed had to handle.
Specific campaign performance data is confidential per client agreement. What I can share is the measurement framework with examples.
The new account architecture eliminated internal competition, aligned campaigns with real inventory, and created a structure that stayed organized as inventory changed. Instead of constantly fixing symptoms, the account could now optimize from a stable foundation.
This project reflects how I approach marketing: identify the structural constraint, simplify the system, and build for long-term performance.
Rooks Agency has been the most hands-on agency we have ever dealt with. Always open to input and they have a “make it happen” attitude. We love working with them.