Every performance marketer eventually has the same morning. You open four accounts, check whether anything is overspending, check whether conversions stopped reporting overnight, check whether a landing page started returning a 404, and then start your actual work forty minutes later than you planned.
Google Ads scripts exist to delete that forty minutes. They are free, they are built into the platform, and a good one runs every morning at 6am without anyone thinking about it. They are also the automation that most often sits broken in an account for months while everyone assumes it is still working. This guide covers both halves: which scripts earn their keep, which ones quietly become maintenance debt, and the platform limits that are worth knowing before you paste anything into an account.
What Google Ads scripts actually are
Google Ads scripts are small JavaScript programs that live inside a Google Ads account and run on Google's servers on a schedule you set. They can read almost anything in the account, change almost anything in the account, pull data from external sources, and write results to Google Sheets or an email.
You find them under Tools, then Bulk actions, then Scripts. There is no installation, no server, no cost. You paste code, authorize it once, preview it, and schedule it hourly, daily, weekly or monthly.
The thing to understand before you go further is where scripts sit between the two neighbours people confuse them with. Automated rules are the safe option built into the interface. The Google Ads API is the heavy option that needs a developer and a server. Scripts are the middle: more capable than rules, cheaper than the API, and the only one of the three that you can break by yourself on a Tuesday afternoon.
| Dimension | Automated rules | Scripts | Google Ads API |
|---|---|---|---|
| Skill needed | None | Basic JavaScript | Developer |
| External data | No | Yes, via URL fetch and Sheets | Yes |
| Cross-account | No | Up to 50 accounts in parallel | Unlimited |
| Fails silently | Rarely | Often | Monitored by your team |
| Cost | Free | Free plus your time | Development and hosting |
Five Google Ads scripts worth running
A useful script has one property: it tells a human something they would otherwise have to go look for. Scripts that report are worth running. Scripts that act without telling anyone are where the trouble starts. These five all fall in the first category.
1. The spend pacing monitor
Compares month-to-date spend against the target monthly budget, projects the end-of-month number based on the current run rate, and emails you when a campaign is set to land more than a set percentage over or under. This is the single highest-value script for most accounts, because overspend is discovered at the end of the month by default and by then there is nothing to do about it. Run it daily. For the full logic behind the calculation, see our guide to ad budget pacing.
2. The broken final URL checker
Requests every final URL and mobile final URL in the account and reports anything returning a 404, a 500, or an unexpected redirect. Landing pages get renamed by people who do not know they are in an ad. This script catches it the next morning instead of the next quarterly review. Run it daily on accounts where the website changes often, weekly otherwise.
3. The zero-activity and anomaly alert
Flags campaigns that had impressions yesterday and none today, conversion counts that dropped to zero while spend continued, and accounts where cost moved more than a set percentage against the trailing average. Broken conversion tracking is the most expensive silent failure in paid search, because smart bidding keeps optimising toward a signal that has stopped arriving. Run it daily, early.
4. The n-gram search term report
Breaks every search term into one, two and three word fragments, then aggregates cost and conversions per fragment. Individual search terms are usually too sparse to judge. Fragments are not. This is how you find that the word "free" has cost you four figures across three hundred different queries. Run it monthly and pair it with the search terms report workflow.
5. The account hygiene sweep
Lists disapproved ads, ad groups with fewer than the minimum number of active ads, campaigns with no negative keyword list attached, and conversion actions that have not recorded anything in 30 days. None of this is urgent on any given day. All of it is embarrassing when a client finds it first. Run it weekly. It covers the mechanical half of a Google Ads account audit.
Start from Google's own library
You do not need to write these from scratch. Google publishes working versions of most common patterns in its solutions library, and they are maintained by the team that maintains the platform. Starting there and changing the variables at the top is faster and safer than starting from a blog post you found in 2021.
The scripts that cost more than they save
In our experience managing accounts across a range of budgets, the scripts that get switched off after six months all share a pattern. They take action instead of reporting it, and nobody notices when they stop.
- infoBid adjustment scripts running under smart bidding. If the campaign uses Target CPA or Target ROAS, a script that nudges bids is either being ignored or fighting the algorithm. Both outcomes waste your time. Manual CPC campaigns are the only place these still make sense.
- infoAnything that pauses without an alert. A script that pauses keywords above a CPA threshold will eventually pause something that was seasonal, or mid-learning, or the only converter in the ad group. If a script must take action, make the email report the action rather than the anomaly.
- infoLabel-driven automation chains. Script A applies a label, script B reads it, script C cleans it up. One person removes a label by hand and the chain silently produces wrong results for a month. Chains of scripts are the most fragile automation you can build in an account.
- infoThe enormous Sheets export nobody opens. Writing forty tabs of data to a spreadsheet every night feels productive. Check whether the sheet has been opened in the last 30 days before you build the next version of it.
The test is simple. If a script broke tonight, would anyone find out within a week? If the answer is no, the script is not saving you work. It is deferring it. The same question applies to any PPC automation strategy, whether it runs on scripts, rules, or a platform.
The limits nobody mentions until you hit them
Google publishes these, but most script tutorials skip them. They matter because a script that exceeds a limit does not warn you politely. It gets cancelled mid-run, keeps whatever changes it already made, and looks in the log like it finished.
- arrow_forward30 minutes of execution time. A script in a single advertiser account is cancelled after 30 minutes. Manager account scripts get the same 30 minutes, extended to 60 if they use executeInParallel with a callback method.
- arrow_forward50,000 results per iterator. A single iterator returns at most 50,000 rows by default. Large accounts silently process a subset unless you page through with filters. Reports are not subject to entity limits, which is why report-based scripts scale better than iterator-based ones.
- arrow_forward10,000 IDs per selector. Passing 10,000 or more IDs into withIds throws a runtime error rather than truncating.
- arrow_forward50 accounts in parallel. An Ads Manager script using executeInParallel processes up to 50 accounts, and each one can return at most 10MB of data back to the callback.
- arrow_forward250 authorized scripts per account. Past that, an older script gets deauthorized. It is temporary and reauthorizes when opened, but it means a scheduled run can fail for a reason that has nothing to do with your code.
- arrow_forwardVideo and Shopping campaigns are excluded. The standard campaign selector filters them out. You need the dedicated video and shopping selectors, which is why a budget script can report a number that does not match the interface.
- arrow_forwardLogging truncates at 100Kb. Verbose logging in a large account loses the end of the log, which is usually the part with the error in it.
Google is explicit that these limits can change at any time without warning, which is the real argument for error handling in every script you schedule. The current list is documented in the Google Ads scripts limits reference.
Setting up your first script
Assume the first version will be wrong. The steps below are ordered to make that cheap.
Open the scripts editor
In Google Ads, go to Tools, then Bulk actions, then Scripts, and create a new script. Give it a name that says what it does and how often it runs, not "test 2".
Put every setting at the top
Email address, spend thresholds, campaign name filters, spreadsheet URL. Anything you might change in six months belongs in clearly named constants in the first twenty lines, so the next person does not have to read the logic.
Run it in preview mode
Preview executes the script and shows what it would change without applying anything. Use it every time, including for reporting scripts, because it is also the fastest way to see how long the script takes against the 30 minute ceiling.
Make it email you even when nothing is wrong
A script that only emails on problems is indistinguishable from a script that has stopped running. Send a one-line "checked 240 URLs, all fine" message. That single habit prevents most silent failures.
Schedule it and diary a review
Daily scripts should run before you start work, not at midnight, so the data is fresh when you read it. Then put a recurring note in your calendar to check the script log every quarter. Unreviewed scripts are the ones that rot.
When to stop writing scripts
Scripts are excellent up to a point. That point arrives sooner than most people expect, and it has three warning signs.
One person owns them
Scripts are authorized under an individual Google login. When that person leaves, changes role, or loses access to an account, the automation leaves with them.
The same code lives in ten places
Once a script is pasted into each account separately, fixing a bug means fixing it ten times. Manager scripts help, up to the 50 account ceiling, but they concentrate the risk rather than removing it.
The question spans platforms
Google Ads scripts only see Google Ads. The moment the real question is "are we on budget across Google, Meta and LinkedIn this month", scripts stop being the right tool.
Maintenance exceeds the saving
Count the hours spent fixing scripts last quarter against the hours they saved. If that ratio is heading the wrong way, the script portfolio has become the admin work it was meant to remove.
This is the gap aubado was built for. Budget Control tracks spend and pacing across every connected account in one view, and the Google Ads app flags performance against your targets, without anyone maintaining JavaScript. It is the same job most of these scripts do, with the difference that the monitoring is somebody else's problem to keep working. If that sounds useful, you can join the waitlist.
None of which means you should delete your scripts. Keep the ones that report something you would otherwise go looking for, delete the ones that act quietly, and be honest about which category each one is actually in.
Frequently Asked Questions
Monitoring, without the maintenance
aubado watches budgets, Google Ads performance and search visibility across your accounts, and tells you when something needs attention. No JavaScript. No scripts to fix.
Share this article