Budget optimization is a familiar concept to most performance marketers — leveraging algorithms that automatically shift spend between different ads or ad sets depending on results. These algorithms are so deeply ingrained in many ad platforms that it can be difficult to imagine a world without them.
For all their ubiquity though, budget optimization algorithms are often misunderstood. Shifts in spend aren’t always immediately apparent, and even when they are they can seem contrary to logic. Today’s topic is: How do budget optimization algorithms work?
Leaving marketing aside for a minute, let’s talk about something called the multi-armed bandit (MAB) problem. This goofy sounding (but important) probability theory is the mathematical basis for budget optimization.
Here’s how the theory works in a nutshell:
Imagine you’re in a casino with 10 different slot machines. Every time you pull the arm of a slot machine, you receive a cash reward.
Three critical factors are at work:
Now, let’s say you’re then told that you can pull the slot machine arms a total of 100 times. How do you maximize your reward?
A naïve approach to the problem might suggest pulling each slot machine’s arm the same number of times: Since there are 10 machines, in this scenario you’d pull each slot machine’s arm 10 times.
The reasoning behind this method is that distributing pulls equally between the slot machines will give you the best chance to compare the rewards you got from each slot machine at the end of your 100 pulls.
Even before you get to your full 100 pulls however, you’ll probably notice that some slot machines appear to be rewarding you more than others.
Intuitively, if you notice this after you start, then you should switch strategies and start pulling the arms of those slot machines with higher rewards more often than the low-rewarding slot machines. This is where we we need to think about exploration and exploitation.
The mathematical solutions to MAB problems are often framed in terms of exploration and exploitation.
In your first few pulls, you have no idea which slot machines are going to generate the best rewards. Therefore, you must explore the different slot machines, and use your pulls simply to get a good understanding of which slot machines appear the most profitable.
Once you start to get an indication that some slot machines are more profitable, you can move into exploitation, where you focus your pulls on the slot machines that appear to be the most lucrative.
Exploration and exploitation happen at the same time. While you might start off with all of your pulls being exploratory pulls, gradually, you can shift more of them to exploitative pulls, as you become more confident in which slot machines provide the greatest reward.
Assuming that the reward distribution of each slot machine doesn’t change over time, you’ll eventually reach a point where your pulls are 0% exploration and 100% exploitation. In other words, you’ll figure out which slot machine is best and pull it every time.
If we introduce a time component that allows the reward distribution of each slot machine to change over time, the situation becomes more complex. In this scenario, you’ll never know for sure that one slot machine is the best, as the reward distributions could change subtly with every pull.
To account for this, you always need to reserve some of your pulls for exploration. You must constantly explore the less profitable slot machines in case they become more profitable over time.
In a marketing context, the slot machines become ads, ad sets, or other creative you’re trying to optimize. Instead of pulling the slot machines’ arms, we’re looking at where we should spend our next dollar of advertising budget.
In the same way that different slot machines have different reward distributions, different ads have different conversion distributions. We don’t know what they are when we run ads for the first time, so it makes sense for optimization algorithms to spend our budget in a highly exploratory way, spreading the budget across multiple ad sets to gauge which generates the best outcomes.
We know in marketing that no ads or ad sets are going to see static performance over time. Market conditions change and users get ad fatigue when they see creative repeatedly.
This is why the solution to budget optimization isn’t to determine which ad set is the best and give that 100% of the budget. The optimal solution is to continuously explore, and dedicate at least some spend toward lower performing ad sets so that we can react in the event that their performance improves.
Understanding the logic behind budget optimization algorithms is crucial to understanding how they act. While certain aspects of their behavior might seem odd or counterintuitive — such as allocating traffic to your worst ads — remember that they are playing out a solution to a well-solved mathematical problem.
Allowing the algorithms to continue exploring all available options is the key to long-term efficiency in budget allocation.
Do you have more questions about how to get the most out of your ad budget spend? Let’s talk.
Sue Cahaly is WITHIN’s Content Marketing Manager. She and her husband live outside of Boston in a house full of kids, dogs and music.
Get industry insights and news directly to your inbox.
Thank you. Check your email for details on your request.
Cookie | Duration | Description |
---|---|---|
__hssrc | session | This cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session. |
checkForPermission | 10 minutes | This cookie is set by Beeswax to determine whether the user has accepted the cookie consent box. |
cookielawinfo-checkbox-advertisement | 1 year | Set by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Advertisement" category . |
cookielawinfo-checkbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
cookielawinfo-checkbox-functional | 11 months | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional". |
cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
cookielawinfo-checkbox-others | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other. |
cookielawinfo-checkbox-performance | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance". |
CookieLawInfoConsent | 1 year | Records the default button state of the corresponding category & the status of CCPA. It works only in coordination with the primary cookie. |
elementor | never | This cookie is used by the website's WordPress theme. It allows the website owner to implement or change the website's content in real-time. |
JSESSIONID | session | The JSESSIONID cookie is used by New Relic to store a session identifier so that New Relic can monitor session counts for an application. |
viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |
Cookie | Duration | Description |
---|---|---|
__cf_bm | 30 minutes | This cookie, set by Cloudflare, is used to support Cloudflare Bot Management. |
__hssc | 30 minutes | HubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie. |
bcookie | 2 years | LinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser ID. |
bscookie | 2 years | LinkedIn sets this cookie to store performed actions on the website. |
lang | session | LinkedIn sets this cookie to remember a user's language setting. |
lidc | 1 day | LinkedIn sets the lidc cookie to facilitate data center selection. |
UserMatchHistory | 1 month | LinkedIn sets this cookie for LinkedIn Ads ID syncing. |
Cookie | Duration | Description |
---|---|---|
_uetsid | 1 day | Bing Ads sets this cookie to engage with a user that has previously visited the website. |
_uetvid | 1 year 24 days | Bing Ads sets this cookie to engage with a user that has previously visited the website. |
Cookie | Duration | Description |
---|---|---|
__hstc | 1 year 24 days | This is the main cookie set by Hubspot, for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session). |
__lotl | 5 months 27 days | This cookie is set by Lucky Orange to identify the traffic source URL of the visitor's orginal referrer, if any. |
_ga | 2 years | The _ga cookie, installed by Google Analytics, calculates visitor, session and campaign data and also keeps track of site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognize unique visitors. |
_gcl_au | 3 months | Provided by Google Tag Manager to experiment advertisement efficiency of websites using their services. |
_gd_session | 4 hours | This cookie is used for collecting information on users visit to the website. It collects data such as total number of visits, average time spent on the website and the pages loaded. |
_gd_svisitor | 2 years | This cookie is set by the Google Analytics. This cookie is used for tracking the signup commissions via affiliate program. |
_gd_visitor | 2 years | This cookie is used for collecting information on the users visit such as number of visits, average time spent on the website and the pages loaded for displaying targeted ads. |
_gid | 1 day | Installed by Google Analytics, _gid cookie stores information on how visitors use a website, while also creating an analytics report of the website's performance. Some of the data that are collected include the number of visitors, their source, and the pages they visit anonymously. |
_hjAbsoluteSessionInProgress | 30 minutes | Hotjar sets this cookie to detect the first pageview session of a user. This is a True/False flag set by the cookie. |
_hjFirstSeen | 30 minutes | Hotjar sets this cookie to identify a new user’s first session. It stores a true/false value, indicating whether it was the first time Hotjar saw this user. |
_hjIncludedInPageviewSample | 2 minutes | Hotjar sets this cookie to know whether a user is included in the data sampling defined by the site's pageview limit. |
_lo_uid | 2 years | This cookie is set by Lucky Orange as a unique identifier for the visitor. |
_lo_v | 1 year | This cookie is set by Lucky Orange to show the total number of visitor's visits. |
_lorid | 10 minutes | This cookie is set by Lucky Orange to identify the ID of the visitors current recording. |
hubspotutk | 1 year 24 days | HubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts. |
IR_gbd | session | Impact Radius sets this cookie to store a unique ID which is used to identify the user's device, when they return to the websites that used the same network. |
Cookie | Duration | Description |
---|---|---|
__qca | 1 year 26 days | The __qca cookie is associated with Quantcast. This anonymous data helps us to better understand users' needs and customize the website accordingly. |
_fbp | 3 months | This cookie is set by Facebook to display advertisements when either on Facebook or on a digital platform powered by Facebook advertising, after visiting the website. |
_mkto_trk | 2 years | This cookie, provided by Marketo, has information (such as a unique user ID) that is used to track the user's site usage. The cookies set by Marketo are readable only by Marketo. |
B | 1 year | This Cookie is used by Yahoo to anonymously store data related to user's visits, such as the number of visits, average time spent on the website and what pages have been loaded. This data helps to customize website content to enhance user experience. |
bito | 1 year 1 month | This cookie is set by Beeswax for advertisement purposes. |
bitoIsSecure | 1 year 1 month | Beeswax sets this cookie for targeting and advertising. The cookie is used to serve the user with relevant advertisements based on real time bidding. |
fr | 3 months | Facebook sets this cookie to show relevant advertisements to users by tracking user behaviour across the web, on sites that have Facebook pixel or Facebook social plugin. |
mc | 1 year 1 month | Quantserve sets the mc cookie to anonymously track user behaviour on the website. |
MUID | 1 year 24 days | Bing sets this cookie to recognize unique web browsers visiting Microsoft sites. This cookie is used for advertising, site analytics, and other operations. |
test_cookie | 15 minutes | The test_cookie is set by doubleclick.net and is used to determine if the user's browser supports cookies. |
tuuid | 2 years | The tuuid cookie, set by BidSwitch, stores an unique ID to determine what adverts the users have seen if they have visited any of the advertiser's websites. The information is used to decide when and how often users will see a certain banner. |
tuuid_lu | 2 years | This cookie, set by BidSwitch, stores a unique ID to determine what adverts the users have seen while visiting an advertiser's website. This information is then used to understand when and how often users will see a certain banner. |
Cookie | Duration | Description |
---|---|---|
__pdst | 1 year | No description available. |
_an_uid | 7 days | No description available. |
_dc_gtm_UA-61749619-1 | 1 minute | No description |
_dlt | 1 day | No description |
_hjSession_1771567 | 30 minutes | No description |
_hjSessionUser_1771567 | 1 year | No description |
_nx-nocache | session | No description available. |
6suuid | 2 years | No description available. |
A3 | 1 year | No description |
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ | session | No description |
AnalyticsSyncHistory | 1 month | No description |
BIGipServerab44web-nginx-app_https | session | No description |
bounceClientVisit3783c | 30 minutes | No description |
bounceClientVisit3783v | 30 minutes | No description |
dgzsdl08v4 | 10 minutes | No description |
IR_11658 | session | No description |
li_gc | 2 years | No description |
tableau_locale | session | No description available. |
tableau_public_negotiated_locale | session | No description available. |
test | 1 year | No description available. |