改版之后 AdSense RPM 暴跌 —— 排查与修复

新模板上线之后页面 RPM 掉了 30-60%。通常是广告位丢失、可见度回退、新版面把广告挤到首屏外的组合问题。按 URL 分组诊断。

周一上线了新设计。到周三 AdSense 后台显示页面 RPM 从 $8.40 跌到 $3.10。每页展示数大致没变,所以不是流量问题——是产出问题。几乎可以肯定是几样问题叠加在一起:新模板把一些广告位丢了、广告位被挤到首屏以下导致可见度回退、新版面把响应式广告在移动端搞坏了,或者某个被遗忘的手动广告位还指着一个新模板里根本不渲染的 slot ID。解决思路不是”把改版回滚”,而是把新模板每一个广告位逐个走一遍,确认它在投放、在可见、并且尺寸有竞争力。

常见原因

按真实改版复盘中出现的频率排序。

1. 手动广告位在新模板里漏掉了

老模板有 4 个手动广告位:页头、正文-1、正文-2、侧栏。新模板只剩 2 个(页头、文末)。你没意识到那两个是 AdSense 广告位,所以没把它们迁过去。

怎么判断:AdSense → 报告 → 广告单元。对比周一与上周同一天每个单元的展示量。展示量掉到接近 0 的那些,就是新模板里漏掉的。

2. 可见度下降,因为广告位被推到首屏以下

老设计的正文内广告在第 2 段。新设计的英雄图占了 80% 视口高度,第一个广告挪到第 5 段——远在首屏以下。首屏以下可见度通常 30-40%,首屏以上 75-85%。可见度低 → 出价低。

怎么判断:AdSense → 报告 → 可见展示 / 展示 × 100。从 70%+ 掉到 50% 以下,这条原因就成立。

3. 新断点下响应式广告挑错了尺寸

老 CSS 在 1024px+ 显示侧栏。新设计的侧栏只在 1280px+ 出现。AdSense 的响应式广告在首次渲染时协商尺寸,容器意外变窄时会回落到更小的格式。

怎么判断:把桌面页面缩到 1100px 宽看。如果侧栏广告展示的是 250x250 而不是 300x600,响应式单元因为容器宽度选错了尺寸。

4. 页面上下文信号变弱

你换了 <title> 模板、移除了结构化数据,或者缩短了文章内容。AdSense 靠页面上下文匹配广告主。如果页面现在看起来”瘦”或者跑题,你拿到的就是低 CPM 的填充创意。

怎么判断:AdSense → 报告 → RPM 跌幅最大的 URL 列表。排序,打开前 5,确认新模板里仍然在输出正确的 <title>meta description、结构化数据,以及至少 800 字的有效内容。

5. 懒加载太激进,展示量下来了

老模板按区块可见性加载广告(eager)。新模板全开 loading="lazy"。懒加载广告只在用户滚动时触发——读者还没滚就跳走,广告就根本没投。每次浏览的广告展示数下来了。

怎么判断:AdSense → 报告 → 广告展示 / 页面浏览 比例。如果它和 RPM 一起掉了 20%+,就是懒加载在压填充率。

6. 新版面把跨设备渲染搞掉了

某些广告位你在移动端用 display: none,想换成移动端专属单元,但移动单元从来没真正配上。结果移动流量(经常是总流量的 60-70%)看到的广告反而少了。

怎么判断:AdSense → 报告 → 按设备筛选。移动端每页展示数掉了,桌面端不变,就是移动端广告位漏了。

7. 新主题里 Auto Ads 被无意中关掉

新模板 <head> 里没有 AdSense Auto Ads 那段标签(enable_page_level_ads: true)。Auto Ads 在全站停了,但手动广告位还在工作。

怎么判断:在新页面 view-source。搜 enable_page_level_ads。没找到就是 Auto Ads 关了。跟老模板归档对比同一关键字。

开始前先确认

  • 建立基线:计算改版前 7 天的平均页面 RPM、每页展示数、可见度。
  • 确认改版是真正的原因——不是季节性 CPM 回落或算法变更。有历史数据的话跟去年同期对比。
  • 记下改版部署的准确时间戳;AdSense 报告是按时区偏移的。
  • 同时能拿到新旧模板源码(git 历史就行)。

需要收集的信息

  • AdSense → 报告 → 广告单元 两个 7 天窗口:改版前 vs 改版后。
  • 同样筛 国家、设备、URL 分组、广告尺寸。
  • 一篇代表性新文章页面的 view-source HTML。
  • 同一篇文章在缓存 / 归档版本中的 view-source HTML。
  • DevTools 网络面板筛 pagead2.googlesyndication.com 的请求情况。
  • 改版前后的 CrUX LCP/CLS 现场数据样本。

一步步修复

自顶向下:先确认哪些原因成立,从影响最大的开始改。

第 1 步:diff 广告单元清单

按广告单元粒度导出 AdSense 报告,分别是改版前 7 天和改版后 7 天:

# 对每个广告单元做 csv-diff
diff <(sort pre.csv) <(sort post.csv) | less

后期展示量不到改版前 10% 的单元,基本就是新模板里漏掉的。把它们的 slot ID 记下来。

第 2 步:把漏掉的手动广告位补回来

对每一个漏掉的 slot ID,在新模板里等价位置放回去。如果新模板真的没地方,就在 AdSense 里建一个新广告单元替换:

<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>

位置要语义对应:被删掉的”导语后”广告位,应该在新模板里也出现在导语之后,而不是文末。

第 3 步:重新核对首屏可见位置

打开一篇代表性文章。看在 1366x768 桌面和 375x667 移动上,第一个广告相对视口的位置。任一设备上落到首屏以下,就把它往上挪。

移动端,标题正下方的页头横幅是 RPM 最高、又不违反政策的位置。别放在正文之前——那违反 Better Ads Standards。

第 4 步:Auto Ads 被无意关掉的话,重新打开

在新模板 <head> 里:

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXX" crossorigin="anonymous"></script>

然后在 AdSense → 广告 → 按网站 → 你的域名 → 编辑,确认 Auto Ads 开关是 ON。注意:已经有手动广告位的话,把 Auto Ads 密度调到 Low 或 Medium,避免双重投放。两者权衡见 Auto vs 手动 AdSense

第 5 步:修正响应式广告容器宽度

每个会渲染广告的断点都要审一下 CSS。容器宽度要跟 AdSense 期望的对上:

@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; }
}

每个断点下都给容器预留足够装下该断点最大可能创意的尺寸。

第 6 步:恢复页面上下文信号

对每一个 RPM 跌幅超过 30% 的 URL 段位,审一下渲染后 HTML:

  • <title> 存在、有区分度、与文章主题匹配
  • <meta name="description"> 存在,120-160 字符
  • <h1> 跟主题匹配
  • 结构化数据(ArticleBreadcrumbList)还在输出——用 Rich Results Test 验
  • 正文字数跟改版前差不多(用 Wayback 取改版前快照对比)

“清理样板”的改版会无意删掉 schema,丢失上下文定向。把 schema 加回来。见 瘦内容页 AdSense 审核

第 7 步:调整懒加载激进程度

如果你给所有广告都加了 loading="lazy",把前 1-2 个广告(大概率在初始视口里)改回 eager:

<!-- 第一个广告: eager -->
<ins class="adsbygoogle" data-ad-slot="..." ...></ins>

<!-- 首屏以下的广告: lazy -->
<ins class="adsbygoogle" loading="lazy" data-ad-slot="..." ...></ins>

第一个广告立即触发,能把丢失的展示数找回来大部分,同时不会重新引入 CWV 问题。

第 8 步:设一个 14 天观察期再回看

修复部署完之后,AdSense 的竞价系统需要 7-14 天对新版面重新校准出价。前 5 天别恐慌式微调。在第 14 天对比改版前基线。

验证

  • 第 14 天页面 RPM 恢复到改版前基线的 ±15% 以内。
  • 每页展示数回到基线 ±10% 以内。
  • 可见度分数高于 60%(理想是 70% 以上)。
  • 改版前所有在投的广告单元,现在每天至少有改版前 30% 的展示量。
  • 后台没有新的 AdSense 政策违规出现。

长期防止

  • 任何改版上线前,先把当前广告单元清单导出来,放进迁移 checklist 作为”必须迁移”项。
  • 全量切换前做至少 7 天的并排 A/B,直接对比 RPM。
  • 在分析工具里给每一次改版打清晰的日期标签,以便未来复盘方便。
  • 锁一个”最低可接受 RPM” SLA;改版后 14 天还低于这条线,就回滚。
  • 任何模板迁移都要保留结构化数据和 meta 标签,把它们当作变现的承重墙,而不只是 SEO。
  • 把旧模板归档(git tag),需要的时候可以并排 diff。

常见坑

  • 拿改版后第 1 天对比改版前一周——AdSense 的竞价校准要 7-14 天,第 1 天数据不代表稳态。
  • 没看展示数就断言”RPM 跌了”——展示数掉了 50% 说明问题在广告位丢失,不是出价 CPM。
  • 关了 Auto Ads 又忘了在等价位置补手动单元。
  • 给所有广告位包括英雄位都加 loading="lazy",然后想不通为什么展示量掉。
  • 以”性能”为名删 schema——上下文信号比 50ms 的 LCP 重要得多。
  • 在 14 天观察期里每天调版面,根本没法定位是哪一项改动让 RPM 动起来。

FAQ

Q:RPM 掉了 60%,我能不能直接回滚改版?

可以,但先把根本原因找出来。如果只是一个广告位漏了,把它补到新模板里就行,不必撤掉其他 100 条无关的改进。只有 48 小时内无法定位坏掉的部件,才考虑回滚。

Q:改版后是不是必然会有 RPM 下跌?

短期下跌 5-10% 正常,这是 AdSense 竞价系统适应新版面的过程。超过 15% 就一定是哪里坏了。如果是”完全没广告”的更严重情形,见 AdSense 广告不显示

Q:可见度从 70% 掉到 45%,这是主要原因吗?

大概率是。可见度直接影响 CPM 出价。把广告位往上挪、把广告位高度控制在 280px 以下让它更容易留在视口里,14 天后再测一次。

Q:Google 会不会因为我”变现不足”惩罚我?

不会,但删 schema 或缩短内容的改版可能触发”低价值内容”标记,那才是真的处罚信号。改版后 30 天去 AdSense 政策中心确认一下。见 AdSense 低价值内容

Q:能不能把新旧版面并排做 A/B 测试?

可以——大多数 CDN 层 A/B 工具(Cloudflare Workers、Vercel Edge Middleware)都支持。各发 50% 流量,按变体测 14 天 RPM。注意两个变体输出相同的广告 slot ID,这样 AdSense 报告里桶能直接对比。

标签: #AdSense #变现 #rpm #redesign #排查