GA4只能自動記錄使用者進入網站後的行為。由於郵件開啟時若沒有點擊連結,網站上的GA4追蹤碼就不會執行,因此GA4無法直接得知這封郵件是否已被開啟。
本文將說明如何運用GA4 Measurement Protocol搭配Cloudflare Worker 實作郵件開啟追蹤,並釐清它與郵件UTM、GA4工作階段及預設管道群組之間的差異。
什麼是郵件開啟追蹤?
郵件開啟追蹤(Email Open Tracking)通常會在HTML郵件中嵌入一張不可見的1×1像素圖片,也稱為追蹤像素(Tracking Pixel)。
<img src="https://example.com/pixel.gif" width="1" height="1" alt="">
當郵件用戶端或圖片代理伺服器載入該圖片時,會向圖片網址發送請求。伺服器收到請求後,即可將其記錄為一次郵件開啟。
需特別留意:此方式記錄的是圖片請求,不一定等同於收件人確實閱讀郵件。Apple郵件隱私保護(Mail Privacy Protection)、Gmail 圖片代理及郵件安全掃描工具,都可能預先請求圖片,導致開啟數據被高估。
為什麼要使用GA4 Measurement Protocol?
瀏覽器中的GA4追蹤碼會向以下的網址發送請求:
https://www.google-analytics.com/g/collect
理論上,複製這類請求並放進郵件圖片網址,技術上可能讓GA4收到資料,但不建議這樣做。
原因在於 g/collect屬於GA4追蹤碼的瀏覽器傳輸機制,通常依賴瀏覽器Cookie、工作階段 ID、頁面網址、參照網址(Referrer)及其他內部參數。郵件用戶端並非你的網站頁面,不會執行 gtag.js,也通常沒有您網站的 _ga Cookie。
而Measurement Protocol則是GA4官方提供的API,專門用來發送伺服器端及非標準網頁互動事件。它作為事件記錄,不會產生網站工作階段,也不會干擾原有的工作階段。
郵件開啟追蹤的整體架構
Measurement Protocol需要由受控的伺服器端環境發送請求。本文採用Cloudflare Worker作為中介伺服器。
具體流程如下:
- 在郵件HTML中加入透明的1×1追蹤像素;
- 郵件用戶端或圖片代理載入該像素;
- Cloudflare Worker收到圖片請求;
- Cloudflare Worker讀取請求中的郵件活動參數;
- Cloudflare Worker將請求轉換為Measurement Protocol格式,並發送email_open事件至GA4;
- Cloudflare Worker回傳透明GIF,完成圖片載入。
⚠️ 安全性提醒:此方案為無狀態設計,理論上任何人只要知道你的Worker網址與參數格式,都可以發送請求。建議的因應方式是在追蹤像素網址中加入簽章(signature)或金鑰驗證機制,確保只有Cloudflare Worker驗證通過的請求才會發送資料。
實作步驟
步驟一:建立GA4Measurement Protocol API密鑰
在GA4中点击「管理」——「資源設定」——「資料收集和修改」——「資料串流」—— 點擊你的網頁串流 ——「Measurement Protocol API 密鑰」——「建立」,暱稱命名為“EDM Tracking”:
![]()
完成後即可獲得:
- 密鑰值:kzHJFDslRO2Ry-eiayrCYA
- 評估ID:G-3FK847CLRT (在GA4使用者介面中找到: 管理 > 資料串流 | 選擇串流 > 評估 ID)
步驟二:建立Cloudflare Worker與環境變數
在Cloudflare Dashboard中建立 Worker。
Cloudflare官方建議使用Secret變數來儲存密碼、API Key及其他敏感資訊。
因此,在Cloudflare Worker中點擊「設定」→「新增變數」,加入以下兩個值:
| 名稱 | 類型 | 值 |
|---|---|---|
| GA_MEASUREMENT_ID | 變數(Variable) | 你的 G-XXXXXXXXXX |
| GA_API_SECRET | 機密(Secret) | 剛才建立的Measurement Protocol API密鑰 |
注意:GA_API_SECRET 必須選擇 Secret 類型,而非一般的 Variable。
建立Worker後,會獲得一組Worker網址,例如:
https://****.haran-huang.workers.dev
步驟三:寫入Worker像素追蹤程式碼
進入「Edit code」,貼上以下程式碼:
這段程式的作用是向GA4發送email_open 事件,回傳透明的1×1 gif,讓郵件用戶端能正常載入圖片。
步驟四:在郵件HTML中加入1×1像素
Worker 網址範例:
https://***.haran-huang.workers.dev
可在郵件HTML底部加入:
<img src="https://***.haran-huang.workers.dev?cid=123456.789012&campaign_id=newsletter_20260921" width="1" height="1" style="display:none;" />
參數說明:
| 參數 | 說明 |
|---|---|
| cid | 必要參數。建議使用真實的 client_id;若無法取得,可為每位收件人生成不同的隨機/偽匿名 cid |
| campaign_id | 郵件活動識別碼,例如 newsletter_20260921 |
HTML 編碼提醒:在HTML屬性中,參數之間的 & 建議寫成 &,而非直接使用 &,以確保符合 HTML 規範。
步驟五:發送測試郵件並驗證
先向自己的信箱發送測試郵件,再開啟郵件。
檢查順序:
- 確認郵件用戶端沒有顯示破圖(圖片載入失敗)
- 查看 Cloudflare Worker 日誌(Logs),確認 Worker 有收到 GET 請求
- 在 GA4 的「即時報表」或事件報表中,查看 email_open 事件是否出現
如何在GA4中查看email_open?
你可以先在GA4的事件報表中查看 email_open 事件。
如果需要按郵件活動進行拆分分析,應建立自訂維度來註冊事件參數 email_campaign_id,之後即可在報表中依活動別進行區隔與比較。
為什麼email_open不會歸類為Email管道?
GA4 的預設管道群組主要依據網站工作階段的source和medium進行識別。
例如:當使用者帶著 utm_source=email 和 utm_medium=email 進入網站時,GA4才會將該工作階段歸類為 Email 管道。
而透過 Measurement Protocol 發送的事件,實際上並沒有「造訪」網站,因此預設不會產生工作階段,自然也就不會歸類為 Email 管道——實際上這些事件會被歸類到Unassigned。
如何用UTM追蹤郵件點擊後的Email工作階段?
郵件開啟和郵件點擊是兩種不同的行為。
郵件中的連結應另外加上UTM參數:
https://www.haranhuang.com/?utm_source=email&utm_medium=email&utm_campaign=newsletter_20260921
這樣可以獲得兩類不同的數據:
| 使用者行為 | 追蹤方式 | GA4 中的主要數據口徑 |
|---|---|---|
| 開啟郵件但未點擊 | Measurement Protocol | email_open 事件 |
| 點擊郵件連結並進入網站 | UTM 參數 | Email 管道工作階段、使用者、轉換 |