Back to Intel
Analytics Aug 26, 2026 • 9 min read

Meta Pixel & CAPI Setup: Fix Tracking Before You Scale

A step-by-step guide to auditing your Meta Pixel, wiring up the Conversions API with proper deduplication, and raising Event Match Quality — written for Indian D2C stores on Shopify.

Every few weeks someone sends us the same message. Spend is up, ROAS is down, Advantage+ has “stopped working,” and they want to know which campaign structure to try next.

Nine times out of ten, the campaign structure is fine. The data going back to Meta is broken. And when the signal is broken, scaling doesn’t fix the problem — it pays more money to repeat it, faster.

This is the audit we run on every ad account before we touch a single budget. It takes about two hours. Work through it in order.

Why bad tracking is worse than no tracking

Meta’s delivery system is a feedback loop. You show it who converted, it goes and finds more people like them. That is genuinely all Advantage+ is doing under the hood.

So think about what happens when the loop is fed wrong data:

  • Events fire on the wrong page. Purchase fires on page load instead of the thank-you page, so Meta learns that “people who reach checkout” are your buyers. It then optimises hard toward window shoppers, and your cost per actual order climbs while the dashboard looks fine.
  • Events are duplicated. Two pixels, or a pixel and an untagged server event, and every order counts twice. Reported ROAS reads 4.2 when the real number is 2.1. You scale on the fake number.
  • Events are missing. Somewhere between 20% and 40% of browser events never reach Meta at all — ad blockers, iOS tracking prevention, Safari’s cookie limits, people bouncing before the pixel loads. Meta optimises on the subset it can see, which is skewed toward Android users on Chrome.

None of these show up as an error message. That’s what makes them expensive. The account just quietly gets worse and everyone blames the creative.

Step 1: Audit what’s actually firing

Install the Meta Pixel Helper Chrome extension, open your store in an incognito window, and walk the funnel like a customer would: product page → add to cart → checkout → place a real order (use a ₹1 test product and refund it afterwards).

At each step you want exactly one event, fired once, carrying the right parameters.

StepEventMust include
Product pageViewContentcontent_ids, value, currency
Add to cartAddToCartcontent_ids, value, currency
Checkout startInitiateCheckoutvalue, currency, num_items
Order placedPurchasevalue, currency, content_ids, order_id

The three problems we find most often, in order of frequency:

Two pixels are installed. Almost always because the pixel was hardcoded into the theme and the Facebook & Instagram sales channel was connected later. Every event doubles. Check theme.liquid, your app list, and Google Tag Manager before assuming there’s only one.

value and currency are missing. Without them Meta cannot compute ROAS at all, so value-based bidding has nothing to optimise on. If your Purchase events show a count but no revenue, this is why.

Purchase fires on page load somewhere it shouldn’t — a cart page, a “processing payment” interstitial, or on every refresh of the thank-you page. Refresh the confirmation page twice and watch whether Purchase fires again. It shouldn’t.

Step 2: Add the Conversions API — with a shared event ID

The Conversions API (CAPI) sends the same events from your server instead of the browser. Ad blockers can’t touch it, Safari can’t limit it, and it fires whether or not the customer’s connection dropped mid-redirect.

There is exactly one rule that matters, and it’s the one people get wrong:

Send the same event_id from both the browser pixel and CAPI for the same conversion. That shared ID is how Meta knows the two messages describe one order rather than two.

Browser Pixel  ──► Purchase  event_id: ORD-10482
Server CAPI    ──► Purchase  event_id: ORD-10482   ← same ID, deduplicated

Get this right and CAPI recovers the events the browser lost. Get it wrong and you have simply built a machine that double-counts every order — which is strictly worse than where you started, because now your ROAS looks great.

On Shopify: the native Facebook & Instagram channel already sends CAPI with deduplication handled. Verify that it’s on before you install a third-party CAPI app. We regularly find stores paying for a tracking app that is doing nothing except duplicating what Shopify already sends for free.

Not on Shopify: you’ll be sending events from your backend or through a tool like Stape or GTM server-side. The event_id still has to come from a value both sides can agree on. Use the order ID. Don’t generate a random ID on the server — it will never match the browser’s.

Step 3: The Indian D2C blind spot — third-party checkouts

This one costs local brands more money than everything above combined, and almost nothing written about Meta tracking mentions it.

If your store uses GoKwik, Shiprocket Checkout, Simpl, or any one-click COD checkout, the customer usually never lands on Shopify’s native thank-you page. The checkout opens in a modal or on a different domain, the order is created through an API, and your carefully configured Purchase event simply never fires for those orders.

The symptoms are distinctive: your Shopify admin shows 200 orders, Meta shows about 60, and the gap is almost entirely COD. You conclude Meta is “under-reporting,” discount your ROAS mentally, and carry on. Meanwhile Meta is optimising your entire account on prepaid customers only — which in most Indian ethnic wear and fashion categories is a minority of your buyers.

The fix is to send those orders server-side. Every one of these checkout providers exposes an order webhook. Point it at a CAPI endpoint, pass the order ID as event_id, and include the customer email and phone the checkout already collected. Once Meta can see your COD buyers, it can go and find more of them.

Step 4: Raise your Event Match Quality

Open Events Manager → your pixel → the event → Event Match Quality. Meta scores each event on how confidently it can tie the conversion to a real person. Below 5.0 is costing you conversions; 7.0 and up is healthy.

Send every parameter you legitimately have, hashed:

  • Email and phone number — the two heaviest-weighted signals by a distance
  • First name, last name, city, state, postcode, country
  • The fbp and fbc cookies (fbc is what carries the click ID from the ad)
  • IP address and user agent — server-side events only

A note specific to India: normalise phone numbers before hashing. Meta expects country code with no plus sign, no spaces, no leading zero — so 919876543210, not +91 98765 43210 or 09876543210. Sending the raw string your form collected means those numbers match nothing, and phone is one of the strongest identifiers you have. This single fix has moved accounts from “Poor” to “Good” match quality on its own.

Step 5: Verify, then scale

Make your changes, then wait 3 to 7 days before judging anything. Meta needs to reprocess, and a two-day read on a fresh setup tells you nothing.

Then check four things:

  1. Deduplication status. Events Manager should read “Processed and deduplicated” for Purchase. If it says events are being received separately, your event_id isn’t matching.
  2. Reported orders vs. real orders. Pull your Shopify order count for the same window and compare. Within 5–10% is a healthy setup. A 40% gap means something is still missing — check COD orders first.
  3. Event Match Quality. It should have moved. If it hasn’t, your customer parameters aren’t actually being passed, whatever the integration claims.
  4. Attribution windows. Make sure you’re comparing 7-day click / 1-day view against the same window everywhere. Half the “my ROAS dropped” panics we get sent are two dashboards on different attribution settings.

Only when those four line up should you scale. Clean signal makes Advantage+ genuinely smart. Dirty signal makes it confidently, expensively wrong — and it will spend your budget either way.

Common questions

How long does a proper Pixel and CAPI setup take? For a standard Shopify store with the native Facebook channel, about two hours of work and then a week of verification. If you’re on a third-party COD checkout and need webhooks wired up, budget a couple of days.

Do I still need the browser pixel if I have CAPI? Yes. Run both. The browser pixel captures signals the server doesn’t have (cookies, on-site behaviour), and Meta explicitly recommends redundant setup with deduplication rather than server-only.

Why does Meta report fewer conversions than Shopify? Some gap is normal — Meta only counts orders it can attribute to an ad within your attribution window. A gap above roughly 10–15% usually means missing events, not attribution. Check COD orders and duplicate pixels first.

Will fixing this improve performance immediately? Not on day one. You’re improving the input to a learning system, so the benefit shows up over the following one to two weeks as delivery recalibrates. What you often do see immediately is reported ROAS dropping — because it was inflated by double-counting. That’s the setup working, not breaking.


If any of this sounds like your account, we run a free 30-minute Pixel and CAPI audit — we’ll walk your funnel live, show you exactly what’s firing, and send you the fixes whether or not you work with us. Book a slot.

Apply this to your business

Enjoyed the article? Let's discuss how we can implement these specific insights to scale your brand's performance.