How advertising budgets are consumed to deliver maximum ROI for advertisers
Written by Sanidhya Mittal
ShareChat is on a rapid growth path and is spearheading the growth of the Indic language social media landscape. We have 180 Mn monthly active users, daily average user time spent on the platform is 31 minutes. Advertisers want to run their advertisement campaigns on ShareChat in order to reach these customers.
During the early days of our monetisation journey, we came across an interesting issue:
Uneven distribution of advertising budgets : Ads were shown to all users based on target audience criteria. Most often, the number of users was more than the required views, resulting in exhaustion of the daily allocated budget in a short span of time.
Disadvantages of uneven distribution of budget —
- for platform : Leads to unhealthy competition, ads with the higher bid will get all the inventory initially and starve low bid ads until their entire budget is consumed. Once high bid ads complete their daily budgets, low bid ads can be delivered without much competition, resulting in low yield for the platform.
- for advertisers : There is a chance that delivery will be complete within a few hours. Hence they will lose out on more relevant customers, which can come in the remainder of the campaign period and hence low ROI for advertisers.
How to find the relevancy of a user towards a particular ad?
This is a pure data science problem and can be solved using machine learning models which can consider the following factors
- Explicit user attributes (user-given) — gender, age group, language
- Implicit user attributes (deduced) — geolocation (using gps data)
- User’s historical interaction with ad
- User’s affinity towards a content category
Introduction of pacing
Pacing is a control logic that distributes advertising budgets evenly. It also restricts the delivery to most relevant users.
Pacing of advertisements can be compared to an athlete running in a race.
Sprint too early and the athlete risks fading away before the finish line, but sprint too late and the athlete never makes up the distance.
Following variables are used in pacing logic :
- Relevancy score: This can vary from 0 to 100; a higher score means higher relevancy and better chances of users engaging with an ad.
- Delivery percentile: Percentile above which we want to restrict the ad delivery. A delivery percentile of 98 would mean that ad will be shown to users with relevancy scores greater than or equal to 98.
- Traffic pattern data : Average distribution of traffic on ads engine throughout the day in each minute. A cron job computes this on a 7-day average.
- Adjustment factor (lambda): a number between -99 to +99. This factor is added in the delivery percentile periodically to vary the number of users seeing the ad dynamically based on the rate of delivery.
Pacing in action
A typical ad selection process involves the following steps.
Let’s understand pacing in more depth.
Part 1 — Using the delivery percentile to pace ads (real-time)
- We have a relevancy score between 0 to 100 for each ad for the requested user.
- Delivery percentile (x) starts from 99 and then keeps on adjusting the basis lambda value.
- Pacing determines whether to show ad or not basis relevancy score and delivery percentile.
Part2 — Variation of delivery percentile (cron job)
As mentioned earlier, after a cold start of delivery percentile (99), it varies basis an adjustment factor (lambda)
If the delivery rate is low, the delivery percentile will be reduced by factor of lambda to allow more users with a lesser relevancy score to see this ad. Similarly when delivery rate is high, the delivery percentile will increase to restrict ads to fewer users with higher relevance.
Steps involved in variation
1. find out ideal budget consumption till now —
This can be calculated based on traffic pattern data and daily budget
ideal budget in a period of time = daily budget * traffic ratio
traffic ratio in a period = sum of traffic in that period/sum of traffic for a complete day
2. find out the budget consumed so far —
This is stored in a distributed cache — Redis.
3. Calculate lambda —
It is calculated using a PID controller (Proportional-Integral-Derivative) using an ideal budget (1) and actual budget (2).
A PID controller continuously calculates an error value as the difference between the desired value and the measured value and applies a correction factor so that the measured value becomes equal to the desired value.
4. Change delivery percentile
new delivery percentile = old delivery percentile + lambda (can be negative too)
Suppose, the actual budget is less than ideal (low delivery). In that case, lambda will be negative, and delivery percentile will be reduced by a factor of lambda to allow more users with lesser relevance scores to see this ad.
Similarly, when the actual budget is more than ideal (high delivery), the delivery percentile will increase by a factor of lambda to restrict ad to fewer users with higher relevance.
This is a recurring process and it keeps on happening every few seconds.
Both part1 and part2 work in tandem and are equally crucial for entire pacing logic to work correctly.
Advantages of pacing
- Better ROI for Advertises: Ads are restricted to high relevancy users and they are more likely to engage. For the same budget, they are getting better ROI.
- User Retention: Irrelevant ads affect user retention on platform. By showing relevant ads, we are mitigating this.
- Better yield for platform: Budget distribution helps in maintaining healthy competition throughout the day, Ads with unusually low bids are not likely to deliver because there are other competing ads at all times. Hence it increases yield for the platform.
We’ll be writing more blogs in the near future focusing on other aspects of building a large-scale advertising platform. Stay tuned !!!