更新时间:2026年8月13日
GA4只能自动记录用户进入网站后的行为。由于邮件打开没有点击链接时,网站上的GA4跟踪代码不会执行,所以GA4无法直接知道这封邮件是否被打开。
本文会说明如何使用GA4 Measurement Protocol和Cloudflare Worker实现邮件打开追踪,并解释它与邮件UTM、GA4会话及默认渠道组之间的区别。
什么是邮件打开追踪?
邮件打开追踪通常会在HTML邮件中嵌入一张不可见的1×1 Pixel图片,也称为Tracking Pixel。
<img src="https://example.com/pixel.gif" width="1" height="1" alt="">
邮件客户端或图片代理加载该图片时,会向图片地址发送请求。服务器收到请求后,即可将其记录为一次邮件打开。
需要注意:这记录的是图片请求,不一定等于收件人真实阅读邮件。Apple Mail Privacy Protection、Gmail图片代理及邮件安全扫描工具,都可能预先请求图片。
为什么使用GA4 Measurement Protocol?
浏览器中的GA4跟踪代码或GTM会向类似以下的地址发送请求:
https://www.google-analytics.com/g/collect
复制这类请求、再放进邮件图片URL,技术上可能让GA4收到数据,但不建议这样做。
原因是g/collect 属于GA4跟踪代码的浏览器传输机制,通常依赖浏览器Cookie、会话 ID、页面地址、Referrer与其他内部参数。邮件客户端并不是你的网站页面,不会运行gtag.js,也通常没有你网站的 _ga Cookie。
Measurement Protocol则是GA4官方提供的服务器端事件接口,用来发送服务器端和非标准网页互动事件,它作为事件记录,不会产生网站会话,也不会干扰原有的会话、参与度和渠道数据。
邮件打开跟踪的整体架构
Measurement Protocol需要由受控的服务端环境发送请求。这里使用Cloudflare Worker作为中间服务器:
具体流程如下:
- 在邮件 HTML 中加入透明的 1×1 Tracking Pixel;
- 邮件客户端或图片代理加载 Pixel;
- Cloudflare Worker 收到图片请求;
- Worker 读取请求中的邮件活动参数;
- Worker 将请求转换为 Measurement Protocol 格式,并发送
email_open到 GA4; - Worker 返回透明 GIF,完成图片加载。
注意:这个方案是无状态,也就是任何人知道你的请求,都可以请求它发送数据,解决方法是在Tracking Pixels上签名,密钥,Cloudflare Worker签名,密钥匹配到才发送。
实施步骤
步骤一:创建GA4 Measurement Protocol API Secret
在数据流页面中,点击「Measurement Protocol API 密钥」就可以看到管理界面:
点击右上角的“创建”就可以获得一个密钥值。
发送MP请求至少需要以下两个参数:
- 密钥值:hT8GXWTRSKS728kpUskKhQ
- 衡量ID:G-HZ4RDGTX66
步骤二:创建Cloudflare Worker与环境变量
在Cloudflare Dashboard中创建 Worker。
Cloudflare官方也建议使用Secret变量保存密码、API Key和其他敏感信息。
所以,在Cloudflare Worker 里点击「设置」——「添加变量」,新增以下两个值:
| 名称 | 类型 | 值 |
|---|---|---|
| GA_MEASUREMENT_ID | Variable | 你的 G-XXXXXXXXXX |
| GA_API_SECRET | Secret | 刚创建的 Measurement Protocol API Secret |
GA_API_SECRET必须选择 Secret,而不是普通 Variable。
创建Worker后,会有一个Worker地址为
https://ichdata-email-open-tracking.haran-huang.workers.dev
步骤三:写入Worker像素追踪代码
进入Edit code,粘贴以下代码:
代码的作用是向GA4发送email_open,返回透明 1×1 GIF,使邮件客户端能正常加载图片。
ctx.waitUntil() 会让 Worker 先尽快返回图片,再在后台完成向GA4发送事件的请求。
步骤四:在邮件HTML中加入 1×1 Pixel
Worker地址为:
https://ichdata-email-open-tracking.haran-huang.workers.dev
可以在邮件HTML底部加入:
<img style="display: block; width: 1px; height: 1px; border: 0; opacity: 0;" src="https://ichdata-email-open-tracking.haran-huang.workers.dev/?cid=815285605.1787152135&campaign_id=newsletter_20260821" alt="" width="1" height="1" />
如:
其中:
- cid:这是必要参数,建议使用真实的 client_id;如果获取不到真client_id,可以每位收件人生成不同的随机、伪匿名cid
- campaign_id:邮件活动标识,例如 newsletter_20260821
在HTML属性中,参数之间建议写成 &,而不是直接写 &。
步骤五:发送测试邮件并验证
先向自己的邮箱发送测试邮件,再打开邮件。
检查顺序:
- 确认邮件客户端没有显示破图
- 查看Cloudflare Worker Logs,确认Worker收到GET请求
- 在GA4中试试报告查看email_open事件是否出现
为什么email_open不会归为Email渠道?
GA4的默认渠道组主要基于网站会话的 source 和 medium 识别。
例如:utm_source=email和utm_medium=email,进入网站后,GA4 才会将该会话归为 Email。
而MP协议发送事件,实际是没有访问,所以默认是不会产生会话,也就不会归类为Email 渠道,实际上是划分到Unassigned。
如何用UTM追踪邮件点击后的Email会话?
邮件打开和邮件点击是两种不同动作。
邮件链接应另外加上 UTM:
https://www.ichdata.com/ga4-guide?utm_source=email&utm_medium=email&utm_campaign=newsletter_20260821
这样可以得到两类不同数据:
| 用户行为 | 追踪方式 | GA4 中的主要口径 |
| 打开邮件但未点击 | MP 协议 | email_open事件 |
| 点击邮件链接并进入网站 | UTM | Email 渠道会话、用户、转化 |
如何在GA4查看email_open?
可以先在GA4的事件报告查看:
如果需要按邮件活动拆分,应创建自定义维度去注册事件参数 email_campaign_id。

