To stop Meta counting the same purchase twice, send the same event name and the same unique event ID with the Purchase event from both the Meta Pixel (eventID) and the Conversions API (event_id), to the same pixel, within 48 hours. Meta then keeps one copy and discards the other. Without a shared ID, a "redundant setup" that sends every order from the browser and the server can report two purchases for one sale. Adstudio helps you spot it: it reads each pixel's browser and server events side by side and puts Meta-reported purchases next to your store revenue for the same days.
TL;DR
- Why it happens: the same purchase reaches Meta twice, once from the browser Pixel and once from your server, and nothing tells Meta they are one event (Meta for Developers).
- The fix Meta recommends: a matching
event_name+event_idon the server andevent+eventIDon the Pixel. The order ID is the natural choice for Purchase.- The window: both copies must reach the same pixel within 48 hours of the first one.
- Where to check: Events Manager → your pixel → Overview → Event Details → Event Deduplication (Meta for Developers).
- The sanity test: Meta purchases by day against orders in your own store. Duplicates show up as a steady ratio near 2 on Purchase; attribution differences do not.
Why is Meta counting the same purchase twice?
Most stores now send conversions to Meta two ways. The Meta Pixel fires in the shopper's browser on the order confirmation page, and the Conversions API sends the same order from your server or your store platform's integration. Meta calls this a redundant setup: an event lost in the browser can still arrive from the server.
The catch is that Meta only treats the two as one purchase when it can tell they are the same event. Meta's deduplication guide says it tries to discard identical events from the two sources, and that you need to send the right keys for that to work. When the keys are missing or do not match, each copy is processed on its own.
That matters beyond the report. Meta processes Conversions API events like Pixel events for measurement, reporting and optimization, so a duplicate that is not removed inflates your purchase count, your reported ROAS and the signal your conversion campaigns learn from.
The usual causes:
- No event ID at all. The Pixel and the server both send Purchase, but neither sends an ID.
- Different IDs for the same order. The browser sends
order_1234and the server sends1234, or one side generates a random value on each send. - Two server senders. A store platform's built-in Meta integration and a separately installed server-side tool both send Purchase, each with its own IDs.
- A hard-coded Pixel on top of an integration. The theme still has an old Pixel snippet while the platform integration also fires the Pixel, so the browser sends Purchase twice.
- Different event names. The browser sends
Purchaseand the server sends a custom name, so the two never match.
How does Meta deduplicate Pixel and Conversions API events?
Meta documents two methods. The first is the one to use.
| Event ID + event name (recommended) | Browser ID or external ID | |
|---|---|---|
| What you send | event_id + event_name from the server, eventID + event from the Pixel | The same event_name plus fbp and/or external_id from both |
| When copies match | Same ID and same name, sent to the same pixel within 48 hours of the first | Generally only when the browser event arrives first and the server event follows |
| Server event arrives first | Matched if the other copy arrives within 48 hours of the first event with that ID | Not discarded, even if the browser event arrives later |
| Two copies from one source | Server: only the first copy with an ID is kept, so retries are safe | Both copies are kept |
Sources: Handling duplicate Pixel and Conversions API events and Using the Conversions API, Meta for Developers.
When the browser and server copies do not differ in a meaningful way, Meta says it generally prefers the one it received first. If you only ever send an event one way (say, Lead only from your CRM), Meta's guide says you do not need deduplication for that event.
How do I add an event ID to the Pixel and the Conversions API?
The rule is simple: one ID per real event, created once and sent unchanged by both sides. For Purchase, use the order ID, because the browser and the server both already know it.
On the Pixel, the ID goes in the fourth argument of the fbq call, the event options:
fbq('track', 'Purchase', { value: 129.90, currency: 'EUR' }, { eventID: 'order_1234' });
If several pixels sit on the page and you only want to send to one, Meta documents fbq('trackSingle', 'PIXEL_ID', ...) with the same options, and an image pixel takes the ID as the eid parameter. An event with no value still needs the options object, for example fbq('track', 'Lead', {}, { eventID: 'lead_5678' }).
On the Conversions API, send the same string as event_id, with event_name set to Purchase. Meta also asks for event_time as a Unix timestamp in seconds, and the event cannot be more than 7 days old: if one event in a request is older, the whole request fails and none of its events are processed (Using the Conversions API). Meta recommends sending events within an hour of them happening, which also keeps you well inside the 48-hour deduplication window.
If a store platform or a server-side tool sends your events, you will not write this code yourself. The check is the same: open a test order and confirm the browser and server copies carry the identical ID, as below.
For events that happen before an order exists, like AddToCart or InitiateCheckout, there is no order ID to reuse. Create the ID in the browser, fire the Pixel with it, and pass that same value to your server with the request that triggers the server event.
How do I check deduplication in Events Manager?
Meta's verification guide gives the path:
- Open Events Manager → Data sources and select the pixel your ads optimize for.
- Open Overview. It shows events received before deduplication and the events processed. The Connection method field tells you whether an event arrived from the browser, the server or both.
- Click Event Details on Purchase, then the Event Deduplication tab.
- Read "Rate of Events Deduplicated". It is the share of events from each source that Meta deduplicated. Meta does not publish a target number; it says higher is better and shows a warning when the rate is too low.
- Read "Rate of Deduplication Key Usage" and Overlap. Key usage shows how often each source sends each key, such as event ID. Low overlap means the keys are not unique or a given key only ever arrives from one source.
To test a change before trusting it, use the Test Events tab on the same pixel. It gives you a test code to send as test_event_code on server events, and the events appear in the tab as they arrive. Two cautions from Meta's API guide: test events are not thrown away, they flow into Events Manager and can be used for targeting and ads measurement, and the test code should be removed from production requests.
Our test order routine: place one real order, find it in Test Events, and confirm you see one Purchase that arrived from both browser and server with the same ID, not two Purchases.
Why does Meta show more purchases than my store?
Not every gap is a duplicate. Meta also credits purchases through view-through attribution and uses its own attribution windows and reporting dates. Our guide on why Meta Ads and GA4 numbers don't match covers those causes, and November 2026 adds one more: Meta's Measure conversions on customer devices setting can raise reported purchases from November 12.
The difference shows up in the shape of the numbers:
| What you see | Likely cause | Where to look |
|---|---|---|
| Meta purchases about double store orders on most days, including days with no campaign changes | Duplicates | Event Deduplication tab, Connection method |
| Purchases jumped on the day a server-side tool or new integration went live | Duplicates from a second sender | Overview, events by source |
| Meta higher than GA4 but close to store orders | Attribution difference | Attribution setting, click vs view results |
| Gap mostly in 1-day view results | View-through credit, not duplicates | Ads Manager attribution comparison |
| Step up from November 12 with orders flat | The new on-device measurement setting | Pixel settings, before/after baseline |
Purchase value is a second check. If Meta's purchase conversion value is roughly twice the revenue of the same orders, the order is being counted twice, not just credited generously.
When should I fix duplicate purchases, and what changes after?
Fix it as soon as you find it, and before the holiday peak if you can. Black Friday is November 27, 2026, and a tracking change made the week before leaves Meta little time on clean data. Our Black Friday checklist for Google and Meta ads puts tracking fixes first for that reason.
Expect three things after the fix:
- Reported purchases and ROAS drop. That is the correct number arriving, not lost performance. Write the date down and annotate every report that uses Meta conversions.
- Leave campaigns alone for a few days. Do not stack budget, bid or creative changes on top of the tracking fix in the same week, or no one can tell which change moved the numbers. Our guide to how long the learning phase lasts lists which edits restart learning.
- Your targets need a new baseline. A target ROAS or a cost-per-purchase rule set on doubled numbers is now too tight. Review automated rules and bid caps the same day.
How Adstudio helps you find and watch Meta duplicates
Adstudio connects Meta Ads, Google Ads, TikTok Ads, Google Analytics 4 and Shopify in one workspace, so the checks above become questions.
- A pixel read in one question. Ask the AI assistant for Meta Ads "Check my Meta pixel" and you see each pixel's last event, events by name, browser versus Conversions API events, and how many events carry customer information. A Purchase line where server events roughly equal browser events tells you both sides are sending, which is exactly when the event ID has to match.
- Meta purchases next to real revenue. With Shopify connected, ask "Put my Shopify revenue next to Meta's purchase value for the last 30 days". Meta claiming close to all of your store's revenue, or more, is the cue to check for duplicates before celebrating.
- Attribution split before you blame duplicates. Ask for Meta purchases split by 1-day click, 7-day click and 1-day view, so you can rule out view-through credit first.
- GA4 as an independent count. Purchases and revenue from your GA4 property for the same dates; see the AI for Google Analytics page.
- An alert when the number jumps. Set an alert on Meta cost per purchase or ROAS so a sudden step, like a second sender going live, reaches your inbox the same day. Here is how to set up ad spend alerts.
You can connect Meta Ads, GA4 and your store from $19/month.
FAQ
Does the Conversions API double count purchases? Not on its own. Purchases are counted twice when the same order is sent by both the Pixel and the Conversions API without a matching event ID and event name. With matching keys sent to the same pixel within 48 hours, Meta keeps one and discards the other.
What is event_id in the Meta Conversions API?
It is a string you choose that identifies one real event, such as an order ID. The Conversions API sends it as event_id, and the Pixel sends the same value as eventID in the event options. Meta uses it, together with the event name, to recognise the browser and server copies as one event.
How long does Meta wait to deduplicate events? 48 hours. When the event ID method is used, Meta deduplicates copies that arrive within 48 hours of the first event with that ID.
Why does Meta show more purchases than Shopify? Either the same order is being counted twice, or Meta is crediting purchases under its own attribution rules, such as view-through. Compare Meta purchases with store orders by day: a steady ratio near 2 points to duplicates, a gap concentrated in view-through results points to attribution.
How do I know if Meta deduplication is working? In Events Manager, open the pixel's Overview, click Event Details on Purchase and open Event Deduplication. Check the rate of events deduplicated and the deduplication key usage, and run a test order through the Test Events tab to confirm one Purchase arrives from both sources with the same ID.
Do I need deduplication if I only use the Conversions API? Only for events you also send from the Pixel. Meta says advertisers who do not send the same event through both channels do not need to set up deduplication for those events.
Platform behaviour described as of November 2026, per Meta for Developers documentation on the Conversions API.