top of page
Typographic Black and Blue.png

What Is Meta's Source of Truth for Sales — Pixel, CAPI, or Both Combined

Your Shopify shows ₹8 lakh in last week's revenue. Meta reports ₹6.2 lakh. Your Pixel says ₹5.4 lakh. Your CAPI says ₹6.8 lakh. Which number is right?


Every Indian D2C founder hits this wall. The truth is layered, but knowable. Once you understand how Meta deduplicates Pixel and CAPI events, you can read attribution correctly and stop fighting your own dashboard.


First: Confirm Both Pixel and CAPI Are Firing


Source of truth is meaningless if one of the two signals is broken. Open Events Manager → Overview. You should see purchases reported from both Browser (Pixel) and Server (CAPI) for the last 24 hours.


  • Both firing: Meta deduplicates and uses the combined deduped event as source of truth.

  • Only Pixel firing: Meta uses Pixel, with 20-40% signal loss from iOS/ad blockers.

  • Only CAPI firing: Meta uses CAPI, which can be solid if event-match-quality is high.

  • Neither firing: You have no Source of Truth. Meta optimizes for placeholder signal — disaster.


How Meta Deduplicates Pixel and CAPI Events


When you send the same purchase event from both Pixel (browser) and CAPI (server), Meta needs to know they're the same event so it doesn't count two purchases. It does this through the event_id parameter.


  • Pixel fires Purchase event with event_id = 'order_12345'.

  • CAPI sends Purchase event with event_id = 'order_12345', external_id (hashed customer), email (hashed), phone (hashed).

  • Meta sees matching event_id and identifying parameters → counts as ONE deduplicated event.


If event_id is missing or different, you'll see duplicate counting — ROAS appears inflated 1.5-2x. If event_id matches but customer parameters differ, dedup still works, but match quality drops.


Why Both Combined Is the Source of Truth


Pixel alone loses 25-40% of events to iOS 14.5+ ATT prompts, ad blockers, browser privacy mode, and incognito sessions. CAPI alone misses some browser-side context (page URL, viewport, first-touch attribution data).


Combined and deduplicated, you get the most complete view Meta can build. Match quality typically rises from 60-70% (Pixel only) to 85-95% (both). This is the number Meta's auction optimizer actually trusts.


The Numbers Mismatch Decoded


Shopify vs Meta


Shopify shows all revenue regardless of source — direct, organic, email, ads. Meta only attributes revenue to its own ads with last-click logic inside the attribution window. Always expect Shopify > Meta. The gap is your non-Meta revenue.


Pixel-Only vs Combined


Pixel-only typically underreports by 25-40% on Indian D2C accounts because mobile-first audiences run high iOS share in Tier 1 metros.


CAPI-Only vs Combined


CAPI alone usually closely matches combined, but loses 5-10% on browser-side optimizations and creative testing signals.


How to Achieve 95%+ Event Match Quality


  • Always pass event_id from both Pixel and CAPI for every purchase event.

  • Hash and pass customer identifiers: email, phone, external_id, first_name, last_name, city, zip.

  • Match Pixel parameters across the funnel: same fbp, fbc, client_user_agent.

  • Fire CAPI within 5 minutes of the actual order — older events have lower match quality.

  • Use Conversions API Gateway or a tag manager instead of a Shopify pixel plugin alone — full [CAPI India D2C setup guide here](https://www.wittelsbach.ai/post/conversion-api-capi-for-meta-ads-complete-india-d2c-setup-guide).


Common Mistakes That Break Source of Truth


  1. Different event_ids: Pixel sends 'shopify-12345', CAPI sends just '12345'. No dedup. Revenue double-counted.

  2. Missing customer parameters: CAPI fires without email/phone hashes. Match quality drops below 60%. Meta downweights the signal.

  3. Delayed CAPI: order fires server-side 4 hours later. Pixel already counted it. Dedup window misses, double-count.

  4. Multiple Pixel installs: see our [second Pixel without breaking the first](https://www.wittelsbach.ai/post/install-second-meta-pixel-without-breaking-first-indian-d2c-multi-brand) guide.


How Wittelsbach AI Audits Source of Truth


Bach AI monitors Pixel and CAPI deduplication rates, event match quality, and parameter coverage every hour. When match quality slips below 85% or dedup breaks, you get the exact event_id pattern that's failing and the fix. Most Indian D2C accounts gain 20-35% reported ROAS within 14 days just by closing the signal gap. Try Bach AI on your account at [app.wittelsbach.ai](https://app.wittelsbach.ai).


Frequently Asked Questions


Can CAPI alone replace Pixel?


Functionally yes, but you lose creative testing signals, on-page behavior data, and some attribution paths. Best practice is both running in parallel with proper dedup. The marginal cost of running Pixel alongside CAPI is near zero, and you gain a 10-15% boost in match quality and signal richness.


How long is Meta's dedup window?


Approximately 7 days. Events from both sources within that window are deduplicated. After 7 days, late-arriving CAPI events that didn't dedup will count as net-new, inflating reported numbers. Fire CAPI in real time or within minutes, not hours, to stay inside the window.


Does CAPI improve attribution windows?


Yes, indirectly. CAPI lets Meta see purchases from users who blocked Pixel or used iOS app-tracking restrictions. This extends effective attribution reach by 20-40% for Indian audiences with high iOS share. Match quality directly correlates with attribution recovery.


Is CAPI required for Advantage+ Shopping campaigns?


Not technically required, but Advantage+ performs significantly worse without it. The Advantage+ machine learning model is trained on combined Pixel+CAPI data. Running Advantage+ on Pixel alone is like running a Ferrari on bicycle tires. Set up CAPI before launching Advantage+ at scale.


How do I check if my dedup is working?


Events Manager → Test Events. Watch a live order come through. You should see both Browser and Server events with matching event_id and the Deduplicated label. If you see both events without dedup, your event_id is mismatched. If you see only one event source, the other is broken.

Comments


bottom of page