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 自体は何も送信しませんが、従うと顧客の個人データ(ハッシュ化したメールと電話)と広告プラットフォームのアクセストークンを扱うことになるため、事前に所在地域の同意とプライバシーの義務を確認してください。Skill は、サーバー側の送信で同意を回避することはできないと明記しています。最後の節では、サードパーティのセルフホスト型ツール(Autonnel、Apache-2.0)を紹介し、その GitHub リポジトリから `docker compose up` を実行する手順を示しているため、実行前にそのコードを確認してください。法的な助言ではありません。試用済み:数字入りの場面(2 つのドメインにまたがる決済、注文数とプラットフォームの数値の不一致、クリック ID が付いた注文は 20% のみ)で一度試し、モデルは Skill の 7 つの手順に沿って診断と対応順を示し、Skill の内容と矛盾する点はありませんでした。制限:エンドツーエンドでは実行しておらず、各広告プラットフォームの最新の要件も確認していません。回答の一部(たとえば CPA の悪化を低品質イベントのせいにする点)はモデル自身の推測なので、実際のデータで確認してください。