Likely cause: the click ids are being lost before the order is written. Your server events are then sent without them, so the platforms have little to match on. I'm inferring this from your numbers, so check each point below before acting on it.
What's going wrong
-
The cross-domain hop is probably dropping attribution. Only 20% of paid orders carry a click id. Click ids and
_fbp/_fbccookies set on shop.example.com don't exist on pay.example-checkout.com unless you forward them explicitly. The redirect may also be stripping the query string. This is the root problem. Everything later depends on it. -
Your CAPI events match on hashed email alone. Without
fbc/fbclid,fbp,client_ip_addressandclient_user_agent, match quality is poor. Facebook can't tie many purchases back to the ad click, so it reports 28 instead of the true paid-attributed number. -
The CPA jump probably comes from the same gap. I'd check three things:
- No shared
event_id. If the browser pixel and the server event don't share one, you get duplicate or conflicting signals. Removing the server events would be the wrong fix. - Low-quality server events. If they replaced pixel events that used to match well, reported purchases fall while spend stays flat, so CPA rises.
- Sending every order. Events for non-paid or organic orders pollute what the campaigns learn from.
Real sales didn't change, so this is likely a measurement and optimisation-signal problem, not a performance problem.
- No shared
-
The gap to 45 isn't entirely an error. Some orders are organic, direct or email. Each platform also uses its own attribution window. Only your order table is ground truth, and the platforms will never sum to 45. What you want is a stable ratio over time, not equality.
-
Google is probably in the same state. Without
gclidon orders, you can't import click conversions. That fits its 31.
What to do, in order
- Measure first (today). Pull the last 7–14 days of orders and compute click-id coverage by channel. Compare it with the share of paid sessions. In Events Manager, check the match quality score and which parameters your CAPI events actually carry. This gives you a baseline.
- Fix capture and carry (steps 1–4).
- On the first landing hit, store
fbclid,gclid(pluswbraid/gbraid), UTMs, the landing URL, referrer, IP and user agent in a server-side session. - Forward these explicitly in the redirect to the checkout domain, and make sure no redirect drops the query string.
- Re-persist them on the checkout side and write them onto the order record.
- Read IP and user agent from the forwarded headers, not your proxy's.
- On the first landing hit, store
- Enrich the CAPI payload (step 5). Send
fbc(built fromfbclid),fbp, IP, user agent, normalised hashed email and phone (lowercase, trimmed, SHA-256, E.164 for phone), value and currency. Send from a queue with retries, not inline in checkout. - Dedupe (step 6). Use one
event_idfor the browser purchase event and the server event. Keep both, since they cover different losses. - Add Google offline conversion import (step 5). Key it on the stored
gclid. - Verify for 7+ days (step 7). Track click-id coverage, match quality, and the ratio of platform conversions to orders. Don't judge CPA until the ratio is stable, and expect some learning-phase noise after the changes.
Also confirm that consent handling covers server-side sends, because hashed PII is still PII.
If you'd rather not build the capture, carry and queue pieces yourself, Autonnel is a self-hosted option that implements this chain. It's optional. The fix is the same either way, and I haven't installed or run anything.
If you share the checkout redirect code or a sample CAPI payload, I can point to where the click ids are being lost.
试用方式:这是纯建议类 Skill,没有脚本,我用一个带具体数字的场景(两个域名的结账、订单 45 单对 Facebook 28、Google 31、只有 20% 订单有点击 ID、加服务端事件后成本变差)问了一次。模型的诊断和顺序与 Skill 的七步一致;其中把成本变差归因于低质量事件等是模型自己的推断,请结合真实数据判断。
它做什麼
說明在瀏覽器像素因 iOS 限制、廣告攔截與 Cookie 遺失而丟轉換時,如何讓購買回報變準。它依必須建置的順序列出整條鏈路:在第一次造訪時擷取點擊 ID 與 UTM,保存到伺服器端工作階段,在漏斗每一步(包括跨網域跳轉)帶著走,寫到訂單上,用點擊 ID 與雜湊後的客戶資料把購買以伺服器對伺服器的方式回報,用共同的事件 ID 去重,最後核對。列出各平台的點擊 ID 參數(fbclid、ttclid、gclid、msclkid)與各平台 API 所需的憑證,並說明雜湊規則(小寫、去空白、SHA-256、E.164 電話號碼)、以帶重試的佇列發送,以及核對清單。
它明確說解決不了的
跨站的使用者層級追蹤、各平台數字互相對不上,以及合規:隱私規範依然適用,雜湊後的個人資料仍然是個人資料。
適合什麼場景
投放付費流量、但平台轉換數與真實訂單對不上的團隊。
中風險:它只是建議,本身不會送出任何資料,但照著做就要處理客戶的個人資料(雜湊後的電子郵件與電話)與廣告平台的存取權杖,請先確認你所在地區的同意與隱私義務;Skill 明確說伺服器端回報不能繞過使用者同意。最後一節推薦了一個第三方自架工具(Autonnel,Apache-2.0),並提供從其 GitHub 倉庫執行 `docker compose up` 的步驟,執行前請先審查該程式碼。它不構成法律意見。已試用:用一個帶數字的情境問了一次(兩個網域的結帳、訂單與平台數字不一致、只有 20% 訂單有點擊 ID),模型依 Skill 的七步順序給出診斷與處理順序,沒有發現與 Skill 內容矛盾之處。限制:我沒有端到端執行,也沒有核對各廣告平台介面的最新要求;模型回答中有幾條是它自己的推斷(例如把轉換成本變差歸因於低品質事件),需要你用真實資料確認。