Nobody really thinks about automating things until there's a ton of repetitive tasks piling up. It's the same story with contextual advertising. That's when Google Ads scripts come to the rescue.
Google Ads scripts are nifty little programs that let you control your Google Ads account's functions using JavaScript, all without you having to do it manually.
Important note! "Without you having to do it manually" means you can set them to run as often as every hour or as seldom as once a month, and you don't need to log into your account to perform specific tasks. The script will handle it all for you.
In your Google Ads account, scripts are pretty easy to find:
Tools ➔ Bulk Actions ➔ Scripts<
After that, you'll see an open JavaScript editor where you can start working your magic.

The possibilities with scripts are huge. From basic notifications to performing active tasks in your account, they can do a lot. We've been through it all ourselves since we write our own scripts for Google Ads to streamline our workflow.
You'll find loads of free scripts online, but most of them are pretty generic. We found that out of thousands of free scripts, only 2 or 3 were actually useful to us:
➊ Script to notify about low account balance
The mechanism is pretty straightforward: if your account balance dips below a certain amount, you get an email alert. The script looks like this:
function main() {
//Script settings
var days = 7; // Minimum number of days to send notification
var alertLimit = 30000; // Minimum balance to send notification
var email = [' This email address is being protected from spambots. You need JavaScript enabled to view it. ']; //Add email addresses to receive the alert
var alertType = true; // true - alert when low balance, false - alert based on number of days
var includeVAT = true;
var budgetOrder = AdWordsApp.budgetOrders().get().next();
var SpendingLimit = budgetOrder.getSpendingLimit(); // Total account limit
var adjustments = budgetOrder.getTotalAdjustments(); // Funds returned to account
var Spent = AdWordsApp.currentAccount().getStatsFor('ALL_TIME').getCost(); // All-time spend
var lastWeekSpent = AdWordsApp.currentAccount().getStatsFor('LAST_7_DAYS').getCost(); // Spend in last 7 days
var thisMonthSpent = AdWordsApp.currentAccount().getStatsFor('THIS_MONTH').getCost();
var vat = thisMonthSpent * 0.2;
var limit = budgetOrder.getSpendingLimit();
var spent = AdWordsApp.currentAccount().getStatsFor('ALL_TIME').getCost();
var amountOfBudget = limit - spent+388;
Logger.log("Account balance - " + amountOfBudget);
if (alertType) {
if (amountOfBudget < alertLimit) {
sendSimpleTextEmail(email);
}
}
function sendSimpleTextEmail(mail) {
MailApp.sendEmail( mail,
'Low Budget Alert! ' + AdWordsApp.currentAccount().getName(),
'Funds are running low in the Holostenko & Partners account. Please add funds!');
}
}
This script is super helpful if you frequently top up your balance or if you don't check into Google Ads very often.
➋ Script to pause ads with no impressions
var TO_NOTIFY = "This email address is being protected from spambots. You need JavaScript enabled to view it. ";
function main() {
var kwIter = AdWordsApp.keywords()
.withCondition("Impressions = 0") // could be "Clicks = 0" also
.forDateRange("ALL_TIME")
.withCondition("Status = ENABLED")
.withCondition("CampaignStatus = ENABLED")
.withCondition("AdGroupStatus = ENABLED")
.get();
var toPause = [];
while (kwIter.hasNext()) {
var kw = kwIter.next();
toPause.push(kw);
if(AdWordsApp.getExecutionInfo().isPreview() &&
AdWordsApp.getExecutionInfo().getRemainingTime() < 10) {
break;
}
}
for(var i in toPause) {
toPause[i].pause();
//Or you can use toPause[i].remove(); to delete the ad
}
// Send notification email
MailApp.sendEmail(TO_NOTIFY,
"AdWords Script Paused "+toPause.length+" Keywords.",
"Your AdWords Script paused "+toPause.length+" keywords.");
}
This script lets you clean up ads — thousands of them that haven't received any impressions, and doing it manually would be a real pain.
➌ Script to pause and resume campaigns on holidays
Pausing campaigns:
function main() {
var searchdisplaycampIter = AdsApp.campaigns().withCondition("LabelNames CONTAINS_ALL ['holidays']").get()
while(searchdisplaycampIter.hasNext()){
var searchdisplaycamp = searchdisplaycampIter.next()
searchdisplaycamp.pause()
}
var videocampIter = AdsApp.videoCampaigns().withCondition("LabelNames CONTAINS_ALL ['holidays']").get()
while(videocampIter.hasNext()){
var videocamp = videocampIter.next()
videocamp.pause()
}
var shopcampIter = AdsApp.shoppingCampaigns().withCondition("LabelNames CONTAINS_ALL ['holidays']").get()
while(shopcampIter.hasNext()){
var shopcamp = shopcampIter.next()
shopcamp.pause()
}
}
Resuming campaigns:
function main() {
var searchdisplaycampIter = AdsApp.campaigns().withCondition("LabelNames CONTAINS_ALL ['holidays']").get()
while(searchdisplaycampIter.hasNext()){
var searchdisplaycamp = searchdisplaycampIter.next()
searchdisplaycamp.enable()
searchdisplaycamp.removeLabel('holidays')
}
var videocampIter = AdsApp.videoCampaigns().withCondition("LabelNames CONTAINS_ALL ['holidays']").get()
while(videocampIter.hasNext()){
var videocamp = videocampIter.next()
videocamp.enable()
videocamp.removeLabel('holidays')
}
var shopcampIter = AdsApp.shoppingCampaigns().withCondition("LabelNames CONTAINS_ALL ['holidays']").get()
while(shopcampIter.hasNext()){
var shopcamp = shopcampIter.next()
shopcamp.enable()
shopcamp.removeLabel('holidays')
}
}
Both scripts run according to a set schedule.
If you've got bids at the keyword level and need to maintain a specific position, this is a great option for hourly adjustments—or however you set it up.
You can find more free solutions on www.freeadwordsscripts.com.
But these are all standard free solutions that don't always hit the mark. That's why we started developing our own.
As an agency, we discovered ways to make working with contextual advertising more comfortable:
- Hourly monitoring of campaign daily budgets, which lets us manage very active accounts with limited budgets.
- Daily tracking of expenses and other metrics, with notifications for any issues or unusual situations.
- Hourly bid adjustments at the ad group level (or keyword level).
- Plus a bunch of other custom tweaks.
Google Scripts open up new possibilities for automation when standard automated rules just don't cut it. That's why we dove into working with scripts—it allows us to be more flexible and dynamic.
Custom scripts made to order
For online stores, projects with large accounts, or even small and medium businesses, we offer services to write Google Ads scripts tailored to your needs. You give us the logical task, and we'll handle the execution. For more details, send us a request or get in touch via the agency's contact numbers.
* For clients on the Ultra package, our custom-developed scripts for controlling contextual advertising are available by default.