Works with
The common failure mode
Teams add CAPI and suddenly reporting looks inflated — or worse, inconsistent. The problem usually isn't "CAPI is bad." It's that event identity and deduping aren't handled cleanly.
How Kickin handles it
Unique sends counted
We count a server-side event when it successfully sends a unique event to Meta or GA4
Auto deduplication
Duplicates are deduped automatically (not counted)
Failed sends excluded
Failed sends and retries are not counted
Why this matters
Clean deduping keeps your signal usable and prevents "phantom improvements" in platform dashboards.
How event_id-based deduplication works
Meta uses event_id to match browser events with server events. Here's the mechanism:
1. Generate a unique event_id
When the conversion happens (e.g., purchase confirmation), create a unique identifier. This should be the same ID used by both the pixel and CAPI.
event_id: "order_12345_1707500000"
2. Send via both channels
The pixel fires client-side with the event_id. CAPI sends server-side with the same event_id. Meta receives both and matches them.
3. Meta dedupes automatically
When Meta sees the same event_id + event_name combination within a 48-hour window, it counts as one conversion — not two.
Common CAPI deduplication mistakes
These are the patterns we see most often when deduplication goes wrong — and how to fix them.
❌ Different event_ids
Pixel uses order ID, CAPI uses a UUID. Meta sees two different events.
✓ Use the same ID generation logic for both
❌ Missing event_id on one channel
CAPI sends event_id, but the pixel never included it. No match possible.
✓ Ensure both pixel and CAPI include the event_id parameter
❌ Timing gap too large
Pixel fires immediately, CAPI sends 3 days later. Outside the 48-hour window.
✓ Send CAPI events as close to real-time as possible
❌ Event name mismatch
Pixel fires "Purchase", CAPI sends "purchase". Case sensitivity matters.
✓ Use identical event names (case-sensitive match)
See also: Server-side tracking, Meta pixel monitoring, Pricing