Skip to content

How to Fix Duplicate Conversions in Facebook Ads Manager

To fix duplicate conversions in Facebook Ads Manager, first identify the source of duplication, typically involving redundant pixel events, server-side API misconfigurations, or overlapping attribution windows.

Three platforms, three answers, one budget to defend. Your GA4 export already holds the answer, and the first finding is free and never leaves your browser. Get your first finding free

By , Founder & CEOUpdated 8 min read

Run the numbers for your store: the free break-even ROAS calculator.

How to Fix Duplicate Conversions in Facebook Ads Manager

Quick Answer: Meta merges a Pixel event and a Conversions API event into one only when both carry the same event name and the same event ID and arrive within 48 hours of each other; otherwise Facebook Ads Manager counts the purchase twice. So the fix is usually three things: send one shared event ID with every browser and server event, make each event fire once per action, and remove any second app or script that sends the same purchase.

Duplicates flatter every number in Ads Manager: purchases, ROAS and cost per purchase all look better than your Shopify orders say, and budget decisions follow the inflated conversion count.

Understanding the Roots of Duplicate Conversions Facebook Ads

The Pixel reports from the browser and the Conversions API (CAPI) from your server, so every purchase can reach Meta twice, and Meta is supposed to merge the pair. Duplicates appear when something stops the merge or sends an extra copy. The usual causes:

Redundant Pixel Events: Two pixel events set to fire for the same action. For instance, a "Purchase" event firing on the thank-you page and again from a separate custom script.

Pixel and CAPI Overlap Without Deduplication: When the Pixel and CAPI both send the same purchase without a shared event ID, or under different event names, Meta counts two purchases. This is the one to check first.

Incorrect Event Matching: Without an event ID, Meta can fall back on the browser ID (fbp) or your external_id to pair the two events, and only when the browser event arrives first. If those values are missing or differ between the two events, Meta can't pair them and counts both.

Multiple Pixels or Ad Accounts: Less common, but two pixels on the same domain, or events sent to more than one ad account without clear segmentation, count the same purchase in more than one place.

Attribution Window Overlap: Not a duplicate event, but it looks like one: Meta, Google Ads and your email tool each credit the same order by their own rules, so the platforms added up report more purchases than you had orders.

Stage 1: Technical Solutions for Fixing Duplicate Conversions

See also: How to Fix Facebook Pixel Not Firing on Shopify

See also: How to Fix Facebook Ads Not Tracking Conversions on Shopify

Five fixes, in the order to try them.

1. Implement Server-Side Deduplication Using event_id

When you run both the Pixel and the Conversions API, a shared event ID is the fix that matters most; Meta's deduplication guide has the full rules.

How it works: When an event occurs (a purchase, say), you generate a unique event_id for that one occurrence and send it with both the Pixel event and the Conversions API event. When Meta receives two events with the same event name and event_id within 48 hours, it counts them as one.

Implementation Steps:

Generate a Unique event_id: For each conversion event (Purchase, AddToCart, InitiateCheckout), generate an ID that's unique to that one occurrence, such as a UUID, and make it available to both the page and your server.

  • Example (PHP): uniqid('', true)
  • Example (Node.js): crypto.randomUUID()

Pass event_id to Pixel: The Pixel takes the ID as eventID, in a fourth argument after the event data, not inside it.

  • fbq('track', 'Purchase', { value: 100.00, currency: 'EUR', content_ids: ['product123'], content_type: 'product' }, { eventID: 'YOUR_UNIQUE_EVENT_ID' });

Pass event_id to CAPI: When you send the same event through the Conversions API, put the exact same ID in the event_id field, under the same event name (Purchase in both).

  • { "data": [ { "event_name": "Purchase", "event_time": 1678886400, "action_source": "website", "event_id": "YOUR_UNIQUE_EVENT_ID", "user_data": { "em": ["hash_of_email"] }, "custom_data": { "value": 100.00, "currency": "EUR" } } ] }

Verify Deduplication: In Events Manager, check the event's rate of events deduplicated; Meta's guide to verifying your setup says higher percentages are better. Near zero, while both the Pixel and the Conversions API send purchases, means the IDs aren't matching.

2. Refine Facebook Pixel Event Triggers

Make sure each Pixel event fires when you intend it to, and only once per action.

Review Standard Events: Check your website's code or Tag Manager (e.g., Google Tag Manager) for standard events like PageView, ViewContent, AddToCart, InitiateCheckout, and Purchase.

  • Purchase Event: This should fire only on the order confirmation/thank you page, and only once per order: a reload of that page shouldn't send a second one. Verify that no other scripts or plugins are also firing a Purchase event on the same page.
  • AddToCart Event: This should fire when an item is added to the cart, not just when the product page is viewed. Ensure it doesn't fire multiple times if a user clicks "add to cart" repeatedly without refreshing the page.

Custom Events: If you use custom events, check them the same way: specific triggers that don't overlap.

Use Google Tag Manager (GTM) for Control: GTM gives you control over when tags fire. Test each trigger in preview mode, and base triggers on URL paths, data layer pushes or specific page elements so each tag fires once.

3. Audit Conversions API (CAPI) Setup

A misconfigured Conversions API setup is a common source of duplicates. If yours runs on Shopify, here's how to set up the Conversions API on Shopify step by step.

Event Matching Parameters: Send as many customer information parameters with your CAPI events as you have: email (em), phone (ph), first and last name (fn, ln) and external_id, hashed with SHA-256 before sending. More of them raise your "Event Match Quality", and external_id also gives Meta a fallback for pairing browser and server events.

  • Example: { "em": ["hash_of_email_1", "hash_of_email_2"], "ph": ["hash_of_phone"] }

action_source Parameter: Set action_source on every CAPI event; for purchases on your site it's website.

Payload Structure: Check your payloads against Meta's specification: a malformed payload can be processed wrongly or miss deduplication.

Timestamp Accuracy: Set event_time to when the event actually happened, not when your server got round to sending it. Meta rejects a whole request if any event in it is more than 7 days old.

Test Events Tool: Use the Test Events tab in Events Manager: place a test purchase with the Pixel active and your server events carrying the tab's test_event_code, and watch both arrive. Remove the test code before you go live.

4. Review Third-Party Integrations and Plugins

Shopify and most ecommerce platforms have their own Meta tracking, and it's easy to end up running it next to a second setup.

Shopify Integrations: If you use Shopify's Facebook & Instagram sales channel, don't also paste in the Pixel code by hand or run another app that fires pixel events. The channel can handle both the Pixel and CAPI on its own.

Marketing Apps: Review any third-party marketing or analytics apps that might be sending conversion data to Facebook. Disable redundant tracking from these apps if your primary Pixel/CAPI setup already covers those events.

5. Monitor Events Manager Regularly

Check Events Manager every week.

Event Match Quality: Meta scores it from 1 to 10 and, in the same verification guide, recommends aiming for 6.0 or higher.

Deduplication Status: For each event, watch the rate of events deduplicated. If it drops, something changed: an app update, a new tag or a checkout change.

Error Messages: Read any errors or warnings in Events Manager; they usually point straight at the misconfiguration.

Stage 2: The Deeper Problem Beyond Duplicate Conversions

Deduplication makes Ads Manager count each purchase once, not match your orders: Meta still credits every purchase within 7 days of a click on its ad, or a day of a view, whichever channel did the work. Meta will happily over-credit itself, so check the clean numbers against your own.

Three free checks once the fix is in:

  1. Events against orders. Put yesterday's Purchase events in Events Manager next to yesterday's Shopify orders; they should now land close. Expect Ads Manager's purchases and ROAS to drop the day the duplicates stop. For illustration: 212 events against 104 orders should fall to about 104 events, so reported ROAS roughly halves. That's the count getting honest, not your ads getting worse.

  2. Last-click from your own export. Export revenue by session default channel group from GA4, leave Direct out, and look at Paid Social's share: that's what last-click gives Meta, from data Meta doesn't control.

  3. A regional holdout. Pause Meta in one region for two weeks and compare its revenue with the rest. The drop, if there is one, is what Meta caused: incrementality testing in its simplest form.

Facebook Pixel Inaccuracy: Why Your Conversion Data Is Wrong

Offline to Online Attribution: Bridging the Data Gap

Frequently asked questions

  • How much does accurate marketing attribution cost for Shopify stores?
    Checking your own numbers costs nothing but time: Events Manager, GA4's attribution reports and a Shopify orders export are free, and a two-week regional holdout costs only the sales the paused ads were really driving. Attribution tools range from free plans to quotes through sales, so price one against the budget decision it will inform.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Have an audience of ecommerce operators? Earn 20% recurring commission by recommending the €99 read.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

The free finding runs in your browser. Your file never leaves it. The full read is €99, refundable within 30 days, no questions asked. Prices exclude VAT.