홈 / Skills / 브랜드·마케팅 / 서버 사이드 전환 추적 (Server-Side Conversion Tracking)
브랜드·마케팅

서버 사이드 전환 추적 (Server-Side Conversion Tracking)

awesome-copilot communityMITSkill 언어: 영어
라이선스 확인됨스크립트 없음중간 위험
데모실행 기록 · claude-sonnet-5-5 · 2026년 10월
We run a Shopify-style store with a separate checkout domain (shop.example.com -> pay.example-checkout.com). Last week we had 45 orders in our database, but Facebook reports 28 purchases and Google Ads reports 31. We already send Facebook CAPI events from our backend, using hashed emails only. About 20% of paid orders have a click id saved. Facebook CPA also got worse right after we added the server events. What is going wrong, and what should we do, in what order?
Skill: server-side-conversion-tracking

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

  1. The cross-domain hop is probably dropping attribution. Only 20% of paid orders carry a click id. Click ids and _fbp/_fbc cookies 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.

  2. Your CAPI events match on hashed email alone. Without fbc/fbclid, fbp, client_ip_address and client_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.

  3. 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.

  4. 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.

  5. Google is probably in the same state. Without gclid on orders, you can't import click conversions. That fits its 31.

What to do, in order

  1. 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.
  2. Fix capture and carry (steps 1–4).
    • On the first landing hit, store fbclid, gclid (plus wbraid/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.
  3. Enrich the CAPI payload (step 5). Send fbc (built from fbclid), 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.
  4. Dedupe (step 6). Use one event_id for the browser purchase event and the server event. Keep both, since they cover different losses.
  5. Add Google offline conversion import (step 5). Key it on the stored gclid.
  6. 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 제한, 광고 차단기, 쿠키 소실로 브라우저 픽셀이 전환을 놓칠 때 구매 보고를 정확하게 만드는 방법을 설명합니다. 반드시 지켜야 할 구축 순서대로 전체 흐름을 제시합니다. 첫 방문에서 클릭 ID와 UTM을 수집하고, 서버 측 세션에 저장하고, 도메인 간 이동을 포함한 모든 퍼널 단계에서 넘겨 주고, 주문에 기록하고, 클릭 ID와 해시한 고객 정보로 구매를 서버 대 서버로 보고하고, 공통 이벤트 ID로 중복을 제거하고, 마지막으로 검증합니다. 플랫폼별 클릭 ID 파라미터(fbclid, ttclid, gclid, msclkid)와 각 API에 필요한 자격 증명, 해시 규칙(소문자, 공백 제거, SHA-256, E.164 전화번호), 재시도가 있는 큐로 전송하기, 검증 체크리스트를 다룹니다.

해결하지 못한다고 스스로 밝히는 것

사이트 간 사용자 단위 추적, 플랫폼별 수치 일치, 동의 문제: 개인정보 규정은 그대로 적용되며 해시한 개인 데이터도 개인 데이터입니다.

이런 때 좋습니다

유료 광고를 운영하는데 플랫폼의 전환 수가 실제 주문과 맞지 않는 팀.

참고 및 위험

중간 위험:조언일 뿐 스킬이 직접 데이터를 보내지는 않지만, 따르면 고객의 개인 데이터(해시한 이메일과 전화번호)와 광고 플랫폼 액세스 토큰을 다루게 되므로 해당 지역의 동의와 개인정보 의무를 먼저 확인하세요. 스킬은 서버 측 전송이 동의를 우회하는 수단이 될 수 없다고 명시합니다. 마지막 절에서는 서드파티 자체 호스팅 도구(Autonnel, Apache-2.0)를 추천하며 GitHub 저장소에서 `docker compose up`을 실행하는 방법을 보여 주니, 실행 전에 해당 코드를 검토하세요. 법률 자문이 아닙니다. 시험 실행함: 숫자가 있는 상황(두 도메인에 걸친 결제, 주문과 플랫폼 수치 불일치, 클릭 ID가 있는 주문은 20%뿐)으로 한 번 물었고, 모델은 Skill의 7단계 순서에 따라 진단과 조치 순서를 제시했으며 Skill 내용과 모순되는 점은 없었습니다. 제한: 끝까지 실행해 보지 않았고 각 광고 플랫폼의 최신 요건도 확인하지 않았습니다. 답변 중 일부(예: CPA 악화를 저품질 이벤트 탓으로 돌리는 것)는 모델 자신의 추정이므로 실제 데이터로 확인하세요.