如何衡量添加到主屏幕转化:追踪 PWA 安装(Add to Home Screen,2026)
想准确衡量"添加到主屏幕"转化(Add to Home Screen Conversions),只数安装提示弹了多少次是不够的。PWA 安装发生在浏览器里,有时完全不经过你自己的界面,而在 iOS 上更是一个事件都不会触发。本文讲清楚怎么在 Android 和 iOS 上追踪 PWA 安装、哪些信号可信,以及怎么把安装归回到带来它的广告系列。
什么算一次"添加到主屏幕"转化
"安装"其实涵盖了好几个不同的时刻,把它们混在一起,是 PWA 安装数据看起来不对的最常见原因。请把漏斗的每一步分开定义:
|
漏斗步骤 |
含义 |
怎么观测 |
|---|---|---|
|
可安装 |
浏览器认为该应用可以安装 |
触发 |
|
提示已展示 |
你的界面或浏览器弹出了安装对话框 |
调用 |
|
提示被接受 |
用户在对话框里点了"安装" |
|
|
已安装 |
应用已添加到设备 |
|
|
首次独立模式启动 |
用户从主屏幕打开了应用 |
加载时 |
|
活跃安装用户 |
用户持续通过已安装的应用回访 |
重复的独立模式会话 |
对大多数投放来说,真正重要的转化不是"提示被接受",而是安装之后真的在用。一个从来没被打开过的主屏幕图标,没有任何价值。
如果想先回顾安装提示本身在各平台上怎么工作,可以看我们的添加到主屏幕提示指南。
在 Android(Chromium 内核浏览器)上追踪 PWA 安装
Chrome、Edge、三星浏览器等 Chromium 内核浏览器提供三个有用的信号。
1. 可安装。 监听 beforeinstallprompt,保存事件对象,并记录访客处于可安装状态。这就是安装率的分母。
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault();
deferredPrompt = e;
track('pwa_install_eligible');
});2. 提示结果。 用户点击你的安装按钮时,调用 prompt() 并读取 userChoice。
installButton.addEventListener('click', async () => {
track('pwa_install_prompt_shown');
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
track('pwa_install_prompt_' + outcome); // accepted 或 dismissed
deferredPrompt = null;
});3. 安装完成。 监听 appinstalled。用户通过浏览器菜单(而不是你的按钮)安装时它同样会触发,所以安装数应以它为准,而不是以"提示被接受"为准。
window.addEventListener('appinstalled', () => {
track('pwa_installed');
});在 iOS 上追踪 PWA 安装
iOS 上的 Safari 没有 beforeinstallprompt,也没有 appinstalled。用户通过"分享"菜单添加应用,页面不会收到任何通知。实际可行的做法有两个:
- 统计首次独立模式启动。 应用从主屏幕打开时会以独立模式运行。在加载时检查,并为每台设备记录第一次。
const isStandalone =
window.matchMedia('(display-mode: standalone)').matches ||
window.navigator.standalone === true; // iOS Safari
if (isStandalone && !localStorage.getItem('pwa_first_launch')) {
localStorage.setItem('pwa_first_launch', Date.now());
track('pwa_first_standalone_launch');
}- 通过 manifest 给启动打标。 在 Web 应用清单的
start_url里加一个参数,比如?source=homescreen,这样每一次从主屏幕的启动都能在分析工具里识别出来,而不只是第一次。
因此在 iOS 上,"已安装"的含义是"至少从主屏幕打开过一次"。装了却从没打开过的安装是看不见的。iOS 请按这个定义单独报告,不要和 Android 的 appinstalled 数混在一起。
同时要确认清单本身有效——不满足可安装条件的应用,在 Chromium 上永远不会进入"可安装"状态。浏览器会检查哪些字段,见我们的 PWA Manifest 必填字段指南。
把安装事件作为关键事件发送到 GA4
任何分析工具都可以,用 GA4 的话配置很简短:
- 用
gtag('event', 'pwa_installed', {...})或通过 Google Tag Manager 发送漏斗事件,各平台使用一致的事件名。 - 在 GA4 中把
pwa_installed(Android)和pwa_first_standalone_launch(全平台)标记为关键事件,这样就能在报告中查看,并在需要时导入 Google Ads 作为转化。 - 增加一个"显示模式"自定义维度(
browser或standalone),随每次页面浏览一起发送。这样就能对比已安装用户和浏览器用户的互动与购买——这通常是支撑 PWA 投入最有说服力的数字。
把安装和带来它的广告系列关联起来
只有知道是哪条广告、哪个广告系列或哪条链接带来的,安装事件才能用于优化。
- 落地时记录首次触达参数。 访客落地时,把 UTM 参数和点击 ID(如
gclid、fbclid、ttclid)保存在第一方存储里,之后发送安装事件时一并附上。 - 搞清楚存储在哪里是共享的。 在 Android 上,已安装的 PWA 通常和浏览器使用同一个源的存储,安装前保存的值安装后仍可读取。在 iOS 上,主屏幕 Web 应用不与 Safari 共享 Cookie 和存储,安装前在 Safari 里保存的值,在已安装的应用里是看不到的。
- 尽量使用服务端身份。 如果用户在安装前注册或登录,就把归因信息挂到服务端的账户上。这样可以绕开存储边界,也便于通过服务端接口把转化回传给广告平台。
- 每次安装只计一次。
appinstalled可能与"提示被接受"同时发生,清除存储后首次启动逻辑也可能重复触发。向广告平台回传转化前,请用设备或用户标识在自己这边去重。
基准与数据解读
安装率因受众、流量来源和提示的呈现方式而差异很大,外部基准参考价值有限。更好的做法是长期跟踪自己的漏斗:
- 可安装 → 提示已展示: 说明你的安装界面是否真的触达了用户。
- 提示已展示 → 已安装: 反映安装提示的价值主张和时机。
- 已安装 → 首次启动 → 7 日回访: 说明安装是否转化成了真实使用。
调整安装界面或提示时机时,请对比这些比率的前后变化,而不是看安装总数——总数也会随流量波动。安装步骤周边的页面结构如何影响这些比率,见我们的 PWA 落地页指南。
常见问题
能在 iOS 上检测到 PWA 安装吗?
不能直接检测。iOS 上的 Safari 不会触发 beforeinstallprompt 或 appinstalled。可靠的信号是首次以独立模式启动,所以 iOS 的安装按"至少从主屏幕打开过一次"来衡量。
转化应该算"提示被接受"还是"appinstalled"?
在 Chromium 内核浏览器上用 appinstalled。它也能捕获从浏览器菜单发起的安装,并确认安装真正完成;而"接受"只记录了用户在你的对话框里的选择。
怎么判断一次会话来自已安装的应用?
在加载时检查 window.matchMedia('(display-mode: standalone)').matches(iOS Safari 上再加 navigator.standalone),或者在 manifest 的 start_url 里加来源参数。把结果作为自定义维度随每次页面浏览发送。
安装事件能作为 Google Ads 或 Meta 的转化吗?
可以,作为网站转化事件使用。通过平台的代码或服务端接口发送,做好去重,并尽可能带上原始点击 ID,让转化归到正确的广告系列。
一句话总结
衡量"添加到主屏幕"转化,要把可安装、提示、安装和首次启动分开。Android 上统计 appinstalled,iOS 上统计首次独立模式启动;通过 manifest 给启动打标,落地时记录广告参数,能放服务端就放服务端,并以"安装后持续回访的用户"来判断成效。ROIBest 为运行 PWA 投放的团队提供这类安装漏斗相关的支持。


