Arte SheetsLearn. Try. Understand.

Digital Media & Programmatic Ad-Tech

Viewable vCPM, Publisher eCPM & Fill Rate Formula

Calculate programmatic Ad-Request Fill Rate, MRC Advertiser Viewable CPM (vCPM), Publisher Net Served eCPM, and Ad-Request Yield (rCPM) to optimize price floors without killing total revenue.

Avoid the programmatic price-floor trap: high served eCPM can hide collapsing request yield!

Programmatic ad-monetization teams routinely celebrate a spike in Net Served eCPM after raising SSP price floors — while total daily publisher revenue quietly drops! Why? Because Served eCPM = (Net_Publisher_Revenue / Served_Impressions) * 1,000 ignores unfilled ad requests! True inventory monetization is governed by Net Ad-Request Yield rCPM = (Net_Publisher_Revenue / Total_Ad_Requests) * 1,000 = Served_eCPM * Fill_Rate! Meanwhile, on the buy side under MRC viewability standards (>=50% of pixels in view for >=1 continuous second display or >=2 seconds video), advertisers pay Gross Served Spend across all served impressions but evaluate true media cost via Viewable CPM vCPM = (Gross_Spend / (Served_Impressions * Viewability_Rate)) * 1,000 = Gross_CPM / Viewability_Rate!

Verify on Ad_Requests = 1,250,000 (B2), Served_Impressions = 1,000,000 (B3 -> Fill Rate = 0.8000, or 80.00%), MRC_Viewable_Rate = 0.6250 (62.50% -> 625,000 viewable impressions, B4), Gross_Advertiser_Spend = $4,500 (B5 -> Gross CPM = $4.50), and SSP_Take_Rate = 0.20 (20.0% exchange fee, B6 -> Net Publisher Revenue = $3,600): Advertiser Viewable vCPM is ($4,500 / 625,000) * 1,000 = $7.20; Publisher Net Served eCPM is ($3,600 / 1,000,000) * 1,000 = $3.60; and Net Ad-Request rCPM is ($3,600 / 1,250,000) * 1,000 = $2.88! Now test an aggressive floor hike in cells B3 = 500,000 and B5 = 3,500: Served eCPM jumps +55.6% to $5.60, yet Fill Rate plunges to 40.0% and true Request rCPM drops -22.2% to $2.24!

Programmatic Yield Metric (1.25M Req, 1.0M Served, 62.5% View, $4.5k Gross, 20% Fee)FormulaVerified Output
Ad-Request Fill RateServed_Impressions / Ad_Requests0.8000 (80.00%)
Advertiser MRC Viewable CPM (vCPM)(Gross_Spend / (Served * View_Rate)) * 1000$7.20 / M viewable
Publisher Net Served eCPM(Gross_Spend * (1 - SSP_Fee) / Served) * 1000$3.60 / M served
Publisher Net Request Yield (rCPM)Served_eCPM * Fill_Rate$2.88 / M requests

Advertiser MRC Viewable CPM (vCPM) Formula

Validate Ad_Requests >= Served_Impressions > 0, 0 < Viewable_Rate <= 1, Gross_Spend >= 0, and 0 <= SSP_Fee < 1!

=LET(rq_ad, B2, im_sv, B3, vw_rt, B4, sp_gr, B5, fe_ss, B6, IF(OR(rq_ad <= 0, im_sv <= 0, im_sv > rq_ad, vw_rt <= 0, vw_rt > 1, sp_gr < 0, fe_ss < 0, fe_ss >= 1), "Invalid Ad-Server Input", ROUND((sp_gr / (im_sv * vw_rt)) * 1000, 2)))

Publisher Net Served eCPM vs Ad-Request Yield (rCPM) Formula

Always benchmark SSP floor A/B tests on rCPM (E5), never Served eCPM (E4) in isolation!

=IF(ISTEXT(E3), E3, ROUND((B5 * (1 - B6) / B2) * 1000, 2))

Try the example

Use the original values or change them to test your understanding.

Further reading