Balancing the Search Results Page
When search engines show more ads, they make more money, but users might find what they need less often. This tension creates a fundamental dilemma for digital platforms. How much commercial space can be added before the service becomes unusable? A new study from the University of Washington explores this trade-off and proposes a way to automate the decision.
The researchers report that increasing the number of sponsored slots can raise revenue by up to 43%. However, it simultaneously reduces total search conversions—the instances where a user successfully installs an app—by up to 5%. This creates a classic multi-objective optimization problem. Maximizing one metric inherently threatens another.
The Revenue-Conversion Trade-off
At its core, this research addresses "ad load design." This is a supply-side decision regarding how many sponsored slots to display on a search results page. In a sponsored search market, the platform acts as a mediator. It runs auctions to decide which advertisements appear above organic (unpaid) results.
Adding more ads expands the platform's monetizable inventory. This is much like adding more billboards to a highway. However, excessive ad exposure can "crowd out" organic results. This pushes relevant, unpaid content further down the page. This displacement can degrade the user experience. It can lead to lower engagement and fewer successful product discoveries. The authors argue that a single, platform-wide rule for ad density is inefficient. This is because the trade-off is not uniform across all searches.
The Heterogeneity of Intent
To understand why a universal rule fails, the authors conducted a 66-day randomized field experiment. The study took place on a major Android app store. They assigned over five million users to different regimes. These ranged from a single-ad layout to six sponsored slots. The study finds that the impact of adding ads depends heavily on "advertiser quality." This is defined by the advertising conversion rate (the likelihood that an ad leads to an install).
The researchers report a stark divergence in how different queries respond to increased ad load. In the "Low" segment, ads rarely lead to installs. Adding more slots in this segment failed to generate incremental revenue. In some cases, it actually reduced revenue. Conversely, in the "High" segment, extra slots unlocked substantial revenue gains .
This pattern is not just static. It shifts over time. The authors find that the presence of "brand" advertisers changes the landscape. These are companies searching for their own specific names, like "WhatsApp." Brand presence significantly alters the revenue-conversion frontier .
When a brand is active, the marginal benefit of an extra ad slot increases .
This suggests that an effective policy must be both query-sensitive and time-adaptive.
Deploying an Adaptive Engine
To solve this, the authors designed and deployed a novel algorithm. It is called exploration-augmented Locally Adaptive Ad Load (e-LAAL). Traditional "contextual bandits"—algorithms that learn to pick the best action based on current context—often struggle in search settings. This is because they assume the market is stable. In reality, advertiser budgets deplete and brands enter or exit the market.
The e-LAAL architecture splits traffic into two parts. First, it uses an "Adaptive Arm" for 90% of traffic. This runs a "Locally Adaptive Ad Load" (LAAL) rule. LAAL is a model-free, sliding-window policy. It looks only at recent outcomes for a specific query. It uses a 3-day window ($h=3$) to estimate current revenue and conversion potential. As seen in, the algorithm can pivot quickly.
It can switch from many ads to few ads if recent data shows a drop in conversion quality.
To manage the math, the algorithm uses a scalarization parameter ($\lambda \approx 0.01$). This parameter converts revenue into conversion-equivalent units. It allows the system to balance the two goals on a single scale.
Second, the system uses "Static Exploration Arms" for the remaining 10% of traffic. These are fixed-policy cohorts that always show a set number of ads. These serve as a permanent control group. They provide a continuous benchmark to measure the adaptive arm against.
In a 22-day production deployment serving 22.3 million users, the authors report significant gains. e-LAAL successfully shifted the "frontier" of what is possible. As shown in [Figure 8a], the algorithm achieves revenue levels comparable to a high-ad-load policy. It matches the revenue of a "five-ad" policy. Yet, it maintains conversion rates much closer to low-ad-load benchmarks. It does this by recommending an average of 3.1 ads per search [Figure 8b].
Rethinking Platform Supply
This work changes how we view the "supply" of attention in digital markets. It demonstrates that platforms can improve monetization without a proportional hit to user satisfaction. This is done by treating ad load as a dynamic variable rather than a fixed setting.
Specifically, the study proves that the optimal ad load is a moving target. The e-LAAL system reacts to recent local outcomes. It does not need to explicitly model every possible market variable. It simply responds to what is happening in the current window.
Limits of the Framework
While the results are significant, the authors note several boundaries. The 22-day deployment window may be too short. It might not capture the long-term "equilibrium" responses of advertisers. For example, advertisers might eventually adjust their bidding strategies. Additionally, the study focuses on short-term metrics. It tracks immediate installs and revenue. It does not directly observe long-run downstream effects. These include changes in a user's lifetime value or long-term platform retention.
Figures from the paper
How this was made
Model: nvidia/Gemma-4-26B-A4B-NVFP4
Persona: academic_accessible
Template: explainer
Refinement: 0
Pipeline: forge-1.1
Evaluator: nvidia/Gemma-4-26B-A4B-NVFP4
Score: 93% (passed)
Claims verified: 15 / 15
Model: nvidia/Gemma-4-26B-A4B-NVFP4
NVIDIA GB10 · 128 GB unified · NVFP4 · 100% local · $0 cloud
Tokens: 151,227
Wall-time: 300.2s
Tokens/s: 503.8