Brand vs Performance: Why ad mixing is hard for Marketplaces
You run a Marketplace platform, and you want to boost revenue and empower sellers. You decide to sell promotions, and you start with what’s easy: insertions at the top of the page at a fixed price to big brand advertisers.
These are easy wins, but they’re inefficient, and they don’t scale.
To scale, your platform moves to a performance promotion strategy. Suddenly your platform is accountable to produce measurable performance for promoters and users, like clicks.
“Brand ads are cheap, but performance advertisers will pay higher prices if you can prove performance” …so the theory goes.
You implement some ML, you increase your ad CTRs (click-through rate), you increase promoter profits, and yet, you still see brand advertisers winning top slots and sustainably paying higher prices than performance advertisers. What happened?
You added performance ads but didn’t increase revenue. Why?
You may have an auction problem.
A common mistake in scaling promotion platforms is that the simple marketplace design that worked for simple insertion orders isn’t designed to work with blends of brand and performance ads, like on Facebook.
For example, when mixing brand (CPM) and performance (CPC or other non-insertion-based optimizations like conversion-optimization), many marketplace platforms implement a version of the following:
A common simple design that fails:
- Compute pCTR (predicted click-through-rate) for every ad candidate for an “average” position on a page.
- Compute a utility score, which is some formula of flat CPM bids for brand advertisers, something like pCTR*ClickBid for performance advertisers, and some predicted engagement for user quality controls.
- Sort ads in decreasing order of utility and fill slots in this order, subject to a minimum value.
- Compute prices using GSP (Generalized Second Price auction), that is, each ad pays the utility of the next highest utility ad.
This naïve solution works poorly for mixtures of performance and brand ads. Here’s one reason why:
Your allocation needs to support different bids for different slots.
Top slots have an outsized value to performance advertisers because users are most likely to click on whatever is presented first. If your auction system doesn’t support this, then you cannot capture that value.
In the solution above, note that first pCTR was computed, and then ads were allocated. But if pCTR is a function of allocated position, then if you didn’t adjust pCTRs based on allocation, then your Performance ad bids are too low in top positions and too high in low positions. So, Brand ads, which don’t have different bids for different positions, will tend to be inefficiently allocated to higher slots than they should have been. See the Appendix: Worked Example for a demonstration about why this is.
If you had all CPC ads, like Yahoo or Google, then this doesn’t apply. You can assume that the ordering of bids doesn’t matter on a position pCTR scalar. Likewise, if you had all CPM ads, the bids don’t vary by position, and this doesn’t apply.
But, if different bids depend differently on the slot allocated, then there is no single “ordering” of items, and a more complex allocation and pricing solution is needed than GSP to efficiently allocate promotions. A less efficient allocation will tend to generate less value and revenue than it could have.
If you like these technical discussions for marketplace business problems, at Promoted.ai, we build efficient auctions to unlock your marketplace’s GMV. Follow me for more about how to balance buyers, sellers, and platform revenue using machine learning and auction theory.
Appendix: Worked Examples
(you can stop reading here unless you want to work through some simple numbers)
Say our page has three slots with the following click probabilities as compared to allocating an ad in the “average” Slot 2. “Average” CTRs are typically computed by pooling together clicks from ads in all positions on the page.
Slot 1: 150% click probability
Slot 2: 100% click probability
Slot 3: 50% click probability
We have three ads that we can deliver:
- A & B: A brand ads with a CPM bid of $1.25
- C: A performance ad with a CPC bid of $1 and an “average page position” click probability of 0.1%.
The naive, greedy solution is to compute all bids for a single position on the page (either the top position or the “average” position), sort bids, and allocate. Using top-slot bids, the result is:
- A: bid $1.25 eCPM = $1.25 of value
- B: bid $1.25 eCPM = $1.25 of value
- C: bid $1 eCPM = $1 * 50% = $0.5 of value
Total: $3 in value.
This is inefficient. To maximize the value, the performance ad C should have been allocated first, not last, where the click probability is higher, even though both A and B bid higher than C “on average.”
- C: bid $1.5 eCPM = $1.5 of value
- A: bid $1.25 eCPM = $1.25 of value
- B: bid $1.50 eCPM = $1.25 of value
Total: $4 in value and +$1 value from performance ads compared to the greedy solution.
The greedy, “page-average” bids are also inefficient. In the greedy solution with per-page bids, C is over-bidding for position 3. If billing CPC, then C will have 50% realized clicks, and the platform will lose up to half of its revenue from that slot. If billing oCPM, then C will be billed as if they got twice as many clicks as they will get with an observed average CPC of up to 200% over C’s click bid of $1.
The solution is to use a more complex non-linear allocation algorithm that maximizes the total page value. This is called “page maximization,” or “slate optimization.” Unfortunately, if you implement a non-linear allocation solution, then there is no linear order, and there is no “second” winning ad, and so GSP doesn’t apply anymore.