How I Automated 90% of My Google Ads (and Hit 300%+ ROAS) 📈

AKA: How I stopped checking my Google Ads dashboard and still scaled paid growth.

I used to babysit Google Ads like a fragile toddler.
Every morning: pause bad keywords. Test headlines. Add negatives. Adjust bids.
Hours wasted. Minimal lift.

So I built a system instead.

We now run a 300%+ ROAS, scaled to millions in ARR, and I don’t even open the dashboard most days.

No agency. No Smart Campaigns. No overpriced tools. Just scripts.

This guide breaks down the exact 9-script stack I use to automate almost everything — from search term classification to budget scaling to ad copy rotation.

If you’re spending >$1K/day, this will pay for itself in 15 minutes.
If you’re not, you’ll still save hours/week and build a cleaner, smarter account.

If You’re Still Manually Optimizing, You’ve Already Lost

Manual optimization is dead.

  • Bid adjustments? Automated.
  • Search term mapping? Scripted.
  • Budget scaling? Rules-based.
  • Ad copy testing? Data-driven.

Here’s the full automation system I run, across branded, category, and competitor search campaigns — and how you can replicate it in a weekend:

1. Set Up a Clean, Modular Campaign Structure

Automation only works on clean data. Structure first, then scripts.

Use 3 campaign types:

  • Search - Global - Brand
  • Search - US - Category
  • Search - Global - Competitor

Each campaign includes:

  • Exact match ad groups
  • Phrase match ad groups
  • Shared negative lists (Brand - Exact, Competitor - Exact, etc.)

Rule:
If a keyword exists in Exact, add it as an exact negative in the Phrase ad group + the Shared Negative List.

📦 This prevents overlap, ensures tight targeting, and keeps reporting clean.

2. Auto-Sync Exact Keywords to Phrase + Negative Lists

No more manual syncing.

Script 1: Exact → Phrase Syncer

Every 24h:
✅ Pull all keywords from Exact ad groups
✅ Add them to corresponding Phrase groups
✅ Add them as exact match negatives in Phrase to prevent duplication
✅ Label them `Synced from Exact`

3. Auto-Promote High-Converting Search Terms from Phrase → Exact

Phrase is for discovery. Exact is for scale.

Script 2: Phrase → Exact Promoter

Every 48h:
🔍 Check all search terms in Phrase groups
📈 If:
- ≥ 2 conversions
- Cost/Conv < $0.50
- CVR > 2.5%
📤 Then:
- Add to Exact group
- Add as exact negative in Phrase group

Turns your account into a machine-learning system with rules instead of vibes.


4. Classify and Route Search Terms by Intent

Most accounts waste budget showing competitor or brand queries in the wrong ad groups.

Script 3: Search Term Classifier

Weekly:
📥 Pull all queries
🏷️ Classify each as:
- Brand (e.g. “udio”, “udio ai”, “udio app”)
- Competitor (e.g. “boomy”, “soundraw”)
- Category (e.g. “ai music generator”)
🔁 If mismatched:
- Pause keyword
- Add to correct ad group

Bonus: flags junk traffic and improves ROAS fast.


5. Eliminate Duplicate Keywords Across Campaigns

Duplicates kill performance and pollute your data.

Script 4: Duplicate Eliminator

Daily:
🧼 If keyword exists in multiple ad groups:
- Keep only in the correct campaign
- Remove from others
📌 Rule:
- Brand → stays in Brand
- Competitor → stays in Competitor
- Category → stays in Category

6. Auto-Test and Rotate Ad Copy

Google’s “optimize” rotation is trash. You need control.

Script 5: ROAS-Based Ad Copy Split Tester

Weekly:
🎯 If:
- Impressions > 5,000
- ROAS < 100% (7-day)
- CTR < ad group avg
🛑 Then:
- Pause ad
- Create new variation (GPT/Claude optional)

This script is your robot copywriter. Always testing. Always learning.


7. Detect Creative Fatigue Before It Tanks ROAS

Especially critical for Performance Max and Display.

Script 6: Creative Fatigue Detector

Weekly:
📉 If:
- CTR drops > 20% WoW
- Impressions stable but ROAS down
📬 Then:
- Flag ad as fatigued
- Trigger Slack alert or Claude rewrite prompt

8. Automate Hour-of-Day Bid Adjustments

Why spend equally at 3am and 2pm?

Script 7: Hour-of-Day Bid Adjuster

Every 2 weeks:
🕒 Analyze last 14 days performance by hour
⚖️ If:
- ROAS 2x from 10am–2pm → +20% bid
- ROAS tanked 2am–5am → -30% bid

Granular control. Zero effort.


9. Scale Budgets Based on Real-Time ROAS

Never miss a growth opportunity again.

Script 8: ROAS-Based Budget Scaler

Daily:
📈 If:
- ROAS > 300%
- Spent < 80% of budget
💰 → Increase budget by 20%

📉 If:
- ROAS < 150% for 3+ days
🛑 → Cut budget by 25%

10. Auto-Pause Bleeding Campaigns

Last line of defense.

Script 9: Safety Kill Switch

Daily:
🔻 If:
- ROAS < 100%
- Spend > $100
- No conversions in 7 days
⛔ Then:
- Pause campaign
- Alert via Slack/email

Protects your budget while you sleep.

🧠 TL;DR: The 90% Automation Stack

LayerScriptFrequency
Keyword SyncExact → PhraseDaily
PromotionPhrase → ExactEvery 48h
ClassificationIntent RouterWeekly
CleanupDuplicate EliminatorDaily
Ad CopyROAS-Based Split TesterWeekly
FatigueCreative Drop DetectionWeekly
BiddingHour-of-Day AdjusterBiweekly
BudgetROAS-Based ScalerDaily
SafetyKill SwitchDaily

🔧 Tools I Use

  • Google Ads Scripts (native)
  • Google Ads API (if scaling large)
  • Claude 3.5 / GPT-4 (copy rewrites + creative gen)
  • Google Sheets (logging + monitoring)
  • Slack + Zapier (for alerts + trigger workflows)

If You’re Spending >$1K/Day…

You can’t afford not to automate.

This stack helped us outperform every agency we trialed.
ROAS went up. Hours went down. Control went up. Stress went down.

No pixel dust. No vibes. Just data + logic + code.

🔥 Sample Scripts You Can Steal

Phrase → Exact Promotion

(searchTerm.conversions >= 2 && searchTerm.costPerConversion < 0.50) {
addKeywordToExactGroup(searchTerm.text);
addExactNegativeToPhraseGroup(searchTerm.text);
}

Duplicate Eliminator

(keyword.text in multipleAdGroups && keyword.intent === 'brand') {
keepInGroup('Brand'); removeFromGroups(['Category', 'Competitor']);
}

ROAS-Based Budget Scaling

(campaign.roasLast7Days > 3 && campaign.spentYesterday < campaign.budget * 0.8) {
increaseBudget(campaign.id, 0.2);
}

Ad Copy Split Test

(ad.impressions > 5000 && ad.roas < 1.0 && ad.ctr < adGroup.avgCtr) {
pauseAd(ad.id); createVariant(ad.headline, ad.description);
}

Want All 9 Full Scripts?

I’ll send you the whole script bundle.
Just email me: aditya@ezmoney.ltd

Discover more from Aditya Sheth

Subscribe now to keep reading and get access to the full archive.

Continue reading