Why would you run a marketing campaign that costs more than the profit it generates? As absurd as it might sound, this situation actually represents one that many marketers unknowingly find themselves in.
Let’s say you’re running all of the marketing for a single-product ecommerce store. The shop makes a $20 profit from each sale before taking into account any marketing spend. Now let’s say that someone pitched you an idea on how you could generate more sales by spending $30 of marketing dollars per sale. Chances are you’d scoff at the idea, right? However, even though marketing campaigns can appear profitable at an aggregate level if the cost per sale is below $20, it doesn’t mean that every sale generated is costing the brand less than $20. That means that even when we’re profiting at an aggregate level, we can still be losing money. To understand why this is the case, we need to understand the idea of marginal metrics.
If the Cost Per Acquisition (CPA) on a particular marketing campaign is $10, it means that the average acquisition from that campaign costs $10. It’s crucial to understand that this doesn’t mean each and every acquisition generated by the campaign costs $10; some will cost less, and some will cost more.
To see why, let’s use an example. Say you are running a small paid search campaign that’s netting you 10 conversions per day with a $5 CPA. One day, you decide to be more aggressive and increase the volume that you’re generating. Following the bid increases, the company is now generating 30 conversions a day at a $15 CPA. Did you follow that math? If you make $20 per conversion, was increasing your paid search a good move?
Many marketers would think this is a good move, because they could increase their volume substantially, and keep the CPA safely below the $20 margin. This thinking is a bit misguided, and we’re going to do some math (just a little!) to learn why.
The bid increases created two different buckets of conversions:
Bucket A. These are the conversions from before the bid increases:10 conversions a day, at a $5 CPA (a total spend of $50 per day).
Bucket B. And here are the conversions that we only got after we increased our bids: 30 of them. Take away the previous 10 and we’re left with 20 conversions a day.
To calculate the CPA for Bucket B, we need to calculate what’s referred to as the marginal CPA of these conversions. While CPA is equal to cost divided by conversions, marginal CPA is equal to the difference in cost before and after the bid increases, divided by the difference in conversions before and after the bid increases.
It looks like this:
Carrying through those calculations, the marginal CPA of the conversions in Bucket B is $20. So, effectively, each incremental conversion generated after pushing bids cost us an average of $20.
Now that we know our margin per conversion is $20, and the marginal CPA on our bid increases is $20, we can say that increasing our bids really made no difference at all to our bottom line. Each additional conversion generated no more margin than the spend it took to generate that conversion. Increasing our bids may have helped our top line revenue, making it appear as if we made a positive change, but we didn’t actually manage to add profits to our bottom line.
The crucial lesson here is that CPA, despite being an average metric, really doesn’t tell us much. If we want to know whether it makes sense to push or pull spend on a certain channel, we have to look at the marginal CPA on the change to decide.
This logic goes beyond just changing bids. Every paid marketing channel not only has an average CPA, but also a marginal CPA associated with it.
If you’re running Facebook Ads, and generating 100 conversions a day at a $10 average CPA, the marginal CPA on that channel would take into account the amount you’d have to spend to get from 99 conversions to that 100 conversions.
While it’s tempting to think that $10 will do the trick for that 100th conversion, the real answer is likely to be much higher, perhaps somewhere in the region of $20 to $40. (This happens because the more ads you run on a channel, the more saturated the channel becomes, making it harder to get each additional conversion.)
Sometimes less really is more: If we know that each conversion only brings us $20 in margin, any channel with a marginal CPA above $20 is actually less profitable than it could be. A marginal CPA above $20 means that we could generate more profit from that channel, were we to pull back spend on it.
Pulling back spend on one channel means you may have more budget to allocate elsewhere. If you’re wondering how to best stretch marketing dollars across channels, let’s talk.
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. |