You open AdSense → Reports → Devices and see desktop fill rate at 92–98% but mobile sitting at 55–70%. Your traffic is 75% mobile, so the gap is destroying your effective RPM. Before you start “fixing” things, understand which part of the gap is structural (you can’t move it) and which part is configuration (you can). Most publishers spend hours tuning the structural part and ignore the configuration part.
Why the gap exists — three layers
Layer 1: Advertiser demand (structural, ~40% of the gap)
Desktop advertisers buy specific creative sizes — 728×90, 300×250, 970×250 — at scale. Mobile has fewer “standard” formats with the same depth of inventory. The 300×250 mobile slot has good demand; the 320×100 mobile leaderboard and the 320×50 banner do not. Vignette and anchor have decent fill but lower CPMs.
You can’t change this. But you can choose ad sizes that have more demand.
Layer 2: Viewability (configuration, ~30% of the gap)
AdSense’s bidding system penalizes low-viewability slots. A slot that’s only visible to 40% of users (because the user scrolls past too fast, or the slot is below the fold and the user bounces) gets fewer bids and lower CPMs, which reduces fill rate. Mobile pages are slower and have shorter sessions, so viewability is structurally lower.
You CAN improve this with page speed and slot positioning.
Layer 3: Geography (structural, ~20% of the gap)
Mobile-heavy regions skew toward developing economies with lower advertiser CPMs. India, Indonesia, Brazil, Nigeria — high mobile share, low CPM. If your traffic is concentrated in these regions, mobile fill will always be lower regardless of optimization.
Layer 4: Format mistakes (configuration, ~10% of the gap, fixable today)
This is the part most publishers can move quickly. Using desktop ad sizes on mobile, running vignette at high frequency, or leaving “side rail” on for mobile when no slot exists — all reduce fill needlessly.
How to identify which layer is hurting you
Open AdSense → Reports. Pull this table:
| Metric | Desktop | Mobile | Gap |
|---|---|---|---|
| Fill rate | |||
| Active View % | |||
| Average CPM | |||
| Top country % |
- If Active View % is the biggest mobile-vs-desktop gap: it’s a viewability problem. Fix page speed and slot position.
- If Average CPM is the biggest gap: it’s geography or ad-size mismatch. Check country breakdown.
- If Fill rate is the biggest gap but Active View % is fine: it’s ad-size or format mismatch. Audit your mobile slots.
Concrete fixes by layer
Fix viewability (highest leverage)
- Lighthouse mobile audit. LCP < 2.5s, CLS < 0.1, FID < 100ms. Each of these correlates with viewability.
- Reserve height on every mobile slot with CSS — prevents CLS, makes the slot visible before content shifts.
- First ad slot below first 200 words, not above the fold. Counter-intuitive but increases viewability because the user is more committed to the page by then.
- Lazy-load ads below the fold, but with a generous root margin (e.g., load when slot is 300px from viewport). Native lazy-loading is too aggressive.
Fix ad sizes
Use mobile-optimized sizes only:
- 300×250: best demand on mobile.
- 336×280: also good.
- 320×100: OK, less demand.
- Responsive
data-ad-format="auto": let AdSense pick. Usually picks 300×250. - Avoid: 728×90 forced on mobile (shrinks to unreadable), 970×250 (no mobile demand at all).
In your <ins> tags:
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-XXXX"
data-ad-slot="YYYY"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
Reduce format friction
In AdSense → your site → Edit:
- Anchor: cap at 1 per session, mobile only.
- Vignette: turn off entirely OR cap at 1 per 5 pageviews. High-friction format.
- Side rail: off for mobile.
- In-feed: only if you have an actual feed layout (article list with cards). Otherwise off.
Mobile RPM tracking (don’t over-react)
Mobile RPM fluctuates 15–30% week-to-week from seasonal advertiser demand, geographic traffic mix shifts, and AdSense auction changes. Don’t tune based on a 3-day dip. Use a 30-day rolling window. Only act when the 30-day average meaningfully changes.
Shortest path to higher mobile fill
In hit-rate order:
- Lighthouse mobile audit + fix top 2 issues. Typically LCP and CLS. Each 0.5s LCP improvement raises mobile RPM 5–15%.
- Switch all mobile slots to
data-ad-format="auto"withdata-full-width-responsive="true". Let AdSense pick the best size. - Disable vignette on mobile. Costs 5–10% in raw impressions but recovers 10–20% in fill rate from improved page metrics.
- Move the first ad below 200 words. Counter-intuitive viewability win.
- Wait 30 days, measure. No big new changes during the measurement window.
When this is genuinely not on you
A site whose traffic is 70%+ from low-CPM countries and 80%+ mobile is going to have a low absolute RPM no matter what. Tuning won’t change that. Diversify revenue instead — see ad blocker affecting RPM for the strategic framing.
Easy misjudgments
- “More mobile slots will compensate for low fill.” No — density penalty kicks in (see ad density violating policy), and more slots with low fill just spread the same total revenue thinner.
- “Mobile fill should match desktop.” It won’t — even with perfect optimization, expect ~10–15% gap remains. Aim to close 50% of the gap, not 100%.
- “Page speed doesn’t affect fill, only CPM.” Both. Page speed → viewability → bid eligibility → fill.
Prevention
- Design mobile-first. Plan ad slot positions, sizes, and reserved heights in your CSS from day one.
- Treat Core Web Vitals as a monetization KPI, not just an SEO one.
- Monitor mobile fill rate weekly, but only act on monthly trends.
- When testing a layout change, change one thing, measure for 14 days, decide.
FAQ
Q: Should I de-prioritize mobile ads? A: No. Mobile is where most of your traffic is. Lower fill on a big audience still beats higher fill on a small one.
Q: Will improving page speed really raise fill rate? A: Yes — viewability is an input to the bidder’s eligibility check. Faster pages → more viewable impressions → more bids → higher fill. Typical 0.5s LCP improvement = 5–15% mobile RPM uplift.
Q: Why is my mobile CPM lower even when fill is fine? A: Geography mix, or ad sizes with less advertiser demand, or running too many low-CPM formats (vignette, anchor) that drag the average down.
Q: Can I serve different ads to mobile vs desktop? A: AdSense decides which ad to serve per impression — you don’t control that directly. You can control which slots/formats are enabled per device in the AdSense console.
Q: My mobile fill dropped 20% in one week — what happened? A: Three common causes: an advertiser pulled budget mid-quarter, your Core Web Vitals regressed (check Search Console), or your traffic mix shifted to a lower-CPM country (check Analytics). Check all three before changing slots.
Related articles
- AdSense slow page
- Auto Ads appear in poor places
- Ad density violating policy
- Ad blocker affecting RPM
- AdSense payment threshold stuck
Tags: #AdSense #Monetization #Troubleshooting #Fill rate #Mobile vs web