◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Expo SDK 58 is out of beta as of 10/15 (beta since 09/15). Check your dependencies before upgrading●SDK 58 ISSUE — Early reports include Android widgets not refreshing on a schedule and Stripe linking statically●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Expo SDK 58 is out of beta as of 10/15 (beta since 09/15). Check your dependencies before upgrading●SDK 58 ISSUE — Early reports include Android widgets not refreshing on a schedule and Stripe linking statically●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Business
⟐ Business/2026-09-06Advanced

Your Blended eCPM Dropped and Revenue Went Up: Splitting the Change Into Country Mix and Rate

Blended eCPM is a weighted average, not a price. Here is how I split a month-over-month change into a country-mix effect and a rate effect that reconcile exactly to the total, plus what to check before you cut a low-eCPM country.

AdMob73eCPM5Revenue AnalysisIndie Development29Rork594

✦ Premium Article

One morning I opened the dashboard and the number at the top was lower than the month before. Blended eCPM had fallen by about a quarter.

I went straight to the country report and sorted by unit price, ascending. I was looking for countries to cut. Two candidates showed up within a couple of minutes.

Then I noticed that the estimated payout further down the same screen was higher than the previous month.

The average was down and the money was up. One of the two had to be wrong, so I spent two days pulling the report apart. What was wrong turned out to be the way I was reading it.

Blended eCPM is a weighted average, not a price

The blended eCPM in the AdMob console is revenue divided by impressions, times 1,000. Written out, it is each country's eCPM weighted by that country's share of impressions.

Which means it moves for two entirely separate reasons.

  1. Unit prices themselves changed (rate effect)
  2. Impression shares shifted between countries (mix effect)

The awkward part is that the second one alone can move the average a long way. If impressions grow in a low-price country, blended eCPM falls even when not a single country's price has changed. And because impressions grew, revenue rises.

I was sorting as if I were looking at the first case. What had actually happened was the second. Running a few apps in parallel as an indie developer, I hit this mix-up roughly once a season, because the countries where organic installs grow fastest tend to be the low-price ones.

A unit price is a number for comparing, not a number for deciding what to switch off. Open a country report without that line drawn and you walk straight toward the decision that shrinks revenue.

Splitting the change with no residual

There are several ways to do factor decomposition. For something I run every month, my requirement is that the two effects add up to the total change exactly. A decomposition that leaves a residual stops being trusted by the second month.

The simplest form that satisfies this uses symmetric averages. With r as a country's eCPM, w as its impression share, 0 for the prior period and 1 for the current one:

EffectFormulaHow to read it
RateΣ (r1 − r0) × (w0 + w1) / 2How far the average would have moved on price changes alone, had the mix held still
MixΣ (w1 − w0) × (r0 + r1) / 2How far the average would have moved on share changes alone, had prices held still

Add the two and you get the change in blended eCPM exactly. The interaction term is split evenly between the two sides rather than being shoved into one of them.

The one case you have to decide on is a country that exists in only one of the periods. A newly served country has no prior price. Treating its price as unchanged and pushing its entire contribution into the mix side is what matches reality: the average moved because impressions appeared there, not because a price changed.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦You will be able to tell whether a move in blended eCPM came from your country mix or from actual unit prices, using nothing but the country report you already have
✦Before you cut traffic from a low-eCPM country, you will be able to check in a few minutes whether that country is merely dragging the average down or genuinely carrying revenue
✦You will have a 60-line script that decomposes a country CSV into mix and rate contributions and reconciles exactly to the total change, ready to drop into your monthly routine
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⟐ Business2026-05-21
Putting AdMob Bidding into Production for a Rork App — Five Networks Bidding in Parallel, eCPM Trends, and Daily Operations
I moved the AdMob mediation layer of my Rork-generated apps from waterfall to bidding, with five ad networks bidding in parallel. Here are my real-world numbers after three weeks of production, the SDK pitfalls, and how I delegate daily monitoring to Claude in Chrome.
⟐ Business2026-10-19
Before You Add Payments to Your App: Deciding What to Publish for Japan's Commercial Transactions Disclosure
Selling to users in Japan can require a disclosure page under the Act on Specified Commercial Transactions, even for individuals. Compare three ways to handle your address and phone number, and the order I decide things in.
⟐ Business2026-10-16
Your First Year With Rork: The Order Your Bills Actually Arrive In
Starting on Rork's free tier doesn't mean the only money moving is Rork's. I lined up the official pricing pages for Rork Pro, Apple, Google Play, EAS and Supabase to show what gets billed when in year one, and what simply stops working instead.