Eliminating Internal Competition in Modern Ad Accounts
For home service operators spending $10,000 to $50,000 monthly, efficiency isn't just a metric—it is the difference between scaling and stagnating. Performance Max (PMax) has become a staple for generating lead volume across YouTube, Display, and Search. However, without strict guardrails, PMax often acts as a vacuum, sucking up high-intent brand traffic and phrase-match keywords that belong in your dedicated Search campaigns. When PMax cannibalizes your Search traffic, your reporting becomes murky and your cost per acquisition (CPA) artificially inflates because you are paying twice for the same intent.
At Berk Hospitality Group, we see this frequently with roofing and HVAC operators. A Scottsdale-based HVAC company might see their PMax campaign claim a conversion for 'AC repair near me' at a $45 CPL, while their dedicated Search campaign for that exact term sees a drop in impressions. This overlap creates a bidding war against yourself. To solve this, you need more than just manual negative lists; you need automated negative keyword scripts that force PMax to stay in its lane while protecting your high-converting Search assets.
Scope note: this is about traffic overlap between campaigns you already have. If your PMax campaign is structured as one asset group covering every service and every zip code, scripts will not save it — start with structuring PMax for local home service operators and come back here afterwards.
The Conflict Between Search and Performance Max
Google’s internal logic dictates that if a user’s search query is identical to an eligible keyword in your Search campaign, the Search campaign takes priority. However, if the query is not an exact match, PMax can and will outbid your Search campaigns based on its predicted conversion probability. This is dangerous for localized trades because PMax lacks the granular control of negative keyword matches that Search provides.
For example, an illustrative scenario: A pool service franchise might spend $15,000/mo on Search. If PMax starts bidding on 'pool cleaning jobs' or 'how to fix a pool pump DIY,' it wastes spend on non-revenue-generating intent. Standard account-level negative lists work, but they are static. As your Search campaigns evolve with new broad and phrase match discoveries, your PMax exclusions must stay synchronized. This is where automated scripts become essential for maintaining a healthy ROAS (Return on Ad Spend).
Deploying the Search-to-PMax Sync Script
The most effective way to stop cannibalization is a Google Ads script that automatically pulls all converting search terms from your Search campaigns and adds them as negatives to your PMax campaigns. This ensures that PMax focuses on net-new top-of-funnel discovery (YouTube and Discovery) rather than poaching your bottom-of-funnel Search traffic.
When implementing these scripts, we focus on three specific layers of exclusion:
- Brand Protection: Exclude your brand name and its common misspellings from PMax to ensure your Brand Search campaign retains all data and control over that traffic.
- High-Intent Phrases: If a phrase like 'emergency plumber Phoenix' converts at a 30% rate in Search, PMax shouldn't be allowed to touch it.
- Negative Keyword Mapping: Automatically syncing your master negative list (jobs, DIY, cheap, free) across all campaign types.
The exact sequence we run on a new account, in order: Campaigns > Insights and reports > Search terms, filtered to the last 30 days and sorted by conversions, to build the protected list; brand terms into a shared negative list applied to every non-brand campaign; the account-level brand exclusion request submitted for the PMax campaigns themselves, because account-level negative keyword lists do not apply to PMax until Google enables them for the account; then the script scheduled hourly, writing to a shared list rather than to individual campaigns so a rollback is one edit rather than twelve.
Protecting Local Service Area Integrity
For home services, geography is everything. We often see PMax campaigns drift outside of a service provider's actual reach because the algorithm prioritizes 'intent' over 'location' more aggressively than Search. If you are a roofer in Scottsdale, you don't want leads from Tucson. While location settings help, negative keyword scripts that target specific zip codes or city names not in your service area provide an extra layer of defense.
For example, if a PMax campaign were pulling a meaningful share of its leads from outside the primary service radius, a script that cross-references 'near me' queries against the real ZIP list would stop those queries being bought at all. The CPL (Cost Per Lead) on valid leads falls because the invalid ones stop being paid for. It isn't about spending less; it is about spending better.
Managing Negative Keywords at Scale
Manual management is the enemy of scale. If you are managing 50+ ad groups for a multi-location franchise, you cannot manually update negative lists every Tuesday. You need a script that runs every 24 hours to scan for low-performing queries. Specifically, look for queries that have spent 2x your target CPA without a conversion. These should be pushed into a shared negative list that applies to all PMax and Search campaigns simultaneously.
"Efficiency in Google Ads isn't found in what you bid on, but in what you refuse to bid on."
For trades like landscaping or remodeling, where the sales cycle can be 30–90 days, your scripts should also account for 'research' intent keywords. If a user is searching for 'remodeling ideas,' you may want them to see a YouTube ad (PMax), but you likely don't want to pay $25 per click on Search for that high-funnel query. Scripting allows you to segment intent by campaign type automatically.
Monitoring Script Performance and Yield
Once your scripts are live, you must monitor the 'Campaign Change History' and the 'Insights' tab in Google Ads. You are looking for a stabilization of Search impression share. If your Search impression share for 'core' keywords increases while your PMax spend shifts toward Video and Display placements, the script is working. This shift represents PMax finally doing its job: finding new audiences instead of stealing existing ones.
Consider an illustrative example: An operator spends $5,000/mo on Meta and $10,000/mo on Google. Before scripting, their PMax campaign was 70% Search-based. After deploying a sync script, PMax spend shifted to 40% Search and 60% Video/Display. While the lead volume remained steady, the close rate improved because the Search campaigns—which had better ad copy and landing page relevancy—were finally capturing 100% of the high-intent traffic.
One caveat that outranks the script itself. Across more than 7,000 home-services websites we loaded in a real browser and cross-checked against Google's Ads Transparency Center, more than 1 in 4 confirmed advertisers were spending with nothing recording a conversion. A cannibalization script is an optimisation on top of a measurement layer; if the conversion column is not trustworthy, the script will happily protect the wrong terms. Confirm the measurement first — the conversion tracking report covers how we verify it — then run the exclusions. If you are not certain which of these events fires on your own site, our free conversion tracking audit loads it in a real browser and reports what it finds.
Writing the Script: What It Actually Reads and Writes
A sync script is not complicated code, but the order of operations matters. It reads a search terms report from your Search campaigns, filters it, and writes the survivors into a shared negative keyword list that is applied to the PMax campaigns. Three details decide whether it helps or hurts.
- The report window.
LAST_30_DAYSis the usual default. On a low-volume account — a single-truck plumber, a specialty remodeler — 30 days may contain too few conversions to judge anything, andLAST_90_DAYSis the safer read. Never sync offTODAYorYESTERDAY; one stray query becomes a permanent exclusion. - The filter. Sync a term only when it has converted at least twice, or has spent past your target CPA with no conversion.
- The write target. Write to one shared negative list — name it something obvious like
PMAX-SYNC-AUTO— and attach that list to the PMax campaigns.
Match type is the decision people get wrong. Exact match negatives block only that query string, which is what you want for a converting term you are protecting in Search. Phrase match negatives block anything containing the string, which is what you want for junk modifiers (jobs, salary, DIY, free, how to). Syncing converting terms as phrase negatives is the common self-inflicted wound: exclude roof repair as a phrase and you have also excluded emergency roof repair, flat roof repair cost, and every long-tail variant that PMax was finding for you.
Brand Exclusions Are a Separate Mechanism
Account-level negative keyword lists historically did not apply to Performance Max, which is why brand traffic leaks even on accounts with a tidy shared list. Two mechanisms exist and they are not the same thing. Brand exclusions, set in the PMax campaign''s settings against a brand list, suppress brand-adjacent traffic including Search partners and Shopping surfaces. Campaign-level negative keywords, where available, block specific strings. Use the brand exclusion for your own brand and your competitors'' brands; use negative keywords for everything else. If you only do one, do the brand exclusion — brand queries are the traffic PMax is most likely to claim and the traffic you were most likely to win anyway.
Scheduling, Logging, and the Rollback Path
Schedule the script daily rather than hourly. Hourly runs multiply the chance that a term added on thin evidence sticks before anyone reviews it, and Google Ads scripts have a 30-minute execution limit that a large account can approach. Have the script write every addition to a Google Sheet with the date, the term, the keyword match type, the spend and conversions that triggered it, and the campaign it came from. That log is the rollback path: when Search volume drops unexpectedly, you open the sheet, find what was excluded that week, and remove it from the shared list.
What to Watch After It Is Running
Four readings tell you whether the script is doing its job, and none of them is total conversions.
- Search impression share on core terms. It should rise, because Search is no longer being outbid internally.
- PMax placement mix. Open the campaign''s insights and look at where spend sits. Movement away from Search toward Video and Display is the intended effect.
- Branded versus non-branded split in Search. If brand volume appears in Search after being invisible for months, the brand exclusion took effect.
- Blended cost per booked job, not per lead. The point of separating the campaigns is that you can now attribute booked work to the right one. If your CRM does not send that back into Google Ads, the separation buys you cleaner reporting and nothing else.
Frequently Asked Questions
Do account-level negative keyword lists apply to Performance Max?
Not reliably, and that is the root of most cannibalization. Apply exclusions to PMax through the campaign''s own brand exclusions and campaign-level negative keywords where your account has them, rather than assuming the account-level shared list is covering it. Confirm it by checking the PMax search terms view for the terms you believe are excluded.
How often should the sync script run?
Daily is enough for nearly every home-services account. Hourly runs add exclusions faster than anyone reviews them, and the negative list is permanent until someone removes it. Run the script''s preview mode first, read every proposed addition, and only then schedule it.
Will excluding converting search terms from PMax reduce total leads?
It can reduce leads attributed to PMax while the same demand is captured by Search instead, which is the intended outcome. The number to watch is total booked work across both campaigns, not the per-campaign lead counts, which is why the exclusions are worth little until conversions are being recorded correctly in the first place.
Should I exclude competitor brand names from Performance Max?
Usually yes, through the brand exclusion setting rather than as keywords. Competitor traffic bought inside PMax is invisible in reporting and mixed in with prospecting spend. If you want to bid on competitors, do it in a dedicated Search campaign where you can see the cost and the close rate separately.
What is the difference between a brand exclusion and a negative keyword in PMax?
A brand exclusion is applied against a brand list and suppresses traffic associated with that brand across the surfaces PMax serves on, including Shopping and Search partners. A negative keyword blocks a specific query string on search surfaces only. Brands belong in brand exclusions; junk modifiers and service terms you are protecting belong in negative keywords.
Takeaways
- Prioritize Brand: Use scripts to exclude brand terms from PMax to keep your data clean and your Brand Search ROAS high.
- Sync Converting Terms: Automatically move converting Search queries into PMax negative lists to force PMax into new placements.
- Automate Geo-Negatives: Use scripts to exclude city names outside your service area that PMax might accidentally target.
- Audit Weekly: Even with scripts, review the 'PMax Search Terms' report via the Insights tab to catch new bleed-over.
- Control the Spend: Redirect the savings from reduced cannibalization into higher bids for your top-performing Search keywords.