We love digital - Call
03332 207 677 and say hello - Mon - Fri, 9am - 5pm
Call 03332 207 677
Unlike 08 numbers, 03 numbers cost the same to call as geographic landline numbers (starting 01 and 02), even from a mobile phone. They are also normally included in your inclusive call minutes. Please note we may record some calls.
I have spent a lot of time researching and testing Google AdWords scripts to bring you the top 100 that have been proven to be most useful. They have been split up into specific sections, so you can easily locate the script you are looking for.
Before we go on any further, I want to take a minute to thank the individuals and/or companies who have created these amazing scripts and made them opensource so anyone can use them and benefit from the results. I also want to thank AdWords Scripts and Canada Catalyst for the scripts they have provided.
2. Calculate and Set Mobile Bid Modifiers by Frederick Vallaeys from Optmyzr. This script reviews your ROAS or PPC performance between mobile and desktop/tablet. When it has reviewed this, it then analyses keyword level data and suggests a mobile bid modifier for the ad groups/campaigns. This script is for those who want to bring mobile in line with their desktop/tablet campaigns, as mobile only campaigns have been removed. Sign up with Optmyzr to access the script.
3. Set and Suggest Mobile Bid Modifiers by Russell Savage from FreeAdWordsScripts.com. This script is based on adjusting the mobile bid modifier. You can set a minimum and maximum bid adjustment for campaign or ad group level, which enables you to keep on top of mobile traffic.
4. Pause Ads With Low CTR by Russell Savage from FreeAdWordsScripts.com. With this script, you are able to pause the lower CTR ad in each ad group (based on if there is at least one other ad in the ad group). Manually, this can take a long time to do, so this script enables you to easily keep the better performing ad running, meaning lower costs and higher CTRs.
5. Pause Ad Groups With No Active Keywords by Russell Savage from FreeAdWordsScripts.com. This script would be useful for larger AdWords accounts, as it automatically pauses ad groups with no active keywords. This essentially saves you time in the long run in managing the account.
6. Pause All Keywords With No Impressions by Russell Savage from FreeAdWordsScripts.com. Do you have lots of dead keywords looming in your account negatively impacting on your Quality Score? Well this might be the script for you, as it automatically pauses keywords with no impressions. This script will clean up your account, providing a clear view of the top keywords in your account.
7. Pause or Enable Campaigns, Keywords or Ads On a Specific Date by Russell Savage from FreeAdWordsScripts.com. Using labels with “Pause on” or “Enable on”, this script will perform the action you want to take on a specific date. This is useful for when you aren’t available to access your account on a specific date and therefore need to schedule in specific actions.
8. Account Monthly Budget Pause by Sean Dolan from Pushfire. This script is really useful for when you only have a limited amount of money to spend and you can’t afford to go over on your budget. It will label and pause your ads when you have reached your total spend cut off point. This is beneficial for those who have strict budgets to adhere to.
9. Pause Keywords With Low Quality Score by Optmyzr. This script checks your keywords over the last 30 days (by default) and automatically pauses keywords with a Quality Score of 5 and under. This is a great time saving script and will help with maintaining high Quality Scores in the account.
10. Delete All Disapproved Ads In An Account by Russell Savage from FreeAdWordsScripts.com. Another great account maintenance script here – large accounts may sometimes build up thousands of ad groups with ads in that have been disapproved. Having this script enables you to remove those disapproved ads in bulk.
11. Remove Underperforming Ads by Frederick Vallaeys from Optmyzr. You can use this script to run a monthly clean-up of all ad experiments (it’s always advisable to run two ads per ad group to split test). It then suggests the ad to remove. This can help you to keep the correct ad when split testing, which will ultimately improve account performance. Sign up to Optmyz to access this script.
12. Disable Ads and Keywords For Out Of Stock Items by Russell Savage from FreeAdWordsScripts.com. This script pauses ad groups when an item on the website goes out of stock. This script is really useful for big e-commerce sites that have products that go in and out of stock all of the time, as you don’t want to be paying for ads that are directed to pages with inactive stock. This is a must have script to save on costs.
13. Bid By Weather by AdWords Scripts. The Bid By Weather script allows you to apply a bid modifier based on the weather through the OpenWeatherMap API. This is beneficial for businesses that depend on seasonality, as they will be able to automatically modify their ad position through this. For example, a sunglasses shop would apply high bid adjustments in the summer and low bid adjustments in the winter.
14. Manage Ads Based On Airport Delays by Russell Savage from FreeAdWordsScripts.com. This script enables and pauses ads when there is a delay at an airport. This is where bars, restaurants, hotel and surrounding businesses can be really smart and adjust their ad text to cater for such circumstances.
15. Leverage Amazon To Find High Commercial Intent Keywords by Derek Martin from Ask.com. This script works by using Amazon autocomplete for new keyword opportunities. You can export the results and add the new keywords into Google AdWords. This is a great tool for making the most of keyword research and would be beneficial to most businesses.
16. Stock Market Performance by Russell Savage from FreeAdWordsScripts.com. This is a good script for using the stock market performance to adjust your bids via the Yahoo Finance API. It uses real time data which you can use to determine your bids.
17. Authenticating to OAuth Services Using AdWords Scripts by Russell Savage from FreeAdWordsScripts.com. This script works by authenticating using OAuth and retrieving data from a service. By pulling data from a service (e.g. Twitter REST API), you can have all your data in one place.
18. Put Crime Statistics In Your Creatives by Russell Savage from FreeAdWordsScripts.com. This script was created by pulling in crime stats (public record data) and updating the keyword ad parameters with the total number of different types of crime. This script would be beneficial to security companies or those who sell insurance, as statistics are always a great way to lure people in to click on an ad; it would also have a great impact on your CTR.
19. Connect Zoho CRM Data With AdWords Using Scripts by Russell Savage from FreeAdWordsScripts.com. By connecting your Zoho CRM to Google AdWords using scripts, you are then able to report on an entire sales flow within a single report, which is especially handy for B2B businesses. By having all of your important data grouped together, you are able to analyse your PPC activity efficiently and effectively.
20. Pull Salesforce Data Into AdWords Using Scripts by Russell Savage from FreeAdWordsScripts.com. Similar to the Zoho CRM script, you are able to connect your Salesforce CRM to AdWords in order to report on an entire sales flow within a single report. When integrating two platforms of data, this will allow business owners to access information in one place.
21. Bid Testing by AdWords Scripts. This script tests different bids and records the results in a Google spreadsheet. This is great because it can then show which bid had the highest CTR and performed the best. This sheet will enable you to determine the best strategy to use in terms of setting budgets and ROAS.
22. Bid to Position by AdWords Scripts. By bidding to a certain ad position, you can test which ad position works best for your goals. This is ideal if you have any budget constraints and need to work with a lower ad position due to competition (e.g. ad position 4).
23. Multi Bidder by AdWords Scripts. The Multi Bidder script acts the same as automated rules. However, you can see all of the rules in a Google spreadsheet, which helps you to keep on top of all of the rules that are currently running in the account.
24. Unique Bidding Rules For Each Campaign by Russell Savage from FreeAdWordsScripts.com. This script enables you to automatically adjust bids depending on a rule. For example, when the cost per conversion has reached a limit, the bids can be adjusted. You can add as many rules as you want. This is a great script for saving time.
25. Flexible Budgets by AdWords Scripts. This script enables you to decipher how the budget is set on a daily basis. However, there is no control over how the budget is consumed during the campaign. This is a great script if you want to schedule how the budget is spent day to day.
26. Update Your Bids From A Google Spreadsheet by Russell Savage from FreeAdWordsScripts.com. With this script you can update your bids at a large scale from a Google spreadsheet. This is a great script for saving time.
27. Dynamically Adjust Campaign Budgets by Russell Savage. This script enables you to set a budget and gives you the ability to pause or set a different budget for campaigns when the monthly budget has been used up. It re-enables the campaigns at the start of each month. This is ideal for those who have strict budgets to adhere to or want to set different budgets at different times of the month.
28. Increase Bids On Cheap Conversion Keywords With this script you can decide on a bid adjustment percentage for cheap conversion keywords. This is ideal if you want to increase conversions on low cost converting keywords, as you will then be able to reduce your cost per conversion.
29. Ad Customizer by AdWords Scripts. This is a handy script, as it enables you to fetch live data (e.g. prices or inventory level) and dynamically insert these into your ads. The data is stored in Google spreadsheets. The benefit of this is that it is pulling in live data into the ads, which can be very compelling for searchers.
30. Ad Parameterizer by AdWords Scripts. This works the same as the Ad Customizer script, but with ad parameters.
31. Sale Countdown by AdWords Scripts. The Sale Countdown script essentially calculates how many hours and days until a promotion is over and incorporates this in the ad text – ideal for those who have a sale on for a limited time only.
32. Sales Countdown Calendar by AdWords Scripts. This essentially works in the same way as the script above, however you can schedule multiple events by integrating a calendar into the script – ideal for managing your special offers throughout the year.
33. Account Anomaly Detector by AdWords Scripts. This works by e-mailing the account user if the account is behaving differently to how it has performed in the past. This script is worth having set up because you want to be sure your ads are running without any errors or problems, otherwise you could be wasting money.
34. Link Checker by AdWords Scripts. This script is great for picking up links that are broken. Every account should have this script implemented, because if your ads are directing to pages that are not found, you are effectively throwing money away.
35. Finding Anomalies In Your Keywords, Adgroups and Ads by Russell Savage from FreeAdWordsScripts.com. By identifying anomalies in your account, you can identify the issues and fix them. This helps with cleaning up your PPC account.
36. Disapproved Ads Via Text Message & E-mail by Derek Martin from Ask.com. This script identifies disapproved ads in a Google spreadsheet and texts you to alert you of this. By being alerted of the disapprovals, you can pause the ads and create new ones immediately or contact Google to try and get them approved.
37. Zero Impressions Alarm by Catalyst Canada Contributor. This script lets you know when your ads have had no impressions. This would be beneficial so that you can investigate and rectify any problems as soon as possible.
38. Make Calls and Send Text Messages To Your Phone From AdWords Scripts by Russell Savage from FreeAdWordsScripts.com. This script effectively works by sending you text messages and calls via Twilio about the account. This is ideal for those who get locked out of their e-mail accounts regularly and would prefer an alternative method of communication for their accounts.
39. Changes In CTR by Sean Dolan from Pushfire. With this script Google spreadsheets is used to note the changes in CTR. This is useful if you have a highly successful ad you want to track which has had a recent change in CTR. From here you can check for any changes in user behaviour or on and changes on the website that may have triggered it.
40. Campaigns Over CPA by Sean Dolan from Pushfire. This script alerts you when your campaigns have reached your target CPA. This is useful if you have certain CPA goals to reach and need to do some optimisation on the account to reduce this.
41. Ad Copy Test Alert by Sean Dolan from Pushfire. This script compares the CTR of two ads that have had more than 1,000 impressions each. It will help you to choose the best ad to use and enhance account performance.
42. Daily Alerts by Sean Dolan from Pushfire. This script will send you daily alerts on your account, which can be very useful if you want to know how your account is performing on a day-to-day basis.
43. Account Summary Report by AdWords Scripts. This script uses Google spreadsheets to show the performance of an entire AdWords account – you can even create graphs. This is perfect for those who would like to keep a record of how their account is performing.
44. Ad Performance Report by AdWords Scripts. This script focuses primarily on the ad performance, including how a given headline or URL performs. If you want to find out which ad text variations work the best, then this is a great report to use.
45. Declining Ad Groups Report by AdWords Scripts. By tracking ad groups that are gradually worsening in performance, this script enables you to decide whether to switch these off or improve them. The benefit of this is that you can keep on top of the performance of every ad group in your campaign to find out which ones are most successful.
46. Keyword Performance Report by AdWords Scripts. This works by using a Google spreadsheet to display how your keywords are performing with a number of different distribution charts. This is ideal for making a decision on keeping or pausing under performing keywords.
47. Search Query Report by AdWords Scripts. The Search Query Report sets out the keywords you can add or exclude, which helps you to sort out your incoming search terms.
48. Performance Signals Report by AdWords Scripts. This is a flexible MCC report that shows several performance signals across all of your accounts via a heat map, which then allows you to calculate a score that rates each account. This is great, especially for agencies to figure out which account is performing the best.
49. Mobile PageSpeed by AdWords Scripts. The PageSpeed Insights: Mobile Analysis tool provides a report suggesting how you can improve your mobile landing pages. This is a great report for landing page optimisation, as the more mobile optimised your landing pages are, the more likely they are to convert on mobile.
50. Store Account, Campaign, Ad Group, and Keyword Level Quality Score by Russell Savage from FreeAdWordsScripts.com. This script stores the Quality Score for any date range via Google spreadsheets. This is a fantastic script, as you can compare the scores between certain date ranges and see where you need to improve.
51. Campaign and Keyword Performance Reporting by Russell Savage from FreeAdWordsScripts.com. This script enables you to report on campaign and keyword performance with five different metrics. The benefit of this is that it would save you time in creating reports manually, as the script generates the reports, which you can schedule to send.
52. Daily Metrics Export by Sean Dolan from Pushfire. By exporting daily metrics via Google spreadsheets, you are able to keep track of your statistics and historical data.
53. Monthly Projections by Sean Dolan from Pushfire. By tracking the monthly projections via Google spreadsheets, you can keep track of your data month on month.
54. Google AdWords Quality Score Performance Analyzer by Derek Martin from Ask.com. This script audits an account’s quality score performance and creates a table that shows the distribution of CTR, conversions and cost against the quality score. This helps you to analyse the relationship between these metrics and the strategy going forward for improving your quality score.
55. AdWords Account Audit Checklist Using AdWords Scripts by Russell Savage from FreeAdWordsScripts.com. The account audit check-list script runs through as many checks as possible and reports on areas to solve first. This is great for those who have recently taken over an account and need to find out what needs to be resolved.
56. Update Ads For The New Year by Russell Savage from FreeAdWordsScripts.com. This is an excellent script, especially if you use years in your ad text. It essentially pauses your ads and updates them with new ad text on January 1st – most businesses should take advantage of this to ensure their ads don’t look outdated.
57. Update Your Keywords For The Holiday Season by Russell Savage from FreeAdWordsScripts.com. This script is similar to the above, however with this script you can update your keywords year on year, for example if they had the year 2015 in, this would be changed. This would save on admin time in the New Year and would suit those who don’t come into the office on January 1st!
58. Automating Maintenance Tasks With AdWords Scripting Part 1 by Russell Savage from FreeAdWordsScripts.com. This script deals with keywords that are converting too expensively.
59. Automating Maintenance Tasks with AdWords Scripting Part 2 by Russell Savage from FreeAdWordsScripts.com. This script rewards keywords that are bringing in cheap traffic.
60. Automating Maintenance Tasks with AdWords Scripting Part 3 by Russell Savage from FreeAdWordsScripts.com. This script de-clutters your account by shedding keywords that don’t have any conversions.
61. Label Keywords With Organic Rank Data by Brainlabs. In order for this script to work, you need to fill out your organic keyword positions in a Google spreadsheet and the script will then automatically match these up to any keywords in the PPC account (and their positions). This is great for comparing your SEO efforts against your PPC efforts.
62. Label Countdown For Ignoring New Elements by Russell Savage from FreeAdWordsScripts.com. If you want to label keywords that have recently been added to your account, this is the script for you. The benefit of this script is that you will know which keywords to optimise and therefore will not accidentally optimise the keyword or pause it when it has just been added.
63. Merge Labels From Multiple Campaigns by Russell Savage from FreeAdWordsScripts.com. This script follows on from the “merge multiple campaigns together” script, as it then copies all of the labels from the original campaigns over to the new campaign. This is so you can continue to keep track in the same format as before.
64. Labels For When New Ads, Ad Groups, Keywords or Campaigns Were Created by Russell Savage from FreeAdWordsScripts.com. By using labelling to establish when an ad received its first impression, you can track how effective each ad/ad group/keyword/campaign really is. This is really useful for when you’re optimising your account, as you will be able to see the history.
65. AdWords Dashboard By Label by Sean Dolan from Pushfire. This script allows you to label different campaigns in bulk, which is useful to tag your campaigns quickly.
66. Account Labels by AdWords Scripts. Account labels comprise a list of different scripts on how to use account labels, which will let you bulk label certain campaigns in your account.
67. Labels by AdWords Scripts. This script identifies poorly performing keywords and labels them for you to review later on. This is great for identifying which keywords to pause or improve.
68. Track Quality Score by Martin Roettgerding from Bloofusion Germany. This script uses labels to track the Quality Score of the keywords. Changes are logged and can be emailed to you. You can use the history in the Google spreadsheet for in-depth analysis.
69. Track AdWords Script Runs with Google Analytics by Russell Savage from FreeAdWordsScripts.com. This script is used to enable Google Analytics to report on the scripts you run within your AdWords account. This would be beneficial for those who want all of their reporting in one place within Google Analytics.
70. MCC Script Dashboard by Frederick Vallaeys from Optmyzr. This script builds a dashboard for all of your PPC accounts and shows how yesterday’s spend compares to the day before and to the same day last week. This is handy for tracking spend on each account you deal with.
71. Track Campaigns By CPA by Sean Dolan from Pushfire. By tracking CPAs by determining whether they have a high or low CPA, you can determine which keywords to enable or pause.
72. Auto Add Track Parameters If Not There. In this script, you can state which parameters should be automatically added to your campaigns if they are not already there. This is useful if you want to make sure the track parameters cover your whole AdWords account.
73. Fixing Capitalisation Errors In Your Ads by Russell Savage from FreeAdWordsScripts.com. This script works by trailing through all of your ads and replaces the ones with capitalisation with new ads. This helps to save time on amending each ad.
74. Ad Creative Test Automation Script by Russell Savage from FreeAdWordsScripts.com. This script automatically tracks when the ad creative test starts and this is stored in a Google spreadsheet. You can then choose the best performing ad using an accurate time scale.
75. Manage Your AdWords Creatives Using Excel by Russell Savage from FreeAdWordsScripts.com. If you want to manage your AdWords account using Excel, then this is the script for you. It allows you to manage ads, ad groups and ad extensions in Excel, which may be an easier format to use than Editor or the AdWords interface for some.
76. Copy Existing AdWords Ads With A New Destination URL by Derek Martin from Ask.com. By copying existing ads with a new destination URL, you can save time and switch the ads over/split test quickly.
77. Feed Your Inventory Count Into AdWords Ads by Nathan Byloff from RankHammer. This script pauses ads when a certain product is out of stock via WooCommerce. This is a handy script to use for e-commerce sites, as you will save money on ads that are directed to an out-of-stock product.
78. AdWords Countdown Ads Updater Script by Derek Martin from Ask.com. This script updates the countdown ads by pausing them and replacing them with the new dates. This helps to keep the countdown ads fresh.
79. Automated Creative Testing With Statistical Significance by Russell Savage from FreeAdWordsScripts.com. This script monitors ads and notifies you via e-mail to take action when they have hit statistical significance. This is to let you know that the ads are ready for split testing, which will enable you to start improving the CTR.
80. Reverse ‘Close Variant Matching’ by Brainlabs. This script enables you to reverse the “close variant matching” on your keywords so you can tailor your ad text specifically to that keyword without it being shown for the variant keyword. This is ideal for those who have detailed strategies in mind for “exact match” keywords.
81. Account Performance By Keyword Match Type by Manas Garg from Optmyzr. This handy script enables you to compare the performance of each keyword match type so you can analyse how each one performs. This is great for figuring out which keyword match types to focus on using in your account. To access the script, you have to sign up to Optmyzr.
82. Search Query Opportunities by Daniel Gilbert from Brainlabs. This script analyses your search query report and works out the performance of each word. This enables you to figure out which keywords will work best.
83. Perform Search Query Analysis by Derek Martin from Ask.com. This script allows you to review search queries and post adjustments via Google spreadsheets.
84. Negative Keyword Lists by AdWords Scripts. These two scripts allow you to construct a new negative keyword list, add it to a campaign and remove all the shared negative keywords in a negative keyword list. This allows you to deal with negative keyword lists in an efficient way.
85. Negative Keywords by AdWords Scripts. These negative keyword scripts allow you to deal with negative keywords on a campaign and ad group level, which is great if you don’t want to use the AdWords interface or editor to manage your negatives.
86. Master Negative List by AdWords Scripts. This script enables you to use one master negative list against multiple campaigns. This could be handy for those who want to build a generic negative keyword list across multiple accounts.
87. Keywords by AdWords Scripts. The keywords scripts cover the following: adding a keyword to an existing ad group, pausing an existing keyword in an ad group, getting all keywords in an ad group and getting statistics for all keywords in an ad group. Again, these scripts are useful if you don’t want to use the AdWords interface or editor to manage your keywords.
88. Shopping Campaigns by AdWords Scripts. AdWords Scripts have provided a list of Shopping Campaign scripts to use to manage your Shopping Campaigns. This is perfect if you don’t want to manage your Shopping Campaigns within the AdWords interface or editor.
89. Shopping Content by AdWords Scripts. These scripts focus primarily on the products in the Shopping Campaigns and will save you time on optimisation by implementing them.
90. Google Display Network by AdWords Scripts. If you want to manage your Google Display Network campaigns with scripts, this list will enable you to do so. These are great scripts that help you manage your GDN campaigns efficiently.
91. Reviews GDN Placements by Derek Martin from Ask.com. This script identifies your under performing placements so that you can change what’s not working. This is a very useful script as the GDN campaigns can generate thousands of placements, which can be time consuming to manage and control manually. This script will help to keep costs low.
92. Review Google Shopping Products For Sharp Changes by Derek Martin from Ask.com. This script searches for any sharp changes in your Google Shopping campaigns. It will look at product level cost and average CPC. This is worth using if you want to be alerted to any changes in your campaigns.
93. Bulk Shopping Ad Group Creator by AdWords Scripts. This script enables you to create ad groups and product groups at a bulk level using Google spreadsheets. It allows you to organise your campaign structure and upload ad groups and product groups quickly.
94. AdWords Scripts Taking Advantage of Google Prediction API by Russell Savage from FreeAdWordsScripts.com. This script lets you use Google Prediction API in conjunction with AdWords scripts to glean insights into your PPC data. This is useful because it provides you with predictions, saving you time that you could use to analyse data yourself.
95. Use GDrive To Load A Single AdWords Script Into Multiple Accounts by Russell Savage from FreeAdWordsScripts.com. By using one Google spreadsheet to control all of your scripts, you won’t have to log in to each account and update them.
96. Building Entity Deep Links with AdWords Scripts by Russell Savage from FreeAdWordsScripts.com. This script works by building deep links next to the entity that’s having issues, which is convenient if you need to identify problems within the account.
97. Use Google Feed API To Convert RSS to JSON by Russell Savage from FreeAdWordsScripts.com. By using the Google Feed API in your script, you can automatically convert the XML in the RSS feed to JSON – this makes working with them much easier.
98. Making Sure The Date/Time Zone Is Correct by Nathan Byloff from RankHammer. If you’re running a script that turns ads on or off at a specific time, you need to make sure that the date and time zone are correct. This script enables you to rely on your account’s time, which is great if you have other time reliant scripts running.
99. AdWords Script That Leverages Google Autocomplete by Derek Martin from Ask.com. This is a brilliant script for finding potential keyword opportunities by taking advantage of Google auto complete. It will help you to expand your account without having to take the time to do your own keyword research.
100. Merge Multiple Campaigns Together by Russell Savage from FreeAdWordsScripts.com. This script pauses the old campaigns and copies them over into one big campaign, so you still have the historical data. This is useful for restructuring campaigns and making merging a quick process.
There we have it – the top 100 scripts for you to implement across your PPC accounts! If you can take away and implement a few of these scripts to start with, you’re on the way to saving yourself time and money. Automating daily tasks will help to keep your account neat and tidy. Remember to check your scripts are running in the way you want them to and sit back and relax as they do the work for you!
I’d be interested in hearing about your own scripts, so feel free to share these in the comment section below. Alternatively, you can contact me on any of the social profiles below if you have any questions.
In today’s multichannel world, there are mountains of data which provide insights into how users have interacted with your business and their path to conversion (or non-conversion). It is important to understand performance with multichannel marketing, which can be achieved through attribution modelling. Attribution refers to assigning credit to something (a channel, touchpoint, etc.) for the role it played in the final conversion. An attribution model is a rule, or set of rules, that assigns this credit correctly to the right channel or touchpoint.
For a long time, Bing, the UK’s second-largest search engine, has been underappreciated and, in some instances, even ignored. Often regarded as the inferior search engine to market leader Google, Bing has historically struggled to appeal to many in the digital world. Most PPC analysts would give justified reasons for neglecting Bing for so long; these include the volume of traffic and the user experience just not matching up to Google. However, the validity of these assessments is now diminishing. Bing has grown and improved rapidly in the last couple of years; if you are not integrating it into your comprehensive digital marketing plan, you run the risk of missing out on a large portion of your chosen market and significant revenue.