All writing
Monetization·10 min read·May 2026

How we lifted ROAS by 2x without a new ad network

What changed in our waterfall, what didn't, and the three knobs that mattered.

By Priya Natarajan

Tablet displaying a rising revenue line chart in sky blue

Every quarter we get the same question from publishers we onboard: which network should we add next? It feels like the obvious lever — more demand, more competition, higher prices. In practice, the teams that doubled their ROAS in 2026 almost never did it by adding networks. They did it by being honest about three things they had already shipped.

This is the playbook we now run with every new account in their first thirty days on Apps Kit SDK, written week by week so you can lift it directly into a sprint plan.

1. Floors that move with the user, not the placement

Static price floors are the single most common reason a waterfall underperforms. A floor of $4 eCPM might be perfect for a US iOS user on Wi-Fi watching a rewarded video at 8pm — and disastrous for the same placement on a Tier-3 Android device at 3am.

We replaced one floor per ad unit with a small matrix: country tier × format × daypart. Six values per ad unit, recomputed weekly from the previous fourteen days of bid data. The waterfall logic stays the same; only the floor input changes. Median lift in the first two weeks: 38% on rewarded, 22% on interstitial.

2. Cap the long tail of the waterfall

Most accounts we audit have between 18 and 40 line items per placement. Almost none of the bids below the top six ever win after floors are applied — they only add latency and timeout risk. We trim aggressively: top six bidders, two backfill networks, no exceptions.

Latency on the ad request drops from a typical 1.4s to under 800ms. That recovered time turns directly into impressions, because the user is still in the session when the ad renders.

3. Treat impression-per-DAU as the primary KPI

ROAS is a lagging metric. The leading metric — the one that moves first when something is wrong — is impressions per daily active user. If IPM drops 10%, ROAS will drop 8–12% the following week, every time.

We instrument it per cohort, per format, per app version. The dashboard surfaces deltas the moment they cross a 5% threshold. By the time finance sees the ROAS drop, our team has already pushed a remote config change.

The week-by-week timeline we actually ran

These three changes are simple in isolation. The order matters more than people expect — instrumentation has to come before any floor change or you cannot tell whether the change worked.

  • Week 1: ship impressions-per-DAU dashboards, per cohort and per format, with a 5% delta alert
  • Week 2: cap the waterfall to top six bidders plus two backfill networks, hold floors constant
  • Week 3: roll out the country × format × daypart floor matrix to one rewarded placement
  • Week 4: expand the matrix to interstitial, retire the last static floors, run the postmortem below

What we measured, and how

Three numbers told us whether each change worked. Impressions per DAU, segmented by app version and country, was the leading indicator — it moved within 24 hours of any floor change. ARPDAU at the cohort level, sliced by install week, told us whether the lift was real or a one-day artifact. Day 7 retained ARPDAU, the unsexy compound metric, told us whether we were borrowing revenue from next week.

Every change was gated on a holdout cohort, 10% of new installs, for at least seven days. The holdout is non-negotiable. Without it you cannot distinguish your floor change from a seasonal effect or a Meta campaign that happened to launch the same Tuesday.

The postmortem: one knob that backfired

We also tried a fourth knob in week two: aggressive bidder timeouts, pulled from 900ms down to 600ms. The theory was sound — faster auctions, more impressions per session. In practice we dropped two high-paying bidders' p95 below threshold and lost 11% of rewarded eCPM in three days.

The fix was per-bidder timeouts instead of a global one — we kept the 600ms cap for fast bidders and raised it to 1100ms for the two slow-but-valuable ones. ARPDAU recovered in 48 hours. Lesson: a single knob applied globally almost always breaks something. Per-segment versions of the same knob almost always work.

What did not move the needle

  • Adding a seventh ad network — diminishing returns set in fast
  • Header bidding for native units — the auction overhead ate the lift
  • Aggressive frequency caps below 3/session — recovery on Day 2 retention was negative
  • Switching mediation SDKs — six weeks of work for a 2% delta, not worth it for most teams
The teams that doubled ROAS were not the ones with the most networks. They were the ones who knew, hour by hour, what their users were worth.

What to do next

If you only do one thing this quarter, instrument impressions per DAU at the cohort level and tie it to a remote-config-driven floor matrix. The third lever — capping the waterfall — is two hours of work and pays for itself in latency alone. The fourth lever — per-bidder timeouts — is the difference between a 40% lift and a 100% lift, and we now ship it as a default for every new Apps Kit SDK account.