<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Conversions-Api on Tarragon</title><link>https://tarrragon.github.io/blog/tags/conversions-api/</link><description>Recent content in Conversions-Api on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 22 Oct 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/conversions-api/index.xml" rel="self" type="application/rss+xml"/><item><title>Meta Pixel 與 Conversions API：廣告平台轉換追蹤的瀏覽器端與伺服器端</title><link>https://tarrragon.github.io/blog/devops/monitoring/vendors/meta-pixel-conversions-api/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/devops/monitoring/vendors/meta-pixel-conversions-api/</guid><description>&lt;p>這篇整理 Meta（Facebook / Instagram 廣告）的網站轉換追蹤：瀏覽器端的 Meta Pixel、伺服器端的 Conversions API（常簡稱 CAPI），以及兩條路徑並用時的去重與驗證。範圍是網站事件；App 端的事件走 Meta 的 App SDK，不在這篇。欄位規格以 Meta 開發者文件為準，本篇引用的規則（必填欄位、去重的時間窗、&lt;code>event_time&lt;/code> 的上限）都會隨 Meta 改版調整，接入時回官方文件核對一次。&lt;/p>
&lt;h2 id="廣告平台轉換追蹤的資料消費者">廣告平台轉換追蹤的資料消費者&lt;/h2>
&lt;p>Meta Pixel 送出的事件，主要的消費者是 Meta 的廣告投放系統：投放演算法依轉換事件學習該把廣告給誰看，廣告後台依它計算每一檔廣告帶來幾筆轉換。這一點讓它跟 &lt;a href="https://tarrragon.github.io/blog/devops/monitoring/06-commercial-comparison/mixpanel-amplitude/" data-link-title="Mixpanel / Amplitude" data-link-desc="行為分析專用方案 vs 通用監控的差異 — Mixpanel 和 Amplitude 的 funnel / cohort / retention 分析能力">Mixpanel / Amplitude&lt;/a> 這類行為分析工具分開——行為分析的消費者是自己的產品團隊，事件怎麼命名、帶什麼屬性由自己決定；廣告平台的事件要讓平台的演算法讀得懂，所以命名照平台的規定。&lt;/p>
&lt;p>Meta 定義了一組標準事件（standard events）：&lt;code>PageView&lt;/code>、&lt;code>ViewContent&lt;/code>、&lt;code>AddToCart&lt;/code>、&lt;code>InitiateCheckout&lt;/code>、&lt;code>Purchase&lt;/code>、&lt;code>Lead&lt;/code>、&lt;code>CompleteRegistration&lt;/code> 等。廣告活動的最佳化目標綁在這些事件名稱上，例如以「購買」為目標的廣告活動讀的是 &lt;code>Purchase&lt;/code>；&lt;code>Purchase&lt;/code> 另外要帶 &lt;code>value&lt;/code> 與 &lt;code>currency&lt;/code>，平台才算得出廣告投資報酬。自己的事件命名（&lt;a href="https://tarrragon.github.io/blog/devops/monitoring/01-mental-model/event-naming-convention/" data-link-title="事件命名規範" data-link-desc="namespace.action 格式的事件命名、命名一致性的工程價值、和商業方案命名慣例的對應">事件命名規範&lt;/a> 的 &lt;code>namespace.action&lt;/code>）因此需要一層對映：&lt;code>checkout.complete&lt;/code> 送到自己的 collector，同一筆在送往 Meta 時改名成 &lt;code>Purchase&lt;/code>。對映表寫在一個地方、由工程維護，比散在各個埋點呼叫裡改名好查。&lt;/p>
&lt;p>廣告平台各自用自己看得到的事件做歸因，同一筆訂單可能同時被 Meta 與 Google Ads 算成自己帶來的轉換，兩個後台的轉換數加總會大於實際訂單數。跨渠道的歸因模型見 &lt;a href="https://tarrragon.github.io/blog/devops/monitoring/08-business-analytics/attribution/" data-link-title="Attribution" data-link-desc="使用者從哪來、哪個渠道帶來轉換 — last-touch / first-touch / multi-touch 歸因模型的差異和選擇">Attribution&lt;/a>。&lt;/p>
&lt;h2 id="meta-pixel-在瀏覽器裡做的事">Meta Pixel 在瀏覽器裡做的事&lt;/h2>
&lt;p>Pixel 的基本碼從 &lt;code>connect.facebook.net&lt;/code> 載入 &lt;code>fbevents.js&lt;/code>，再用 &lt;code>fbq()&lt;/code> 這個全域函式初始化並送事件。&lt;code>fbevents.js&lt;/code> 載入後會再向 Meta 取得這個 Pixel 的設定檔，設定檔載入的模組（plugin，&lt;code>fbevents.js&lt;/code> 依 Pixel 設定檔載入的程式片段）會在網站沒有呼叫 &lt;code>fbq()&lt;/code> 的情況下&lt;a href="https://tarrragon.github.io/blog/devops/monitoring/knowledge-cards/autocapture/" data-link-title="Autocapture（自動事件收集）" data-link-desc="盤點網站實際送出哪些事件與內容、報表裡出現網站沒有呼叫過的事件，或在手動埋點與自動收集之間取捨時">自己送事件&lt;/a>，例如依按鈕點擊送出的 &lt;code>SubscribedButtonClick&lt;/code>，內容包含按鈕文字；實測見 &lt;a href="https://tarrragon.github.io/blog/devops/monitoring/vendors/tracking-request-capture/" data-link-title="用 Playwright 擷取追蹤碼請求：擷取方式、記錄欄位與各次結果" data-link-desc="以 Playwright 操作 Meta Pixel 與 GTM 實測頁、記錄各家 script 實際送出的請求與 cookie 的方式，結果檔記錄的欄位與它們的用途，擷取用的測試帳號，以及每一次擷取觀察到的事件請求形式、cookie 與請求參數的對應、無頭瀏覽器下的差異與 script 自動送出的事件">用 Playwright 擷取追蹤碼請求&lt;/a> 的 Meta Pixel 有視窗那一次。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> &lt;span class="c1">// Meta 提供的載入片段（略）：定義 fbq 並從 connect.facebook.net 載入 fbevents.js
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">fbq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;init&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;PIXEL_ID&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// PIXEL_ID 換成 Events Manager 裡那個 Pixel 的 ID
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">fbq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;track&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;PageView&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 每一頁載入時送一次
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>fbq('init', ...)&lt;/code> 的第二個引數是 Pixel ID，每個 Pixel 在 Meta Events Manager 裡有自己的一串數字，一個網站可以初始化多個 Pixel。&lt;code>PIXEL_ID&lt;/code> 在這裡是佔位值，要換成自己 Events Manager 裡顯示的那一串。&lt;/p>
&lt;p>送轉換事件時，&lt;code>fbq('track', ...)&lt;/code> 依序接事件名稱、事件參數、以及選填的第四個引數：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1">// 第二個引數是標準事件名稱，第三個是事件參數，第四個帶這一筆事件的唯一 ID
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">fbq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;track&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Purchase&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">1280&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">currency&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;TWD&amp;#39;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nx">eventID&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;order-20261022-0042&amp;#39;&lt;/span> &lt;span class="p">});&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>value&lt;/code> 與 &lt;code>currency&lt;/code> 是這一筆購買的金額與幣別，從訂單資料取值。&lt;code>eventID&lt;/code> 是這一筆事件的識別碼，只送 Pixel 的時候可以省略；同一筆事件還要從伺服器再送一次時就必須帶，原因在〈兩路並送時的去重規則〉一節。&lt;/p>
&lt;p>Pixel 也在網站自己的網域上寫 cookie：&lt;code>_fbp&lt;/code> 記錄這個瀏覽器的識別碼；使用者從廣告點進來時，落地網址會帶 &lt;code>fbclid&lt;/code> 參數，Pixel 把它存成 &lt;code>_fbc&lt;/code>。這兩個 cookie 是&lt;a href="https://tarrragon.github.io/blog/devops/monitoring/knowledge-cards/first-party-cookie/" data-link-title="First-party Cookie（第一方 cookie）" data-link-desc="盤點網站寫下的識別碼 cookie、比對追蹤碼的 cookie 期限，或判斷某個 cookie 受不受瀏覽器的第三方 cookie 限制時">第一方 cookie&lt;/a>（寫在網站自己的網域上），之後伺服器端送事件時會用到它們的值。&lt;/p></description><content:encoded><![CDATA[<p>這篇整理 Meta（Facebook / Instagram 廣告）的網站轉換追蹤：瀏覽器端的 Meta Pixel、伺服器端的 Conversions API（常簡稱 CAPI），以及兩條路徑並用時的去重與驗證。範圍是網站事件；App 端的事件走 Meta 的 App SDK，不在這篇。欄位規格以 Meta 開發者文件為準，本篇引用的規則（必填欄位、去重的時間窗、<code>event_time</code> 的上限）都會隨 Meta 改版調整，接入時回官方文件核對一次。</p>
<h2 id="廣告平台轉換追蹤的資料消費者">廣告平台轉換追蹤的資料消費者</h2>
<p>Meta Pixel 送出的事件，主要的消費者是 Meta 的廣告投放系統：投放演算法依轉換事件學習該把廣告給誰看，廣告後台依它計算每一檔廣告帶來幾筆轉換。這一點讓它跟 <a href="/blog/devops/monitoring/06-commercial-comparison/mixpanel-amplitude/" data-link-title="Mixpanel / Amplitude" data-link-desc="行為分析專用方案 vs 通用監控的差異 — Mixpanel 和 Amplitude 的 funnel / cohort / retention 分析能力">Mixpanel / Amplitude</a> 這類行為分析工具分開——行為分析的消費者是自己的產品團隊，事件怎麼命名、帶什麼屬性由自己決定；廣告平台的事件要讓平台的演算法讀得懂，所以命名照平台的規定。</p>
<p>Meta 定義了一組標準事件（standard events）：<code>PageView</code>、<code>ViewContent</code>、<code>AddToCart</code>、<code>InitiateCheckout</code>、<code>Purchase</code>、<code>Lead</code>、<code>CompleteRegistration</code> 等。廣告活動的最佳化目標綁在這些事件名稱上，例如以「購買」為目標的廣告活動讀的是 <code>Purchase</code>；<code>Purchase</code> 另外要帶 <code>value</code> 與 <code>currency</code>，平台才算得出廣告投資報酬。自己的事件命名（<a href="/blog/devops/monitoring/01-mental-model/event-naming-convention/" data-link-title="事件命名規範" data-link-desc="namespace.action 格式的事件命名、命名一致性的工程價值、和商業方案命名慣例的對應">事件命名規範</a> 的 <code>namespace.action</code>）因此需要一層對映：<code>checkout.complete</code> 送到自己的 collector，同一筆在送往 Meta 時改名成 <code>Purchase</code>。對映表寫在一個地方、由工程維護，比散在各個埋點呼叫裡改名好查。</p>
<p>廣告平台各自用自己看得到的事件做歸因，同一筆訂單可能同時被 Meta 與 Google Ads 算成自己帶來的轉換，兩個後台的轉換數加總會大於實際訂單數。跨渠道的歸因模型見 <a href="/blog/devops/monitoring/08-business-analytics/attribution/" data-link-title="Attribution" data-link-desc="使用者從哪來、哪個渠道帶來轉換 — last-touch / first-touch / multi-touch 歸因模型的差異和選擇">Attribution</a>。</p>
<h2 id="meta-pixel-在瀏覽器裡做的事">Meta Pixel 在瀏覽器裡做的事</h2>
<p>Pixel 的基本碼從 <code>connect.facebook.net</code> 載入 <code>fbevents.js</code>，再用 <code>fbq()</code> 這個全域函式初始化並送事件。<code>fbevents.js</code> 載入後會再向 Meta 取得這個 Pixel 的設定檔，設定檔載入的模組（plugin，<code>fbevents.js</code> 依 Pixel 設定檔載入的程式片段）會在網站沒有呼叫 <code>fbq()</code> 的情況下<a href="/blog/devops/monitoring/knowledge-cards/autocapture/" data-link-title="Autocapture（自動事件收集）" data-link-desc="盤點網站實際送出哪些事件與內容、報表裡出現網站沒有呼叫過的事件，或在手動埋點與自動收集之間取捨時">自己送事件</a>，例如依按鈕點擊送出的 <code>SubscribedButtonClick</code>，內容包含按鈕文字；實測見 <a href="/blog/devops/monitoring/vendors/tracking-request-capture/" data-link-title="用 Playwright 擷取追蹤碼請求：擷取方式、記錄欄位與各次結果" data-link-desc="以 Playwright 操作 Meta Pixel 與 GTM 實測頁、記錄各家 script 實際送出的請求與 cookie 的方式，結果檔記錄的欄位與它們的用途，擷取用的測試帳號，以及每一次擷取觀察到的事件請求形式、cookie 與請求參數的對應、無頭瀏覽器下的差異與 script 自動送出的事件">用 Playwright 擷取追蹤碼請求</a> 的 Meta Pixel 有視窗那一次。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="c1">// Meta 提供的載入片段（略）：定義 fbq 並從 connect.facebook.net 載入 fbevents.js
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"></span>  <span class="nx">fbq</span><span class="p">(</span><span class="s1">&#39;init&#39;</span><span class="p">,</span> <span class="s1">&#39;PIXEL_ID&#39;</span><span class="p">);</span>   <span class="c1">// PIXEL_ID 換成 Events Manager 裡那個 Pixel 的 ID
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"></span>  <span class="nx">fbq</span><span class="p">(</span><span class="s1">&#39;track&#39;</span><span class="p">,</span> <span class="s1">&#39;PageView&#39;</span><span class="p">);</span>  <span class="c1">// 每一頁載入時送一次
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1"></span><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div><p><code>fbq('init', ...)</code> 的第二個引數是 Pixel ID，每個 Pixel 在 Meta Events Manager 裡有自己的一串數字，一個網站可以初始化多個 Pixel。<code>PIXEL_ID</code> 在這裡是佔位值，要換成自己 Events Manager 裡顯示的那一串。</p>
<p>送轉換事件時，<code>fbq('track', ...)</code> 依序接事件名稱、事件參數、以及選填的第四個引數：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">// 第二個引數是標準事件名稱，第三個是事件參數，第四個帶這一筆事件的唯一 ID
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"></span><span class="nx">fbq</span><span class="p">(</span><span class="s1">&#39;track&#39;</span><span class="p">,</span> <span class="s1">&#39;Purchase&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">  <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="mi">1280</span><span class="p">,</span> <span class="nx">currency</span><span class="o">:</span> <span class="s1">&#39;TWD&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">  <span class="p">{</span> <span class="nx">eventID</span><span class="o">:</span> <span class="s1">&#39;order-20261022-0042&#39;</span> <span class="p">});</span></span></span></code></pre></div><p><code>value</code> 與 <code>currency</code> 是這一筆購買的金額與幣別，從訂單資料取值。<code>eventID</code> 是這一筆事件的識別碼，只送 Pixel 的時候可以省略；同一筆事件還要從伺服器再送一次時就必須帶，原因在〈兩路並送時的去重規則〉一節。</p>
<p>Pixel 也在網站自己的網域上寫 cookie：<code>_fbp</code> 記錄這個瀏覽器的識別碼；使用者從廣告點進來時，落地網址會帶 <code>fbclid</code> 參數，Pixel 把它存成 <code>_fbc</code>。這兩個 cookie 是<a href="/blog/devops/monitoring/knowledge-cards/first-party-cookie/" data-link-title="First-party Cookie（第一方 cookie）" data-link-desc="盤點網站寫下的識別碼 cookie、比對追蹤碼的 cookie 期限，或判斷某個 cookie 受不受瀏覽器的第三方 cookie 限制時">第一方 cookie</a>（寫在網站自己的網域上），之後伺服器端送事件時會用到它們的值。</p>
<h2 id="瀏覽器端事件的損失路徑">瀏覽器端事件的損失路徑</h2>
<p>Pixel 的事件從讀者的瀏覽器發出，所以它會在讀者端被擋下，而網站這一端收不到任何錯誤：</p>
<ul>
<li><strong>廣告攔截器擋下 script 本身</strong>：攔截清單收錄 <code>connect.facebook.net</code> 這類已知追蹤網域，<code>fbevents.js</code> 載不進來，<code>fbq()</code> 之後的所有事件都不會送出。</li>
<li><strong>瀏覽器的追蹤防護縮短 cookie 壽命</strong>：Safari 的 Intelligent Tracking Prevention（ITP）會限制由 JavaScript 寫入的第一方 cookie 的有效期，<code>_fbp</code> 因此比預期更早消失：一般情形是使用者 7 天沒有互動之後刪除；從 Meta 廣告帶著 <code>fbclid</code> 進站那一次在落地頁寫下的 cookie，上限只有 24 小時，所以同一個人點了廣告、過了一天以上才回來購買時，就可能被當成另一個瀏覽器（期限規則見 <a href="/blog/devops/monitoring/knowledge-cards/first-party-cookie/" data-link-title="First-party Cookie（第一方 cookie）" data-link-desc="盤點網站寫下的識別碼 cookie、比對追蹤碼的 cookie 期限，或判斷某個 cookie 受不受瀏覽器的第三方 cookie 限制時">First-party Cookie（第一方 cookie）</a>）；部分瀏覽器與 App 內開啟的連結也會移除網址裡的 <code>fbclid</code>。</li>
<li><strong>同意聲明還沒取得</strong>：在要求事先同意的法域（例如 GDPR 下的歐盟讀者），網站在使用者同意之前不能載入 Pixel，這段期間的事件依規定就不送。</li>
<li><strong>自動化與機器人流量過濾</strong>：實測的這個 Pixel，設定檔裡的模組依 User-Agent 判斷機器人流量（模組由 Meta 依各 Pixel 的設定檔下發），<a href="/blog/devops/monitoring/knowledge-cards/headless-browser/" data-link-title="Headless Browser（無頭瀏覽器）" data-link-desc="用 Playwright 或 Puppeteer 測追蹤碼、分析報表裡的機器流量，或自建統計與商業追蹤碼的訪問數對不上時">無頭瀏覽器</a>（User-Agent 帶 <code>HeadlessChrome</code>）送出的事件在瀏覽器裡就被攔下。<code>fbevents.js</code> 照常載入、cookie 照常寫入，網站這一端看不出事件沒送；用自動化工具驗證追蹤設定時會撞上這一條，實測見 <a href="/blog/devops/monitoring/vendors/tracking-request-capture/" data-link-title="用 Playwright 擷取追蹤碼請求：擷取方式、記錄欄位與各次結果" data-link-desc="以 Playwright 操作 Meta Pixel 與 GTM 實測頁、記錄各家 script 實際送出的請求與 cookie 的方式，結果檔記錄的欄位與它們的用途，擷取用的測試帳號，以及每一次擷取觀察到的事件請求形式、cookie 與請求參數的對應、無頭瀏覽器下的差異與 script 自動送出的事件">用 Playwright 擷取追蹤碼請求</a> 的無頭模式那一次。</li>
<li><strong>跳頁中斷</strong>：購買按鈕按下後立刻導向感謝頁，送事件的請求可能還沒送完頁面就被卸載。這是所有前端事件追蹤共通的狀況，機制與 <code>sendBeacon</code> 的解法見 <a href="/blog/devops/monitoring/05-platform-adaptation/js-ts-platform/" data-link-title="JS/TS 平台適配" data-link-desc="CORS 限制、Service Worker 攔截、SPA 路由變換偵測 — 瀏覽器環境中 SDK 需要處理的平台特殊問題">JS/TS 平台適配</a>。</li>
</ul>
<p>每個網站被擋下的比例取決於讀者組成（裝攔截器的比例、iOS 的比例、歐盟流量的比例），網路上流傳的百分比是別人網站的數字。量自己網站的方式是對帳：同一段期間內，訂單資料庫裡的訂單數與 Events Manager 收到的 <code>Purchase</code> 數相比，差距就是這個網站的瀏覽器端損失。</p>
<h2 id="conversions-api從伺服器送同一批事件">Conversions API：從伺服器送同一批事件</h2>
<p>Conversions API 讓網站的伺服器直接把事件 POST 到 Meta 的 Graph API（<code>/&lt;PIXEL_ID&gt;/events</code>），請求不經過讀者的瀏覽器，所以廣告攔截器與 cookie 期限都影響不到它。代價是伺服器要自己準備瀏覽器原本會自動附上的資訊：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="nt">&#34;event_name&#34;</span><span class="p">:</span> <span class="s2">&#34;Purchase&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    <span class="nt">&#34;event_time&#34;</span><span class="p">:</span> <span class="mi">1792656000</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="nt">&#34;event_id&#34;</span><span class="p">:</span> <span class="s2">&#34;order-20261022-0042&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="nt">&#34;action_source&#34;</span><span class="p">:</span> <span class="s2">&#34;website&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="nt">&#34;event_source_url&#34;</span><span class="p">:</span> <span class="s2">&#34;https://shop.example.com/checkout/thanks&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="nt">&#34;user_data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">      <span class="nt">&#34;client_user_agent&#34;</span><span class="p">:</span> <span class="s2">&#34;&lt;下單時瀏覽器的 User-Agent&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">      <span class="nt">&#34;client_ip_address&#34;</span><span class="p">:</span> <span class="s2">&#34;&lt;下單時的來源 IP&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">      <span class="nt">&#34;fbp&#34;</span><span class="p">:</span> <span class="s2">&#34;&lt;讀自 _fbp cookie&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="nt">&#34;fbc&#34;</span><span class="p">:</span> <span class="s2">&#34;&lt;讀自 _fbc cookie&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">      <span class="nt">&#34;em&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;&lt;正規化後的 email 的 SHA-256&gt;&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="nt">&#34;custom_data&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;value&#34;</span><span class="p">:</span> <span class="mi">1280</span><span class="p">,</span> <span class="nt">&#34;currency&#34;</span><span class="p">:</span> <span class="s2">&#34;TWD&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="p">}]</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>欄位的來源與限制：</p>
<ul>
<li><code>event_name</code>、<code>event_id</code>、<code>custom_data</code> 與 Pixel 那一筆相同，名稱的對映方式見〈廣告平台轉換追蹤的資料消費者〉一節。</li>
<li><code>event_time</code> 是事件發生的 Unix 時間（秒）。Meta 接受的範圍是送出當下往前七天內；一批資料裡只要有一筆超過七天，整個請求會被拒絕、一筆都不處理，所以用排程補送積壓的事件時要先過濾掉過期的那些。</li>
<li><code>action_source</code> 標明事件發生在哪裡，網站事件填 <code>website</code>。Meta 對網站事件另外要求 <code>event_source_url</code>（事件發生的頁面網址，網域要與 Meta 後台驗證過的網域一致）與 <code>client_user_agent</code>。</li>
<li><code>user_data</code> 是 Meta 用來把這筆事件對回某個 Meta 使用者的資料。<code>fbp</code>、<code>fbc</code> 從請求帶上來的 cookie 讀，<code>client_ip_address</code> 與 <code>client_user_agent</code> 從下單那一次請求的 header 讀，這四個欄位原樣送出；email、電話這類個人資料要先依 Meta 規定的方式正規化（去空白、轉小寫等），再做 SHA-256 雜湊才送。給的欄位越多，Events Manager 顯示的事件比對品質（Event Match Quality）越高。</li>
</ul>
<p>請求要帶 Meta 發給這個 Pixel 的 access token，這個 token 只能放在伺服器上：放進前端程式碼等於公開，任何人都能用它往這個 Pixel 灌假事件。前端程式碼裡的存取憑證會被提取的機制見 <a href="/blog/devops/monitoring/07-security-privacy/client-sdk-authentication/" data-link-title="Client-side SDK 認證的根本限制" data-link-desc="嵌在 client 端的 credential 必然可被提取 — 認清 architecture 天花板後的多層緩解策略，從 origin 驗證到 device attestation">Client-side SDK 認證的根本限制</a>。<code>user_data</code> 裡雜湊過的 email 仍然是可以對回個人的資料，送出前的同意與用途說明照 <a href="/blog/devops/monitoring/07-security-privacy/gdpr-minimization/" data-link-title="GDPR 最小化原則的工程落地" data-link-desc="資料最小化、目的限制、儲存限制 — GDPR 三個核心原則在監控系統的工程實作方式">GDPR 最小化原則的工程落地</a> 的原則處理。</p>
<h2 id="兩路並送時的去重規則">兩路並送時的去重規則</h2>
<p>Meta 建議 Pixel 與 Conversions API 並用：Pixel 送得到的時候帶著完整的瀏覽器資訊，送不到的那些由伺服器補上。兩條路徑都送成功的事件會被 Meta 收到兩次，所以 Meta 用兩個欄位判斷是不是同一筆：Pixel 的 <code>eventID</code> 與伺服器的 <code>event_id</code> 相同、且兩邊的事件名稱相同。依 Meta 文件，去重只在同一個 <code>event_id</code> 第一次送達後的 48 小時內生效；兩筆幾乎同時抵達時 Meta 保留瀏覽器那一筆；48 小時內沒有收到瀏覽器那一筆時，伺服器那一筆照常計入。</p>
<p>這條規則決定了 <code>event_id</code> 要在哪裡產生：在事件的源頭產生一次，再同時交給前端與後端。訂單編號符合這個條件，前後端都拿得到同一個值：感謝頁從訂單資料讀出編號放進 <code>fbq</code> 的第四個引數，伺服器在建立訂單時用同一個編號送 Conversions API。兩邊各自產生一個隨機 UUID 是常見的錯法，兩個值永遠對不上，每一筆轉換都會被算兩次，廣告後台的轉換數膨脹而沒有任何錯誤訊息。</p>
<p>Meta 另有一種用 <code>event_name</code> 加 <code>fbp</code> 或 <code>external_id</code> 比對的去重方式，文件註明它通常只在瀏覽器那一筆先到、伺服器那一筆後到的順序下有效，所以只當作 <code>event_id</code> 的備援。</p>
<p>去重的道理與自架 collector 處理 SDK 重送是同一件事：重送的事件要靠一個在源頭就決定的 ID 才認得出來，見 <a href="/blog/devops/monitoring/04-collector/data-integrity/" data-link-title="端到端資料完整性" data-link-desc="從 SDK 到 storage 的資料損失地圖 — 每個環節的損失類型、控制策略、完整性指標、被自己 SDK DDoS 的防護">端到端資料完整性</a>。</p>
<h2 id="用-test-events-驗證送出的事件">用 Test Events 驗證送出的事件</h2>
<p>Events Manager 在每個 Pixel 底下有 Test Events 頁面，它即時列出這個 Pixel 收到的事件、來源是瀏覽器還是伺服器、以及去重的結果。兩條路徑的驗證方式不同：</p>
<ul>
<li><strong>瀏覽器端</strong>：在 Test Events 頁面輸入網站網址開啟，或在瀏覽器裝 Meta Pixel Helper 擴充功能，操作一次購買流程，確認 <code>Purchase</code> 出現且帶著 <code>value</code>、<code>currency</code> 與 <code>eventID</code>。</li>
<li><strong>伺服器端</strong>：Test Events 頁面會給一組測試代碼，伺服器送 Conversions API 時在請求裡加上 <code>test_event_code</code> 欄位，那批事件就會出現在測試視窗裡。正式上線前要把這個欄位拿掉；帶測試代碼的事件會不會計入正式報表，以 Events Manager 當下的說明為準。</li>
</ul>
<p>驗證去重時兩條路徑一起跑：同一筆測試訂單在 Test Events 裡應該看到瀏覽器與伺服器各一筆，並標示其中一筆被去重。只看到一筆時，先確認另一條路徑確實沒送，還是 <code>event_id</code> 對不上而被當成兩筆不同的事件。</p>
<h2 id="和自架事件追蹤並存的資料流">和自架事件追蹤並存的資料流</h2>
<p>接了 Pixel 與 Conversions API 之後，同一個業務事件（一筆購買）會往三個地方送：自己的 collector、Meta 的瀏覽器端、Meta 的伺服器端。業務事件的定義只寫一次，送往各家時各自做名稱與欄位的對映，比在各個埋點位置分別呼叫三家的 API 好維護，改一個欄位不必找遍三種呼叫。這個分流結構與它的保留期、PII 取捨，在 <a href="/blog/devops/monitoring/telemetry-data-dual-use/" data-link-title="監控資料的雙重用途：行為分析與訊號治理" data-link-desc="同一份 event data 如何同時服務行為分析（funnel / cohort / attribution）和訊號治理（cardinality / cost / signal governance）— 格式交叉、治理衝突與分流架構">監控資料的雙重用途</a> 有完整的推導。</p>
<p>本篇描述的瀏覽器端行為可以在 <a href="/blog/devops/monitoring/vendors/meta-pixel-lab/" data-link-title="Meta Pixel 實測頁：在瀏覽器裡觀察 fbq 呼叫、送出的請求與寫下的 cookie" data-link-desc="在這一頁按按鈕載入 Meta Pixel、送 PageView、ViewContent 與帶 eventID 的 Purchase，並用頁面上的面板對照每個呼叫送出的請求參數，以及 _fbp 與 fbclid 帶出的 _fbc cookie">Meta Pixel 實測頁</a> 按按鈕觸發、對照它實際送出的請求與 cookie。追蹤碼要由誰、用什麼流程放上網站，是另一層的決定。行銷團隊常用 tag manager 自行加 Pixel，那條路徑的約定與治理見 <a href="/blog/devops/monitoring/vendors/google-tag-manager/" data-link-title="Google Tag Manager：追蹤碼的部署層、資料層約定與發布治理" data-link-desc="GTM 容器在頁面上承擔的部署責任、資料層作為前端與行銷之間的事件約定、預覽模式與版本發布的驗證方式、自訂 HTML 代碼帶來的安全與效能成本，以及伺服器端代碼管理改變的資料路徑">Google Tag Manager</a>。Pixel 的資料集屬於哪一個商家資產管理組合、建立之後能不能轉給另一個組合，以及委託代理商時資料集該建在誰的組合裡，見 <a href="/blog/devops/monitoring/vendors/tracking-account-ownership/" data-link-title="追蹤資產的歸屬：Meta、GTM 與 GA4 的擁有層級、權限分級與移交方式" data-link-desc="Meta Pixel 的資料集、GTM 容器與 GA4 資源（property）各自屬於哪一層的擁有者，三家的權限怎麼分級，哪些資產能換到另一個擁有者底下，以及公司自營、委託代理商、換代理商與事業轉手時的歸屬安排">追蹤資產的歸屬</a>。</p>
]]></content:encoded></item></channel></rss>