CAPI Setup Returning 'Server-Side Event Received but Not Deduplicated': The Real Fix
- info wittelsbach
- 5 days ago
- 5 min read
Your CAPI is firing. Events Manager confirms it. But the diagnostic shows the dreaded yellow warning: Server-Side Event Received but Not Deduplicated. Meta is now counting your Purchase events twice — once from pixel, once from CAPI — and your ROAS dashboard is silently inflated by 40-80%.
This is the single most common CAPI failure mode for Indian D2C brands in 2026. The fix isn't complicated, but every guide online gets the details wrong. Here's the real fix that actually works.
First: Confirm Deduplication Is Actually Broken
Open Events Manager → your pixel → Diagnostics tab. Look for the Server Event Not Deduplicated warning. Click it for the impacted event count and percentage.
If more than 5% of your CAPI Purchase events aren't deduplicating, you have a real problem. If it's under 1%, that's normal noise — ignore it.
Cross-check by comparing your Shopify daily order count to your Events Manager Purchase event count. If Events Manager shows roughly 2x your actual orders, deduplication is fully broken.
The Root Cause: event_id Mismatch Between Pixel and CAPI
Meta deduplicates by matching three things across browser and server events: `event_name`, `event_id`, and timestamp within a 48-hour window. If any of those three don't match exactly, both events count.
In 90% of Indian D2C cases, the failure is `event_id` mismatch. Your pixel sends one ID, your CAPI sends a different one, and Meta has no way to know they're the same purchase.
The 5 Most Common event_id Failures
Failure 1: Pixel Has No event_id
You added CAPI later and never updated the browser pixel to pass `eventID`. Pixel fires without an ID, CAPI fires with one, no match possible. This is the most common starter-stack mistake.
Failure 2: Pixel Uses Order ID, CAPI Uses UUID
Your browser pixel passes `eventID: '#1042'`. Your CAPI server generates a fresh UUID for each event. Both are valid IDs but they don't match. Meta counts both.
Failure 3: Order ID Format Differs
Pixel sends `#1042`. CAPI sends `1042`. Meta string-matches strictly — the hash symbol breaks the match.
Failure 4: event_id Generated Twice
Your Shopify Custom Pixel calls a function that generates a UUID. Your CAPI server calls a different function that generates a different UUID. Both events have IDs, neither matches.
Failure 5: Async Pixel Fire Misses event_id
Your pixel snippet has eventID logic but the variable hasn't loaded yet at fire time. Pixel fires with `eventID: undefined` and CAPI fires with the correct ID.
The Diagnostic — Find Your Failure Mode in 5 Minutes
Place a single test order with browser DevTools and CAPI logs both open.
Network tab: filter `facebook.com/tr`, find the Purchase request, copy the `eventID` parameter from the URL.
CAPI server logs: find the matching outbound Purchase event, copy its `event_id` field.
Compare: if the two strings don't match character-for-character, that's your failure.
If pixel has no eventID at all, that's Failure 1.
If both exist but don't match, that's Failure 2-5 depending on shape.
The Real Fix — Aligning event_id Across Pixel and CAPI
The Rule
Use the Shopify order ID (numeric, no prefix, as string) as the `event_id` for both browser pixel and CAPI. Same value, same place, every event.
Pixel Side (Shopify Custom Pixel)
In your Custom Pixel script, when handling the checkout_completed event, extract `event.data.checkout.order.id` and pass it as eventID. Make sure to convert it to string and strip any leading characters.
CAPI Side
On your server, when handling the Shopify order webhook, use the same `order.id` field as `event_id` in the CAPI payload. No UUID generation, no transformation, no formatting.
Validation Step
Place a test order in incognito with Pixel Helper and Test Events both open. Both events should arrive in Test Events within 60 seconds. The deduplication column should show Deduplicated with a green checkmark.
The Secondary Fix — Timing Window
Even with matched event_id, deduplication can fail if events arrive more than 48 hours apart. Pixel typically fires within seconds. CAPI should fire within 60 seconds of the order. If your CAPI sends events via a daily batch job, you'll have intermittent deduplication failures.
Fix: send CAPI events real-time via Shopify webhooks, not batch sync. Webhook delivery is sub-second; batch is whatever interval you set. Real-time CAPI is non-negotiable in 2026.
How Wittelsbach AI Validates CAPI Deduplication End-to-End
Bach AI runs an automated CAPI health check across every connected pixel — comparing your daily order count, your pixel Purchase count, your CAPI Purchase count, and the deduplication rate from Events Manager. When deduplication drops below 95%, it surfaces the exact mismatched event_id pattern with the line of code to fix.
Brands typically discover broken deduplication weeks after the fact, by which point their reported ROAS is fictionally high and their reinvestment decisions are skewed. Bach AI catches it within 24 hours. Connect your Meta account at [app.wittelsbach.ai](https://app.wittelsbach.ai) for a free audit.
Frequently Asked Questions
What deduplication rate is acceptable for CAPI in 2026?
Target above 95% deduplicated. Above 90% is acceptable. Below 85% means a meaningful share of your conversions are being double-counted, which inflates reported ROAS and corrupts learning signal. The deduplication column in Events Manager Diagnostics shows the live rate. If you're below 85% for more than 7 days, treat it as a P0 fix.
Should I use Shopify order ID or a UUID as my event_id?
Shopify order ID. It's already unique per order, exists on both client and server, and never changes. UUIDs work in theory but require both your pixel snippet and your CAPI server to compute the same UUID for the same order — adding fragility for no benefit. Stick with order ID, passed as a string with no prefix.
What happens if CAPI is firing but pixel never fires due to ad blocker?
That's the desired CAPI fallback behavior. Meta will count the event from CAPI only and there's no deduplication needed — only one event exists. The Diagnostics tab won't flag this as a problem. CAPI is specifically designed to recover events that pixel misses due to ad blockers, iOS tracking, or browser failures.
Does CAPI deduplication work for events other than Purchase?
Yes. The same event_id alignment applies to AddToCart, InitiateCheckout, Lead, CompleteRegistration, and ViewContent. The 48-hour window is the same. Meta's deduplication only works when both browser and server send the same event_name AND the same event_id. If you're firing AddToCart on server-side only, no deduplication is needed.
Can I deduplicate CAPI events sent through Shopify's native Meta channel integration?
Yes, Shopify's native Meta channel already passes order ID as event_id for both browser pixel and server-side CAPI. If you're using it without modification, deduplication should be at 95%+ by default. Deduplication failures usually appear when you've installed a custom pixel or custom CAPI server alongside the native integration — two systems passing different IDs.




Comments