Meta Pixel and Conversions API on Shopify in India: Fixing Duplicate and Missing Purchases
Anupriya Das, Ecommerce Analytics Associate14 min read
Use Meta's Facebook & Instagram app as your only Purchase sender, with customer data sharing set to Maximum and the app pixel's data access set to Always on. Then check the Purchase event in Meta Events Manager: the Event deduplication tab, event coverage of at least 75% and an Event Match Quality score of 6.0 or more. In audits of Indian Shopify stores, 28% sent duplicate Purchase events and 27% sent fewer Purchase events than they had orders.
How many Shopify stores send Meta the wrong purchases?#
More than a quarter of audited Indian Shopify stores had each problem: 28% sent duplicate Purchase events, and 27% sent fewer Purchase events than they had orders. These benchmarks come from ProfitBox360 research, 2025 (client data and shopper surveys).
| Measure | Benchmark |
|---|---|
| Audited Shopify stores sending duplicate Purchase events to Meta | 28% |
| Audited Shopify stores where Meta received fewer Purchase events than store orders | 27% |
| Average Event Match Quality for Purchase, stores using the Conversions API | 6.9 out of 10 |
| Change in Meta-attributed purchases after adding the Conversions API | +18.5% |
| Change in Meta cost per purchase after fixing duplicate and missing events | −13% |
In the audits, duplicates came from the browser pixel and the Conversions API sending the same purchase without a shared deduplication ID. Missing purchases came mainly from ad blockers stopping the browser pixel.
Separately, Meta reports about 25% more purchases than brands can match to store orders, or about ₹1,25,000 for every ₹1,00,000 of matched orders. Clean up the events first, so that comparison starts from sound data.
What a wrong count does to your numbers#
Illustrative example: a store takes 1,000 online orders in a month.
- Average order value is ₹1,000 (62.5% COD orders at ₹850 and 37.5% prepaid orders at ₹1,250), so orders total ₹10,00,000
- Duplicate case: a leftover pixel in the theme sends a second Purchase, without the shared event ID, on 300 orders
- Missing case: the store shares data at the Standard level (browser pixel only), and the Purchase event fails on 150 orders
| Case | Purchase events Meta receives | Purchase value Meta sees | Against store orders |
|---|---|---|---|
| Correct setup | 1,000 | ₹10,00,000 | 0% |
| Duplicates | 1,300 | ₹13,00,000 | +30% |
| Missing events | 850 | ₹8,50,000 | −15% |
In the duplicate case, Meta counts 300 orders twice and sees ₹3,00,000 of sales that never happened. Meta warns that duplicates inflate conversion numbers and can mislead optimisation and budget decisions. In the missing case, ₹1,50,000 of real sales is invisible to Meta, so it can't credit the ads or learn from those buyers.
Why Shopify stores get duplicates and gaps#
Duplicates usually mean a second Purchase sender: a leftover theme pixel, a custom pixel in Customer events, a second tracking app or a checkout app firing its own Purchase. Meta counts a browser event and a server event once only when their event name and event ID match. Two browser events without a shared event ID both count, and none of those extra senders shares the Facebook & Instagram app's event ID.
Gaps usually start in the browser. At the Standard setting, only the browser pixel sends data, and an ad blocker can stop it. Shopify's purchase event fires on the Thank you page and doesn't fire at all if that page fails to load. So a buyer who closes the browser after paying, before that page loads, is missed.
The Conversions API closes that gap. It sends the purchase from Shopify's server to Meta's server, which browser ad blockers can't block.
How do you set up the Conversions API on Shopify?#
Install Meta's Facebook & Instagram app, set customer data sharing to Maximum and set the app pixel's data access to Always on. Then make the app your only Purchase sender. The app sets up the pixel and the Conversions API together, and Meta says Shopify handles the deduplication parameters automatically.
Check you have the right access#
Meta lists these requirements:
- A Shopify online store that isn't password protected, on the Basic Shopify plan or higher
- A Facebook Page for the business
- A Meta business portfolio (formerly Business Manager) that owns that Page
- Admin permission for that business portfolio
Install and connect the app#
- In your Shopify admin, click Sales channels.
- Select Facebook and Instagram and click Add app, then click Add sales channel.
- Click Start setup, then Next.
- Click Log in with Facebook and sign in.
- Follow the prompts for commerce, ads and Meta pixel setup, choosing your existing business portfolio, Page and ad account.
- Accept the Terms and Conditions and click Submit.
Connect the pixel your campaigns already optimise for. A new pixel starts with no history, and ad sets using the old one won't see its events.
Turn on the Conversions API#
In Shopify, go to Sales channels > Facebook & Instagram > Settings > Data sharing settings. Turn on customer data sharing and choose a level.
| Level | What it sends |
|---|---|
| Standard | Browser pixel only, which an ad blocker can stop |
| Enhanced | Pixel plus the Conversions API, which sends the purchase event server to server; shares name, location, email and phone |
| Maximum | Pixel and Conversions API with Meta's latest advertising technology; same data sharing as Enhanced |
Choose Maximum. Meta asks Shopify sellers to select Enhanced or Maximum. Shopify says the levels differ depending on when you installed the app, so an older install may show different options.
Sharing customer details brings legal duties. Shopify tells stores to update their privacy policy to explain what they collect and share. Meta's Business Tools Terms require lawful rights to share the data, and contact details must be hashed.
Give the app pixel full data access#
The app adds an app pixel to Shopify's Customer events. App pixels start on optimised data access, where Shopify decides how much data to allow. Always on gives the pixel all customer and business data without limits. Meta recommends Always on for the most reliable performance.
To change it, go to Settings > Customer events, select the Facebook & Instagram pixel, choose Always on and save.
Remove every other Purchase sender#
Keep the app as the only route for Purchase. Check these four places:
- Theme code: in theme.liquid and other theme files, search for fbq or your pixel ID, and remove any Meta pixel code.
- Settings > Customer events: look for a custom pixel that sends Purchase to Meta, and for other apps' pixels.
- Settings > Checkout > Additional scripts: this box has been view-only since 28 August 2025. For stores on non-Plus plans, 26 August 2026 was the deadline to upgrade the Thank you and Order status pages, and Shopify upgraded the rest automatically. The upgrade replaced old customisations, so Purchase code kept there no longer runs.
- Other apps: review tracking, review, upsell and checkout apps. If a third-party checkout sends its own Purchase to your pixel, ask the provider how it avoids duplicates. Keep one sender per order, and test with a real order.
Where do you check deduplication in Events Manager?#
Read the Event deduplication tab in the Purchase event's details. The path is Events Manager > Data sources > your dataset > Purchase > View details > Event deduplication.
What Meta needs to count a purchase once#
Meta treats a browser event and a server event as one purchase when two things match:
- The pixel's event name matches the server's event_name, such as Purchase.
- The pixel's eventID matches the server's event_id.
Without an event ID, Meta can match on the event name plus fbp (the browser ID) or external_id. That method generally works only when the browser event arrives first. Events with matching IDs are deduplicated only if they arrive within 48 hours of the first one, and Meta generally keeps the copy received first.
Read the Event deduplication tab#
The tab shows two measures:
- Rate of Events Deduplicated: the share of events deduplicated from each source. Higher is better, and Meta shows a warning when the rate is too low.
- Rate of Deduplication Key Usage: the share of events from each source that carry each key, such as event_id. Its Overlap figure is the share of events arriving with the same key from both sources.
Low overlap means one source sends keys that aren't unique, or only one source sends a key. For Purchase, that points to a second sender, so recheck the four places listed in the setup section.
Test with a real order#
- In Events Manager, click Data sources, select your dataset and click Test events.
- Enter your store's web address and click Open website. Activity is recorded only while the Test events page stays open.
- Place a real order, such as a low-value COD order that you cancel afterwards.
- Look for one Purchase for the order. Test events shows which events were processed and which were deduplicated.
- After about 20 minutes, open the dataset's Overview. Meta says server events should be visible within 20 minutes, and the Connection Method column shows how each event arrived.
Meta Ads Data Advisor, the Chrome extension that replaced Meta Pixel Helper, also shows which events fire in the browser. Turn off your ad blocker before using it.
Don't judge duplicates from the Overview total#
Use the Event deduplication tab and a test order to find duplicates, because the Overview counts events before deduplication. A store sending every purchase through both the pixel and the Conversions API can show up to twice as many Purchase events as orders there, even when deduplication works. Ads Manager shows fewer, because it counts only purchases it attributes to ads.
How do you find missing Purchase events?#
Check event coverage first, then compare Meta's server Purchase events with Shopify orders, then read Diagnostics. Coverage below 75% points to purchases going missing, and Diagnostics lists any issue Meta has detected, with steps to fix it.
Check event coverage#
The Event coverage tab, in the same Purchase event details, compares events received through the Conversions API with unique browser events from the pixel. Meta suggests aiming for at least 75%. For every 1,000 browser Purchase events, that means at least 750 server Purchase events.
If coverage is low, check that data sharing is set to Enhanced or Maximum. Then check that the app is connected to the dataset your ads optimise for.
Compare Purchase events with Shopify orders#
Once a week, compare each day's Shopify online store orders with Meta's server Purchase events for the same day. The two should be close. Check any gap the same day it opens, especially after a theme change, an app install or a sale.
Meta also sends alerts when events used in campaigns drop sharply against a week earlier and the 7-day average. For a sudden drop, Meta suggests checking recent website changes, Test events, Diagnostics and any domain allow or block lists in Traffic permissions. The dataset's History tab shows who changed the pixel or Conversions API, and when.
Read the Diagnostics tab#
Go to Events Manager > Data sources > your dataset > Diagnostics. A red icon next to a data source means it has critical issues. The tab has three lists:
- Active: issues detected in the last 24 hours that you haven't resolved or ignored.
- Previously detected: issues you didn't act on within three days. Their fix instructions are removed, so act early.
- Ignored: issues you chose to ignore.
Fix red issues first, because they're critical. Yellow warnings are lower priority, such as a value parameter that looks wrong or events arriving from a new domain.
What Event Match Quality should Purchase events reach?#
Aim for at least 6.0 out of 10, the level Meta's developer guide suggests, and try to beat the 6.9 average of audited Indian Shopify stores using the Conversions API.
Event Match Quality scores from 0 to 10 how well the customer details sent with a server event can match it to a Meta account. It covers website events sent through the Conversions API, and it uses the last 48 hours of data. Find it on the Event matching tab of the Purchase event's details.
Meta says better matching can increase the conversions it reports and lower cost per result. It ranks the customer details it can match on:
| Customer detail | Meta's priority |
|---|---|
| Email address | High |
| Click ID (fbc) | High |
| Phone number | Medium |
| External ID (your own customer ID) | Medium |
| Browser ID (fbp) | Medium |
| Country | Medium |
| Date of birth | Medium |
| First name, surname, town or city, pin code | Low |
To raise the score:
- Collect an email address as well as a phone number at checkout where you can. Email is high priority, and phone is medium.
- Keep India's 91 country code on phone numbers. Meta needs a country code for matching, even when every customer is in one country. This matters most if another app or your own server sends events.
- Send ad clicks straight to your store. The click ID is built from the fbclid part of the ad's web address, so a redirect that drops it loses a high-priority match key.
- Stay on Enhanced or Maximum, which share name, location, email and phone.
What changes in Meta's reports after the fix?#
Meta's reported numbers move even when orders don't: stores that added the Conversions API saw Meta-attributed purchases rise 18.5%, and stores that fixed tracking saw reported cost per purchase fall 13%.
For every 100 purchases Meta reported before, stores that added the Conversions API saw about 118.5 after. At a ₹1,000 order, that's ₹1,18,500 of reported purchases instead of ₹1,00,000.
The two figures come from different groups of stores, so don't add them together. Removing duplicates lowers the reported purchase count, which works against the gain from recovered events.
What a 13% lower cost per purchase looks like#
Illustrative example: a store spends ₹2,00,000 a month on Meta ads.
- Before the fix, Meta reports the benchmark 3.65x ROAS at the ₹1,000 average order
- After the fix, reported cost per purchase falls by the 13% benchmark, with the same spend and order value
- Purchases are rounded to whole orders, and rupee values use the unrounded count
| Measure | Before | After |
|---|---|---|
| Reported purchase value | ₹7,30,000 | ₹8,39,080 |
| Reported purchases | 730 | 839 |
| Cost per purchase | ₹273.97 | ₹238.36 |
| Reported ROAS | 3.65x | 4.2x |
- Cost per purchase before: ₹2,00,000 ÷ 730 = ₹273.97
- Cost per purchase after: ₹273.97 × 87% = ₹238.36
- Purchases after: ₹2,00,000 ÷ ₹238.36 = 839
- Reported ROAS after: ₹8,39,080 ÷ ₹2,00,000 = 4.2x
Each purchase costs ₹35.62 less on the report. Meta shows about 109 more purchases, worth about ₹1,09,080, for the same ₹2,00,000. Part of that is Meta now seeing orders it missed. Part may be better delivery from better-matched events.
What to do after the fix#
- Write the date of the fix in your reporting sheet, so nobody reads the jump as better ads.
- Compare the four weeks after with the four weeks before on Shopify orders, not only on Meta's numbers.
- Keep matching Meta purchases with Shopify orders by order ID every month.
FAQ#
Should you keep a Meta pixel in theme code as a backup?#
No. A second browser pixel sends Purchase without the Facebook & Instagram app's event ID, so Meta counts both copies. The app already sends Purchase from the browser and, at the Enhanced or Maximum level, from Shopify's server. That server route is the backup. Remove the theme code and test with a real order.
Do ad blockers stop the Conversions API?#
No. Browser ad blockers can stop the Meta pixel, but the Conversions API sends the purchase from Shopify's server to Meta's server, which a browser can't block. On Shopify, that route is on only at the Enhanced or Maximum data-sharing level. At the Standard level, a blocked pixel means a missing purchase.
Does the Conversions API send COD orders to Meta?#
Yes. Shopify's purchase event fires when checkout completes, so a COD order reaches Meta like a prepaid one. The event is sent at the moment of purchase, so it can't reflect a COD order refused at the door days later. Judge ads on delivered orders from Shopify and courier data, not on Meta's purchase count.
How soon do Purchase events show in Events Manager?#
Meta says server events should be visible in Events Manager within 20 minutes of being sent. Test events shows browser events live and keeps them for 24 hours. A newly set-up event can take 30 minutes or more to reach analytics. Event Match Quality uses 48 hours of data, so wait two days before judging a change.
Do you need a paid Conversions API app on Shopify?#
Most Shopify stores don't. Meta's free Facebook & Instagram app sends Purchase through both the pixel and the Conversions API, and Meta says Shopify handles the deduplication parameters automatically. Add a paid tool only if coverage or Diagnostics show a gap the app can't close. Then switch off the duplicate sender and test again.
Why did Meta Purchase events drop in late August 2026?#
Old tracking code on the Thank you page is the likely cause, if your Purchase event lived in Additional scripts. Shopify upgraded non-Plus stores' Thank you and Order status pages by 26 August 2026, replacing old customisations, so those scripts stopped. Connect the Facebook & Instagram app, set data sharing to Maximum and test one order.
Anupriya Das
Ecommerce Analytics Associate, ProfitBox360Anupriya writes about ecommerce tracking, attribution and profitability. Her articles explain how to interpret store and advertising data, calculate acquisition costs and contribution margins, and recognise gaps that affect business decisions.
How this research is checked, and corrected