You launched a redesign on Monday. By Wednesday your AdSense dashboard shows page RPM has dropped from $8.40 to $3.10. Impressions per page is roughly flat, so this is not a traffic problem — it is a yield problem.
Fastest path to recovery: in AdSense go to Reports, set the date range to the 7 days before launch vs the 7 days after, and break down by Ad unit. Any unit whose impressions cratered is missing from the new template — port it back at the same on-page position first. That single step recovers the largest share of lost RPM in most post-redesign post-mortems. Then work down the list below.
The drop is almost always a combination of: ad units lost in the new template, viewability that regressed because slots moved below the fold (viewability and CPM are tightly correlated), responsive units that broke at a new breakpoint, or page-context signals that weakened when the template “cleaned up” titles and schema. The fix is not to “undo the redesign” — it is to walk the new template and confirm each slot is firing, visible, and at competitive sizes.
Note on AdSense changes as of June 2026: the legacy
enable_page_level_adspage-level-ads tag is deprecated (it was superseded by Auto ads back in 2016) — do not search for it as a diagnostic. Also, on April 16, 2026 Google removed the Auto ads “ad load” slider and replaced it with advanced settings for banner ads (Maximum number of ads,Minimum distance between ads,Find more ad placements on article pages). Steps below reflect the current console.
Common causes
Ranked by how often each shows up in real post-redesign post-mortems.
1. Manual ad units missing from the new template
The old template had 4 manual slots: header, in-article-1, in-article-2, sidebar. The new template has 2 (header and end-of-article). You did not realize the other two were AdSense slots, so they were never ported.
How to spot it: AdSense → Reports → Ad units. Compare impressions per ad unit Mon vs the prior week. Units that went to near zero are the ones missing from the new template.
2. Viewability dropped because slots are below the fold
In the old design, the in-article ad sat at paragraph 2. In the new design, the hero image takes 80% of the viewport and the first ad is at paragraph 5 — way below the fold. Below-fold viewability typically runs 30-40% vs 75-85% above the fold. Under the IAB/MRC standard a display ad counts as “viewable” only when at least 50% of its pixels are on-screen for at least one continuous second, so an ad the reader never scrolls to earns nothing. Viewability and CPM bids are tightly correlated; as a rough rule, lifting active-view viewability from ~40% to ~70% recovers on the order of 30% RPM.
How to spot it: AdSense → Reports, add the Active View viewable metric (or compute Viewable impressions / Total impressions × 100). If viewability fell below 50% when it was 70%+ pre-redesign, this is a real factor.
3. Responsive units broke at the new breakpoint
The old CSS had a sidebar at 1024px+. The new design’s sidebar appears only at 1280px+. AdSense’s responsive units negotiate size on first render, and they fall back to a small format when the container is unexpectedly narrow.
How to spot it: Inspect a desktop page at 1100px viewport. If the sidebar ad shows a 250x250 instead of a 300x600, the responsive unit picked the wrong size due to container width.
4. Page categorization signals weakened
You changed your <title> patterns, removed structured data, or shortened article content. AdSense uses page context to match advertisers. If the page now looks “thin” or off-topic, you get filler creatives at low CPMs.
How to spot it: AdSense → Reports → URLs with biggest RPM drop. Sort, open the top 5, and check that your new template still emits proper <title>, meta description, structured data, and at least 800 words of substantive content.
5. Lazy-load aggressiveness reduced impressions
Your old template loaded ads at section visibility (eager). The new one uses loading="lazy" everywhere. Lazy ads only fire when the user scrolls — so if the reader bounces before scrolling, the ad never serves. Impressions per pageview drop.
How to spot it: AdSense → Reports → Ad impressions / Page views ratio. If it dropped 20%+ alongside RPM, lazy-load is reducing your fill.
6. New layout removed cross-device rendering
You used display: none on mobile for some ad slots, intending to swap them for a mobile-only unit, but never set up that mobile-only unit. So mobile traffic — often 60-70% of total — sees fewer ads.
How to spot it: AdSense → Reports → break down by Device (or filter to Mobile). If mobile impressions per page dropped and desktop stayed flat, mobile slots are missing. See AdSense mobile vs desktop fill rate for the device-split debugging path.
7. Auto ads disabled inadvertently in the new theme
The new template’s <head> no longer loads the AdSense code (pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-...), or the Auto ads toggle in the AdSense console got turned off. Auto ads stop firing across the whole site even though hard-coded manual <ins> slots still work.
How to spot it: View source on a new page and confirm the adsbygoogle.js loader script is present. Then in AdSense go to Ads → click Edit next to your site and confirm the Auto ads toggle is ON. Do not look for enable_page_level_ads — that legacy tag is deprecated and is not how Auto ads are controlled anymore.
Which bucket are you in
Read one AdSense report row and you can usually point at the cause before touching code.
| What the report shows | Most likely cause | Jump to |
|---|---|---|
| Impressions per page fell sharply, RPM followed | Missing ad units (cause 1) or Auto ads off (cause 7) | Step 1, Step 2, Step 4 |
| Impressions roughly flat, RPM down, viewability down | Slots below the fold (cause 2) | Step 3 |
| One ad size now serves a smaller format on desktop | Responsive container too narrow (cause 3) | Step 5 |
| Impressions/pageview down but viewability fine | Over-aggressive lazy-load (cause 5) | Step 7 |
| Mobile impressions down, desktop flat | Mobile slots dropped (cause 6) | Step 2 |
| RPM down on specific URL groups, CPM low | Page-context / schema stripped (cause 4) | Step 6 |
Before you start
- Establish the baseline: compute prior 7-day average page RPM, impressions per page, and viewability before the redesign.
- Confirm the redesign is the cause — not a seasonal CPM dip or an algorithm change. Compare to the same period last year if you have data.
- Note the exact deploy timestamp of the redesign; AdSense reports are timezone-shifted.
- Have access to both the new and old template source (git history is fine).
Information to collect
- AdSense → Reports → Ad units, both 7-day windows: pre-redesign vs post-redesign.
- Same for: Country, Device, URL group, Ad size.
- View-source HTML of a representative new article page.
- View-source HTML of the same article from a cached / archived old version.
- DevTools network filter for
pagead2.googlesyndication.comrequests on a real article. - Sample CrUX field data for LCP/CLS before vs after.
Step-by-step fix
Walk top-down: confirm which causes apply, fix the biggest ones first.
Step 1: Diff the ad unit list
Export the AdSense ad-unit-level report for the last week pre-redesign and the first 7 days post-redesign:
# csv-diff for each ad unit
diff <(sort pre.csv) <(sort post.csv) | less
Any unit where post-impressions are less than 10% of pre-impressions is effectively missing from the new template. Capture its slot ID.
Step 2: Restore missing manual ad units
For each missing slot ID, place the unit back into the new template at an equivalent position. If the new template has no room, create a new ad unit in AdSense and replace:
<div class="ad-slot" style="min-height: 280px;">
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-XXXXXXXX"
data-ad-slot="NEW_SLOT_ID"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>
Match the position semantically: a deleted “after intro” slot should reappear after the intro in the new template, not at end-of-article.
Step 3: Re-validate above-the-fold placement
Open a representative article. Note where the first ad falls relative to viewport on a 1366x768 desktop and a 375x667 mobile. If the first ad is below the fold on either, move it up.
For mobile, a header banner directly under the page title is the highest-RPM placement that does not violate policy. Avoid placing it before any content (a prestitial), and keep total ad density at or under 30% of the main content area — the Coalition for Better Ads counts sticky and inline ads toward that 30% on mobile, and Google assesses the updated 2026 standards (which added more disallowed mobile experiences) no earlier than May 14, 2026. A large sticky ad that covers more than 30% of the screen also fails the standard.
Step 4: Re-enable Auto ads if it was inadvertently removed
First, confirm the AdSense loader is in your new template’s <head> on every page:
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXX" crossorigin="anonymous"></script>
This single snippet powers both Auto ads and your manual <ins> slots; there is no separate page-level-ads tag anymore. Then in AdSense go to Ads → click Edit next to your site, and confirm the Auto ads toggle is ON. The format toggles below it are Intent-driven formats, Overlay formats, and In-page formats.
If you run manual slots and want to limit double-placement, open advanced settings for banner ads (this replaced the old ad-load slider on April 16, 2026) and set Maximum number of ads and Minimum distance between ads to sensible values. Use Page exclusions and Excluded areas if Auto ads is injecting into spots you already hand-place. See Auto vs manual AdSense for the tradeoff.
Step 5: Fix responsive unit container widths
Audit your CSS at every breakpoint where ads render. The container width must match what AdSense expects:
@media (min-width: 1280px) {
.sidebar-ad-container { width: 300px; min-height: 600px; }
}
@media (min-width: 768px) and (max-width: 1279px) {
.sidebar-ad-container { width: 300px; min-height: 250px; }
}
@media (max-width: 767px) {
.sidebar-ad-container { width: 100%; max-width: 336px; min-height: 280px; }
}
Always reserve a container that supports the largest creative the unit can serve at that breakpoint. Per Google’s docs, a responsive <ins> inside a floating or zero-width parent cannot compute its size and will collapse, so every ad parent needs an explicit width via CSS media queries. Keep data-full-width-responsive="true" on mobile units (Google recommends it) so they expand to the full screen width instead of falling back to a small banner.
Step 6: Restore page-context signals
For every URL bucket showing RPM regression beyond 30%, audit the rendered HTML for:
<title>present, distinct, and matches the article topic<meta name="description">present and 120-160 chars<h1>matches the topic- Structured data (
Article,BreadcrumbList) still emits — test in Rich Results Test - Article body word count comparable to pre-redesign (use Wayback for a comparison snapshot)
A redesign that “cleaned up” boilerplate can accidentally strip schema and lose contextual targeting. Restore the schema. See thin pages AdSense review.
Step 7: Tune lazy-load eagerness
If you turned on loading="lazy" for all ads, restore eager loading for the first 1-2 slots (the ones likely to be in the initial viewport):
<!-- First ad: eager -->
<ins class="adsbygoogle" data-ad-slot="..." ...></ins>
<!-- Below-fold ads: lazy -->
<ins class="adsbygoogle" loading="lazy" data-ad-slot="..." ...></ins>
The first ad firing immediately recovers most of the lost impressions without re-introducing CWV problems.
Step 8: Set a 14-day watch and re-measure
After fixes deploy, AdSense’s auction system needs 7-14 days to recalibrate bids on the new layout. Do not panic-tweak in the first 5 days. Measure on day 14 vs the pre-redesign baseline.
Verify
- Page RPM recovered to within 15% of pre-redesign baseline by day 14.
- Impressions per page back to within 10% of baseline.
- Viewability score above 60% (preferably above 70%).
- All ad units that were live pre-redesign are serving at least 30% of their previous daily impressions.
- No new AdSense policy violations appear in the dashboard.
Long-term prevention
- Before any redesign launch, dump the full ad-unit inventory and stick it on the migration checklist as “must port.”
- Run side-by-side A/B testing for at least 7 days before full cutover; compare RPM head-to-head.
- Annotate every redesign in your analytics with a clear date marker so future post-mortems are easy.
- Lock down a “minimum acceptable RPM” SLA; if redesign drops below it for 14 days, roll back.
- Preserve structured data and meta tags in any template migration; treat them as load-bearing for monetization, not just SEO.
- Keep an archive of the previous template (git tag) so you can diff side-by-side if questions arise.
For the current Auto ads controls and the post-April-2026 banner settings, see Google’s About Auto ads help page; for placement compliance, the Coalition for Better Ads standards define the 30%-density and sticky-ad limits.
Common pitfalls
- Comparing day 1 post-launch to the prior week — AdSense bid recalibration takes 7-14 days, so day-1 numbers are not representative.
- Assuming “RPM dropped” without checking impressions — if impressions dropped 50% the issue is missing units, not bid CPM.
- Disabling Auto ads and forgetting to add manual replacements at the equivalent positions.
- Searching the new template for
enable_page_level_adsto “check Auto ads” — that tag is deprecated; verify theadsbygoogle.jsloader and the console toggle instead. - Adding
loading="lazy"to every slot including the hero ad, then wondering why impressions fell. - Stripping schema in the name of “performance” — context signals matter more than 50ms of LCP.
- Tweaking the layout daily during the 14-day watch window, making it impossible to isolate which change moved RPM.
FAQ
Q: RPM dropped 60% — can I just roll back the redesign?
You can, but identify the root cause first. If it is one missing ad unit, port it forward into the new template instead of reverting 100 unrelated improvements. Roll back only if the broken pieces cannot be diagnosed within 48 hours.
Q: Should I expect ANY RPM drop after a redesign?
A 5-10% short-term dip is normal as AdSense’s auction recalibrates to the new layout. Beyond 15%, something is broken. See adsense ads not showing for the simpler “no ads at all” case.
Q: My viewability went from 70% to 45% — is that the main cause?
Probably, yes. Viewability directly affects CPM bids (a 40%-to-70% recovery is worth roughly 30% RPM as a rule of thumb). Move the first slot above the fold, keep slot height under ~280px so it fits the viewport more often, and re-measure after 14 days. Remember the IAB/MRC bar: 50% of pixels on-screen for 1 continuous second counts as one viewable impression.
Q: Where do I turn Auto ads back on and stop it overlapping my manual slots?
AdSense → Ads → Edit next to your site, flip the Auto ads toggle ON, then use advanced settings for banner ads (Maximum number of ads, Minimum distance between ads) plus Excluded areas to keep it from doubling up on positions you hand-place. The old “ad load” slider was removed on April 16, 2026.
Q: Does Google penalize me for under-monetized pages?
No, but a redesign that strips structured data or content depth can trigger a “Low value content” flag, which IS a penalty signal. Check AdSense Policy Center 30 days after launch. See adsense low value content.
Q: Can I run the old layout and new layout side by side as an A/B test?
Yes — most CDN-level A/B tools (Cloudflare Workers, Vercel Edge Middleware) support this. Send 50% of traffic to each and measure RPM by variant for 14 days. Make sure both variants emit identical ad slot IDs so the AdSense report buckets are comparable.
Tags: #AdSense #Monetization #rpm #redesign #Troubleshooting