通过FCM HTTP协议发送的Web端推送通知点击量统计问询
嘿,这个问题问到点子上了——毕竟推送的点击数据是衡量用户互动效果的核心指标,我来给你把方案拆解明白:
能不能统计FCM Web推送的点击次数?
先给你一个明确的结论:FCM本身不直接提供Web推送点击的原生统计功能,但我们完全可以通过自定义逻辑实现精准的点击追踪,而且这套方案已经非常成熟可靠。
具体的点击事件分析方案
下面是一步步的落地思路:
1. 在Service Worker里捕获点击事件
当用户点击Web推送通知时,浏览器会触发notificationclick事件,我们需要在Service Worker中监听这个事件,进而完成数据上报。
给你一段实用的代码示例(直接放到你的Service Worker文件里就行):
self.addEventListener('notificationclick', (event) => { // 先关闭通知(可选操作,提升用户体验) event.notification.close(); // 组装点击事件的追踪数据,按需扩展字段 const clickTrackingData = { // 每个推送的唯一标识,用来关联具体推送内容 notificationId: event.notification.data?.notificationId || 'unknown', // 点击发生的时间戳 clickTimestamp: Date.now(), // 如果有用户标识,可以带上,方便做用户维度分析 userId: self.clients.matchAll().then(clients => { return clients[0]?.localStorage.getItem('userId') || 'anonymous'; }), // 推送跳转的目标URL targetUrl: event.notification.data?.clickUrl || '/' }; // 上报数据到你的后端接口,这里一定要加keepalive确保页面关闭也能上报成功 event.waitUntil( fetch('/api/track-push-click', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(clickTrackingData), keepalive: true }) ); // 打开推送对应的目标页面(如果业务需要的话) event.waitUntil( clients.openWindow(clickTrackingData.targetUrl) ); });
这里划个重点:keepalive: true非常关键,因为用户点击推送后可能直接关闭页面,这个属性能保证上报请求不会被浏览器中断。
2. 发送推送时携带自定义标识
通过FCM HTTP API发送推送时,一定要在data字段里带上自定义的唯一标识(比如notificationId),以及其他你需要的分析维度(比如推送分类、目标URL等),这样点击时才能准确追踪到是哪一条推送被触发了。
给你一个FCM请求的简化示例:
{ "to": "用户的FCM令牌", "notification": { "title": "你的订单已发货", "body": "点击查看物流详情" }, "data": { "notificationId": "push_order_20240520_001", "clickUrl": "/order/12345", "pushCategory": "order_notification" } }
3. 后端存储与分析落地
把前端上报的点击数据存储到你的数据库(比如Firestore、PostgreSQL都可以),之后就可以做各类分析:
- 统计不同推送内容的点击率(点击数/推送发送数)
- 按时间、用户群体、推送分类维度分析点击趋势
- 关联用户的其他行为数据,分析推送对后续转化的影响(比如点击推送后是否完成下单)
如果不想自己搭建后端,也可以直接上报到GA4这类分析工具,比如在notificationclick事件里调用GA的事件上报API:
// 假设Service Worker中已引入GA的相关脚本 gtag('event', 'push_notification_click', { 'notification_id': clickTrackingData.notificationId, 'push_category': clickTrackingData.pushCategory });
4. 几个关键注意事项
- 确保用户已经授予推送权限,否则
notificationclick事件根本不会触发 - 要处理上报失败的情况:比如把失败的请求暂存在IndexedDB里,等用户下次在线时重试
- 遵守隐私法规(比如GDPR),确保用户同意你收集这类追踪数据
内容的提问来源于stack exchange,提问作者Aditi Singh
相关产品推荐
相关产品推荐

