Facebook Pixel 事件準不準?fbclid 截斷與假名單實測
重點摘要
Facebook Pixel 與轉換 API 回 events_received:1 只代表請求被收下,不代表資料正確。要另外驗 fbclid 有沒有被改、同一顆按鈕會不會重複送名單、診斷分頁幾天後有沒有警告,附我們 2026 年 8 月的實測數字。
Facebook Pixel 和轉換 API(伺服器直接把事件送給 Meta 的那條路)送出事件後,Meta 回傳的 events_received:1 只代表請求被收下,不代表資料是對的:2026 年 8 月我們把 IP 欄位填成一串亂碼送過去,它一樣回成功。要確認事件真的對,得自己驗三件事:fbclid 有沒有原封不動送到 Meta、同一個人會不會被算成好幾筆名單、事件管理工具的診斷分頁幾天後有沒有冒出警告。
這三件事出錯時都不會跳錯誤,頁面照開、廣告費照扣,只有轉換數字慢慢失真。我們自己遇過 fbc 被資料庫截掉 98%、同一顆按鈕讓約 17% 的名單是重複送出、換落地頁時 291 筆轉換回報給舊像素。Facebook Pixel 改名 Meta Pixel 之後,很多人還是叫它 FB Pixel 或 Meta 像素,指的都是同一段放在網頁上的追蹤程式碼。Pixel 與轉換 API 怎麼用同一組 event_id 去重,寫在 Pixel 與 CAPI 雙送去重實作;去重做對了,資料一樣可能是髒的,問題多半出在點擊識別碼、重複點擊和伺服器端設定。
Facebook Pixel 回 events_received:1,代表資料正確嗎?
不代表。轉換 API 回傳的 events_received:1 只證明 Meta 收下了請求,不檢查欄位內容。2026 年 8 月 15 日我們直接呼叫 Graph API,把 client_ip_address 分別填成 IPv4、IPv6、截斷的 IPv6、字串 not-an-ip-at-all 和不帶,五種各送一次,全部回成功,messages 也是空的。
Meta 官方的客戶資訊參數文件寫,這個 IP「must be a valid IPV4 or IPV6 address」。規格要求有效,接收端卻照單全收,錯的資料要等幾天後才在事件管理工具的診斷分頁浮出來。events_received:1 只能證明事件有送到,格式要在送出前自己驗,送出後隔幾天再回頭看診斷分頁。
反過來,回錯誤也不一定是程式壞了。我們自架的轉送端點有一次回 502,查下來是測試時 user_data 整個是空的,伺服器又刻意不附自己的 IP,這筆事件沒有任何能辨識使用者的資料,被 Meta 拒收。測伺服器端路徑時,要帶電話、外部編號、使用者代理這類識別欄位,不然測到的是 Meta 的拒收規則,不是你的程式。
測試事件碼(test_event_code)也要小心。Meta 在轉換 API 使用說明寫,它「should be used only for testing」,正式送出時要拿掉;同一段也寫,帶測試碼的事件「are not dropped」,一樣會流進事件管理工具,用在目標設定與成效衡量。掛了測試碼不代表假資料會被隔離,測試前最好先把送往 Meta 的請求攔下來。
fbclid 和 fbc 是什麼?官方格式逐欄看
fbclid 是從 Facebook 或 Instagram 廣告點進網站時,網址後面多出來的點擊識別碼;fbc 是把它加上版本、網域層級和建立時間,存進網站自己的 _fbc cookie、再隨事件送回 Meta 的值。Meta 靠它把轉換對回那次點擊,fbclid 被改掉一個字元,這筆轉換就可能對不回去,或算到別則廣告頭上。
Meta 在 fbp 與 fbc 參數文件把格式寫得很死:必須是「version.subdomainIndex.creationTime.<fbclid>」,creationTime 是「UNIX time since epoch in milliseconds」,而且「ClickID value is case sensitive - do not apply any modifications before using」。寫 cookie 的時機也有規定:除了還沒有 cookie 的情況,只要「fbclid in the URL query parameter isn't equal to the corresponding value in the _fbc cookie value」,就要重寫。
| 欄位 | Meta 官方規格 | 我們看過的錯法 | 結果 |
|---|---|---|---|
| version | 固定是 fb | 沒出過錯 | 無 |
| subdomainIndex | com 是 0、example.com 是 1、www.example.com 是 2 | 用網址最後兩段推根網域 | .com.tw 網站的 _fbc 寫不進去 |
| creationTime | 毫秒,13 位數 | Date.now()/1000 存成秒,10 位數 | 不符合毫秒規格 |
| fbclid | 大小寫敏感,使用前不得修改 | 存資料庫截到 120 字元、多解碼一次 | 事件管理工具報 fbclid 被修改 |
| 寫入時機 | 網址上的 fbclid 跟 cookie 裡的不同就重寫 | 只在沒有 cookie 時才寫 | 回訪者點新廣告,送出的還是舊 fbclid |
一筆名單從廣告點擊到 Meta,會在哪裡壞掉
- 點廣告進站網址帶著 fbclid,大小寫和長度都不能動
- 寫入 _fbc時間用毫秒,網址上的值跟舊 cookie 不同就覆蓋
- 按鈕送事件同一顆按鈕重複點、PageView 另走一條路
- 伺服器轉送使用者代理、回傳端點、像素編號都要對
- Meta 收下回 events_received:1,但不檢查內容
這五個環節裡,前三個發生在瀏覽器,後兩個發生在伺服器。瀏覽器端的錯會讓 fbclid 變形或名單重複,伺服器端的錯會讓事件帶著假的使用者代理,或整批送到錯的像素。Meta 在最後一關不檢查內容,所以前面四關都要自己守。
我們量到的數字
這些是 2026 年 8 月我們在幾個廣告落地頁上量到的數字。樣本多半來自單一網站、單次測試,能說明的是這些錯誤真的會發生、而且量級不小,不代表每個網站都會是同樣比例。它們的共同點是全部不會報錯:頁面照開、事件照送、Meta 照收,只有回頭查資料庫、查事件管理工具,或攔截實際送出的內容才看得到。
| 項目 | 做法 | 結果 | 條件、日期、樣本數 |
|---|---|---|---|
| 轉換 API 收不收錯的 IP | client_ip_address 填 5 種值,含字串 not-an-ip-at-all | 5 種全回 events_received:1,messages 空 | 2026-08-15,直接呼叫 Graph API,每種送 1 次 |
| fbc 存進資料庫 | 欄位上限開 120 字元 | 343 筆裡 336 筆剛好 120 字元(98% 被截) | 2026-08-15,某廣告落地頁 |
| 真實 fbclid 長度 | 看真實廣告點擊帶進來的值 | 161~201 字元 | 2026-08-22,某廣告落地頁 |
| PageView 漏修 | 只改了共用的送事件函式 | PageView 的 fbc/fbp 涵蓋率 24.77%,配對品質 3.9 分 | 2026-08-15,Meta 事件管理工具顯示 |
| _fbc 寫入條件錯 | 只在沒有 cookie 時寫 | Meta 回報 fbclid 被修改,約 3% 的 Lead 受影響 | 2026-08-22,某廣告落地頁 |
| 同一顆按鈕連點 | 連點 5 次 | Meta 收到 5 筆 Lead,event_id 都不同 | 2026-08,某廣告落地頁 |
| 真實名單裡的重複 | 統計 4 天的真實送出 | 42 個真人送出 54 筆 Lead,9 筆是同一顆按鈕重複點(約 17%) | 2026-08-15~08-18,某廣告落地頁 |
| 伺服器端使用者代理 | 沒帶就用請求本身的 | 後端事件全帶字串 node,工具卻顯示涵蓋率全滿 | 2026-08-15,某廣告落地頁 |
| 換落地頁 | 只換報表網址,沒換回傳端點 | 24 小時內 291 筆真實轉換回報給沒在用的舊像素 | 2026-08-21,某廣告落地頁 |
| 端點防護誤擋 | 三條硬擋規則套回 6 天紀錄 | 真實流量 0 次誤觸;格式類有 1 次是真人手機時鐘快 | 2026-08-13~08-18,某廣告落地頁 |
踩過的坑:fbclid 被改掉的五種寫法
fbclid 從網址到 Meta,要經過網址取值、寫進 cookie、存進資料庫、組成事件四個步驟,每一步都可能被程式悄悄改掉。這五種寫法都出自我們自己的程式,共同點是不會報錯:頁面正常、事件照送,要等 Meta 事件管理工具跳出 fbclid 被修改的警告,或回頭查長度分佈才會發現。修完之後,部署前後都要再驗一次線上版本。
時間戳存成秒。 現象:fbc 中間那段時間只有 10 位數。原因:程式用 Date.now()/1000 取時間,那是秒;Meta 規格要的是毫秒,13 位數。怎麼修:直接用 Date.now(),不要除以 1000,送出前用格式檢查擋掉時間不是 13 位數的值。
存進資料庫時被截斷。 現象:2026 年 8 月 15 日查某落地頁的資料庫,343 筆 fbc 裡有 336 筆長度剛好 120 字元,比例 98%。原因:欄位上限開 120,真實 fbclid 有 161~201 字元,存進去就被切掉尾巴,送出時等於修改過的值。怎麼修:欄位至少留 512 字元,已經被截斷的值直接清空,不要再送。要知道有沒有被截很簡單:看長度分佈,一大堆值剛好等於欄位上限,就是被截了。
多解碼一次。 現象:程式碼看起來很正常,送出的 fbclid 卻不一定跟網址上一字不差。原因:URLSearchParams.get() 取出來的值已經解碼過,程式又跑一次 decodeURIComponent,在 Meta 的定義下就是修改了 fbclid。怎麼修:用 URLSearchParams.get() 取值後原樣使用,不轉大小寫、不截斷、不再解碼。
只在沒有 cookie 時才寫 _fbc。 現象:2026 年 8 月 22 日,Meta 事件管理工具回報 fbclid 值被修改,約 3% 的 Lead 受影響。原因:程式條件寫成沒有 _fbc 才寫入,回訪者點新廣告進站時,cookie 裡還是上次的舊 fbclid,送出去的就是舊值,成效會算到錯的廣告。怎麼修:照官方條件,網址上的 fbclid 跟 cookie 裡的不同就覆蓋。從舊落地頁複製出新頁時,這個錯會跟著一起被複製,每個新頁都要重驗。
用網址最後兩段推根網域。 現象:在 www.example.com.tw 這類網址上,_fbc 根本沒寫進去,也沒有任何錯誤訊息。原因:程式用 hostname.split('.').slice(-2) 推根網域,在 .com 網站剛好對,在 .com.tw 會推成 com.tw;com.tw 是公共後綴,瀏覽器不准網站把 cookie 設在上面,那一行寫入會被默默丟掉。怎麼修:從最短的候選網域開始試寫一個探測用 cookie,最先讀得回來的那個就是可以寫的最上層網域;subdomainIndex 跟著實際寫入的網域算,example.com.tw 是 2。台灣 .com.tw、.org.tw 的網站,部署後一定要在瀏覽器裡確認 _fbc 真的存在。
踩過的坑:名單灌水與涵蓋率拉不上來
fbclid 沒被改壞,事件還是可能送得太多或帶得太少。送太多,是同一個人被算成好幾筆名單,每次成果成本看起來比實際便宜;帶太少,是事件缺少能對回使用者的資料,配對品質上不去。這兩類問題在廣告後台看起來都只是成本高一點、分數低一點,很少有人會聯想到是追蹤程式的寫法造成的,要回到程式和實際送出的內容才查得到。
同一顆按鈕重複點,假名單約佔 17%。 現象:某落地頁 2026 年 8 月 15~18 日,42 個真人送出 54 筆 Lead,其中 9 筆是同一個人重複點同一顆按鈕。原因:每次點擊都產生新的 event_id,Meta 只會合併 event_id 相同的事件,連點 5 次就是 5 筆不同的 Lead,每次成果成本被低估約 17%。怎麼修:同一個工作階段裡,同一顆按鈕只送一次給 Meta;自家的點擊計數照記,不跟著去重。意圖不同的按鈕(例如加好友和註冊)各送一次是對的,不要做成一人只算一筆。
去重做成永久只送一次,反而漏掉真轉換。 現象:為了擋重複,我們一度把 Lead 設計成同一台裝置永久只送一次,程式測試全綠,設計前提卻是錯的。原因有三條官方說法:WebKit 寫 Safari 會在「seven days of Safari use without user interaction on the site」之後刪光網站可寫入的儲存空間,永久旗標在 iPhone 上做不到;Meta 去重文件說 event_id 是用來「uniquely distinguish between similar events」的值,不該固定;Meta 說明中心寫,廣告組合要在最後一次重大編輯後一週內拿到「about 50 optimization events」才不會卡在學習階段,名單壓得太少反而學不起來。怎麼修:去重旗標要有時效,例如只在同一個工作階段內有效,event_id 每次隨機產生。
另外兩個常見誤會也在這裡。用 if(!window.fbq) return 判斷像素能不能用沒有效,Meta 標準程式碼一載入就會先放一個 fbq 的替身函式,facebook.net 被擋時它照樣存在。把 event_id 寫死當保險也不行,Meta 原文是同一組 event_id 與事件名稱在 48 小時內送到同一個像素時,「we discard the subsequent events」,後面的真轉換會被丟掉。
PageView 走另一條路,修了等於沒修。 現象:2026 年 8 月 15 日修好 fbc 之後,Meta 事件管理工具顯示 PageView 的 fbc/fbp 涵蓋率只有 24.77%,配對品質 3.9 分。原因:追蹤程式裡 PageView 是自己組資料送出的,不經過其他事件共用的函式,我們只改了共用函式。怎麼修:改追蹤前先全檔搜尋所有組事件資料的地方,一處一處對;驗收時每一種事件都要攔下來看實際送出的欄位。
等太短,cookie 還沒寫好就送出。 現象:fbp、fbc 的涵蓋率怎麼修都拉不上來。原因:Meta 的像素腳本是非同步載入,寫 _fbp 和 _fbc 需要時間,程式固定等 250 毫秒就送,桌機通常夠,4G 手機常常不夠。怎麼修:每 200 毫秒檢查一次 _fbp,最多等約 2 秒;fbc 一律用網址上的 fbclid 當備援;使用者在等待期間離開頁面(pagehide)時,強制把事件補送出去。
事件只帶使用者代理、IP 和 fbc,被判缺參數。 現象:事件管理工具判定全部事件都缺少使用者資料參數。原因:只有使用者代理、IP、fbc 這幾個欄位,Meta 不算強識別鍵,至少要有 email、電話或外部編號(external_id)其中一個。怎麼修:瀏覽器端的訪客沒有 email 或電話,就在 localStorage 存一個不含個資的隨機碼當外部編號,雜湊後再送,官方文件對 external_id 標示「Hashing recommended」。email 與電話怎麼正規化再雜湊,寫在去重實作那篇。
踩過的坑:伺服器端那一半
轉換 API 的資料由伺服器送出,瀏覽器的阻擋外掛擋不到它,也代表瀏覽器端的檢查工具看不到它。伺服器端最常出事的地方通常不在程式邏輯,而在設定:使用者代理拿錯、回傳端點指錯像素、網域白名單漏列、轉送端點沒有防護。這幾項都藏在環境變數或白名單裡,平常不會有人去看,換落地頁、加網域的時候最容易漏掉。
伺服器端事件的使用者代理全是 node。 現象:事件管理工具顯示使用者代理的涵蓋率全滿,看起來很健康。原因:轉送程式寫成沒帶使用者代理就用請求本身的,而 Node 的 fetch 送出的使用者代理就是字串 node,後端事件全部帶著它送給 Meta。官方文件寫 client_user_agent「is required for website events shared using the Conversions API」,必填不代表隨便填一個就好。怎麼修:用使用者註冊或送出表單當下記下的真實使用者代理,拿不到就不帶,不要拿伺服器自己的值補。
換落地頁,轉換全送到舊像素。 現象:2026 年 8 月 21 日換了新落地頁,24 小時內有 291 筆真實轉換回報給已經沒在用的舊像素,新像素什麼都學不到。原因:報表看的網址換了,但後端回傳轉換的端點設定藏在主機的環境變數裡,沒有跟著換。怎麼修:換落地頁的檢查清單裡,把回傳端點、像素編號和事件來源網址列成必換項目,而且跟廣告切換在同一個時間點改,早換晚換都會歸錯。
追蹤腳本的網域白名單漏列。 現象:同一個落地頁綁了四個網域,其中三個網域上像素根本沒載入,零事件。原因:追蹤腳本只在名單上的網域執行,名單只列了一個子網域。平常廣告只投那個網域看不出問題,哪天廣告改投另一個網域,就是錢照花、Meta 收到零轉換。怎麼修:每個綁定網域都帶著 fbclid 開一次,確認 window.fbq 是函式、而且真的有事件送出。
自架轉送端點誰都能灌。 現象:2026 年 8 月 18 日做安全測試,從外部一行指令就往正式像素灌進一筆 NT$999,999 的假購買事件,沒有任何阻擋,灌進去的事件留在資料集裡刪不掉。原因:前端呼叫的轉送端點網址就寫在頁面程式碼裡,任何人都看得到、都能送。怎麼修:分級防護。事件名不在白名單、來源網域不對、宣稱是後端事件卻沒帶密鑰,這三種直接擋;格式不漂亮的只記錄不擋。我們把這三條套回 6 天的紀錄,真實流量 0 次誤觸;反而格式類規則曾有 1 次是真人手機時鐘快造成的。新規則先只記錄跑一天,確認不會吃掉真轉換再開阻擋。
怎麼驗證事件真的對:工具各看得到什麼
驗證 Facebook Pixel 的事件要分兩段:上線前攔截實際送出的內容,逐字元比對;上線後隔幾天,看 Meta 事件管理工具的診斷與配對品質。每個工具都只看得到一部分,Meta Pixel Helper 只看瀏覽器這一側,轉換 API 的回應只看有沒有收到,事件管理工具的數字又會晚幾天才反映,要組合起來用,任何一個單獨亮綠燈都不算數。
Meta Pixel Helper 現在改名了,官方說明頁寫「Meta Ads Data Advisor (formerly Meta Pixel Helper) is a free browser extension for Google Chrome and Microsoft Edge」,裝好後頁面上會出現小徽章,顯示「the number of Pixel events fired on the current webpage」。它裝在你的瀏覽器裡,看到的是瀏覽器這一側;伺服器端送出的轉換 API 事件不經過你的瀏覽器,它看不到,也看不出 fbclid 在存進資料庫時有沒有被截斷。
| 檢查方式 | 看得到 | 看不到 | 什麼時候用 |
|---|---|---|---|
| 轉換 API 的回應 | 請求有沒有被收下 | 欄位內容對不對 | 每次送出都記錄 |
| Meta Pixel Helper | 這一頁在瀏覽器觸發了哪些像素事件 | 伺服器端事件、存進資料庫的 fbc 有沒有被截斷 | 上線當下逐頁點 |
| 測試事件(test_event_code) | 事件有沒有到 Meta、欄位長什麼樣 | 正式流量的問題,而且測試事件不會被丟掉 | 上線前,正式送出時拿掉 |
| 自己攔截送出內容 | 實際送出的 fbclid、event_id、使用者資料,逐字元 | Meta 端怎麼判讀 | 每次改追蹤程式 |
| 事件管理工具的診斷與配對品質 | Meta 判定的錯誤、各參數涵蓋率 | 當天的變化,數字會晚幾天 | 上線後隔幾天 |
上線前,我們怎麼驗一顆按鈕的事件
- 先攔截再點送往 Meta 的請求全部攔下,假事件不進正式像素
- 帶真實長度的 fbclid用 161 字元以上的值進站,短字串測不出截斷
- 先種一個舊 _fbc模擬回訪者點新廣告,看新值有沒有蓋掉舊值
- 逐字元比對送出的 fbclid 要跟網址一字不差,_fbc 要寫在可註冊網域
我們上線前用 Playwright 開真的瀏覽器跑一遍。先把送往 Meta 的請求全部攔下,測試事件一筆都不准進正式像素。帶一個 161 字元以上、真實長度的 fbclid 進站,用 test123 這種短字串測不出截斷。先種一個舊的 _fbc 再進站,模擬回訪者點了新廣告。接著比對送出的 fbclid 是否跟網址上逐字元相同,並確認 _fbc 真的寫在 example.com.tw 這一層,沒有被瀏覽器丟掉。同一套也拿來驗重複點:攔下像素呼叫後連點同一顆按鈕 5 次,Lead 只能有 1 筆,自家的點擊計數要記到 5 次。
上線後隔幾天,回事件管理工具看三樣東西:診斷分頁有沒有新的警告、各事件的配對品質分數、fbc 與 fbp 這些參數的涵蓋率。這些數字是滯後的,改完當天看不出效果,不要急著下結論。送出前也可以先用格式檢查擋一次:fbc 必須是 fb、數字、13 位數時間、fbclid 四段,格式不對的寧可不送,送錯的比對鍵只會拉低配對品質。
我們的數據追蹤方案
這篇裡的檢查,我們接每個新的廣告帳戶都會跑一次:Pixel 與轉換 API 的轉換事件雙送、同一組 event_id 去重、fbc 與 fbp 照官方格式補齊、同一顆按鈕重複點只送一次、轉送端點加上分級防護,上線前用真的瀏覽器攔截實測,上線後隔幾天看診斷與配對品質。所有像素、資料集都登記在客戶自己名下,合作結束帶得走。
數據追蹤(GA4、Pixel、CAPI)一次性建置 $150 起,規格與交付時程在數據追蹤與歸因設定。廣告已經在跑、想先知道現在的追蹤哪裡有漏,服務頁上有免費的追蹤健診。帳號結構、受眾和出價怎麼設,可以看 meta 廣告完整入門;如果在找人代操,挑廠商前先看廣告代操怎麼選。更多追蹤主題整理在廣告投放與追蹤知識庫。
常見問題
Meta Pixel Helper 顯示事件有觸發,追蹤就沒問題了嗎? 不一定。它看得到的是瀏覽器這一側觸發了哪些像素事件,看不到伺服器端送出的轉換 API 事件,也看不出伺服器存下來、轉送出去的 fbclid 有沒有被截斷或改寫。上線前要攔截實際送出的內容逐字元比對,上線後隔幾天再看事件管理工具的診斷分頁。
fbclid 存進資料庫要留多長的欄位? 至少 512 字元。2026 年 8 月我們量到的真實 fbclid 是 161~201 字元,原本開 120 字元的欄位讓 343 筆裡 336 筆被截斷。上線後看一次長度分佈,大量值剛好等於上限,就是被截了。
fbc 和 fbp 要先雜湊再送嗎? 不用。Meta 客戶資訊參數文件對 fbc、fbp 都標示「Do not hash」,也不能轉大小寫或修剪。要雜湊的是 email、電話這類個人資料,外部編號官方標示建議雜湊。
同一個人按了兩顆不同的按鈕,要算兩筆 Lead 嗎? 要看兩顆按鈕的意圖是否不同。加好友和填表註冊是兩件事,各送一次是對的;同一顆按鈕在同一個工作階段裡重複點,只送一次給 Meta。我們在一個落地頁量到,沒擋重複點時,54 筆 Lead 裡有 9 筆是同一顆按鈕被重複點出來的。
測試事件碼可以留在正式環境嗎? 不行。Meta 官方寫測試事件碼只能用在測試,正式送出時要拿掉;帶測試碼的事件也不會被丟掉,一樣會進事件管理工具。測試時最好在送出前就攔下,不讓假資料進正式像素。
只裝 Facebook Pixel、不裝轉換 API 可以嗎? 可以運作,但會漏。瀏覽器端的像素會被阻擋外掛和瀏覽器的隱私設定擋掉,伺服器端的轉換 API 補的就是這一段;兩邊一起送時要用同一組 event_id 去重,做法在 Pixel 與 CAPI 雙送去重實作。