TrueCount

How do I set up Meta Conversions API without double-counting purchases?

Short answer

As of October 2026, Meta can count one order as two purchases when the Meta Pixel (code in the shopper's browser) and the Conversions API (a server connection) both send it without a shared event ID. Meta merges the two copies when they have the same event name and event ID, go to the same Pixel and arrive within 48 hours. Send the order number as the event ID from both sides, keep one sender per channel unless Meta documents the pair (it says its one-click Meta-enabled option can run alongside an existing integration), and check the Event deduplication tab in Meta Events Manager.

One order should reach Meta as one purchase. Many stores send each order twice on purpose, from the shopper's browser and from a server, which works only if Meta can tell both copies describe the same sale. This guide covers how Meta merges the copies, how to check and fix them by platform, and what a doubled count does to budgets. It is the main guide in the Meta Pixel & Conversions API topic.

What does double-counting mean for Meta Conversions API?

The Meta Pixel is JavaScript code on your store that reports shopper actions, such as a purchase, from the browser. The Meta Conversions API (CAPI) is a direct server-to-server connection: your store or a partner app sends the same kind of event to Meta from a server. Meta Events Manager is where Meta shows the events your Pixel and server send, including ones not linked to your ads.

Double-counting happens when one order arrives through both channels and Meta keeps both copies, so one sale shows up as two purchases. Deduplication is Meta's process of spotting those pairs and keeping one copy.

Meta warns: "Without deduplication, you may see artificially high conversion numbers, which can mislead optimization and budget allocation decisions." It names conversion rate, return on ad spend (ROAS) and attribution as affected.

Why does Meta want the same purchase from the browser and the server?

Sending one purchase twice sounds like a mistake, but Meta recommends it: its developer guide advises running the Conversions API alongside the Meta Pixel, a redundant setup. The browser copy can fail. Shopify's Help Center says a browser-based ad blocker can stop the Meta Pixel from sharing data, but not the purchase event the Conversions API sends between Shopify's and Facebook's servers.

Meta's own one-click setup, the Meta-enabled Conversions API announced on April 15, 2026, shares the events your Pixel already sends through a server connection, and Meta says those copies are automatically deduplicated.

How does Meta match a Pixel purchase to a Conversions API purchase?

Meta's recommended method uses two keys: the event name, such as Purchase, and an event ID (event_id), a unique label you attach to one event, such as the order number. In Meta's words, "In corresponding events, a Meta Pixel's eventID must match the Conversion API's event_id." The event names must match too. Both copies must also go to the same Pixel ID, the number that identifies your Pixel, and arrive within 48 hours of the first event with that event_id. Meta then discards the later copies.

The spelling differs by channel: eventID in the Pixel, event_id in the Conversions API, with the same value on both sides. Meta names an order number or a transaction ID as possible values.

Which copy survives is not fixed. When the copies are alike, Meta generally prefers the first one received, and it favors the browser copy when both arrive within about 5 minutes. Build nothing that depends on one copy winning.

Can Meta remove duplicate purchases without an event_id?

Meta has a backup method for events without a shared event_id: it matches the event name plus fbp, external_id, or both. fbp is a browser ID read from the _fbp cookie; external_id is your own customer ID, such as your store's customer number.

The backup generally works only when the browser event arrives first, and a server event is kept if no browser event arrived in the past 48 hours. It also does not deduplicate within one source: two identical browser events in a row both stay, and so do two identical server events.

So a second Pixel or a second server integration can add a purchase the backup will not remove. A shared event_id is the reliable path.

Why does Events Manager show more purchases than my store has orders?

A high Purchase count in Meta Events Manager does not prove double-counting by itself. In the server event details view, the Event Overview tab shows Events Received: Pixel and Conversions API events counted before processing. When you use both, Meta says, "this is the sum from both sources, not deduplicated." A store that correctly sends every order through both channels can see close to twice its orders there.

The Total events count on the Data sources page is not deduplicated either, and Events Manager also shows unattributed events, such as organic ones.

To judge deduplication, open the Event deduplication tab in the Purchase event details and read Overlap: the share of events with a deduplication key that arrived from both sources.

Which Meta Conversions API setup options can a store choose?

Meta lists three routes: the Meta-enabled Conversions API, partner integrations (ready-made connections from Meta's partners), and a direct integration in code. On Shopify or WooCommerce, setup takes a few clicks at no extra cost. Partner platforms include Google Tag Manager (GTM), Google's tool for managing tracking tags.

Setup Who handles deduplication Effort Watch for
Meta-enabled Conversions API Meta One click, free, web only Pixel events only; Meta says it can run next to another setup
Shopify Facebook & Instagram app Shopify A setting in Shopify admin An old Pixel in theme code
Meta for WooCommerce The extension Built in once set up Other plugins firing the Pixel
Server-side GTM with Meta's tag You Tags plus a server container Same event ID on both tags
Direct integration Your developer Developer and servers, 2–4 weeks if new Event ID, timestamps, customer data

Can two Conversions API integrations count the same order twice?

Two Conversions API integrations can count one order twice when each sends Purchase with its own event ID, for example two apps or plugins, or a plugin plus server-side GTM. Meta deduplicates repeated server events that share event_name and event_id, and its backup method does not merge two server events.

Meta's one-click option is the documented exception. Asked whether a store with a direct or partner integration should add it, Meta says the web-only Meta-enabled Conversions API "can be used alongside your existing setup" and deduplicates events automatically. As of October 2026, Meta does not explain how it matches those copies to a partner app's server events.

One sender per channel is our conservative rule, not Meta's: add a second server sender only when Meta documents the pair, then check the Event deduplication tab.

Which Meta sender pairs have doubled purchases in public reports?

These are others' reports, not our tests; none include before-and-after numbers.

Pair Source Reported
Shopify's Pixel setting plus the same Pixel in checkout scripts Exact Click Digital, 2019, updated 2022; Shopify Support, 2020 1,500 Purchase events against 1,100 add-to-carts; support: "very likely why... purchases are being counted twice"
Theme-code Pixel plus a Pixel tag in GTM Store owner, Shopify Community, 2023 Add-to-cart and Purchase doubled; removing the GTM tag helped, then the owner said it came back
Meta connection plus a product-feed app Store owners, Shopify Community, 2022–2024 Purchases doubled about half the time; deleting a feed app stopped it, by the owners' account
Shopify's integration plus server-side GTM or another connector Stape staff, 2022; Littledata docs Vendor views, no numbers: with different event IDs, "very often these events will not deduplicate"
Meta for WooCommerce plus a hand-added Pixel WordPress.org forum, 2024 Two Pixel codes found; fix unconfirmed

Shopify retired these checkout scripts for Plus stores on August 28, 2025 and for other stores by August 26, 2026; a second Pixel elsewhere works the same way.

How do I check for double-counting in 5 minutes?

You need Meta Events Manager and your store's order list. No code.

  1. List your senders. The Meta app or plugin, theme code, Google Tag Manager, custom scripts, the Meta-enabled option: anything that could send a purchase.
  2. Open the Purchase event. In Events Manager, open your Pixel under Data sources, then the Purchase event details. Its Event Overview tab shows Events Received; these tabs cover website events sent through the Conversions API and may not appear with the Pixel alone.
  3. Read the Event deduplication tab. In the Deduplication keys table, Overlap, the share of events with a key that arrived from both sources, should be high.
  4. Compare each source with your online orders for the same days. Events Received is counted before processing, so same-ID repeats of one order, such as a reloaded thank-you page, raise it too; Meta removes those itself. If one source still clearly exceeds your orders, look for a second sender on that side.

How do I test one purchase with Meta's Test Events tool?

Meta's Test Events tool shows which events were processed and which were deduplicated. Place one small real order and refund it. Test activity still appears in Events Manager and Ads Reporting after you clear it from the tool.

  1. Browser. In Events Manager, open Data sources, your Pixel, Test events. Enter your store's address, click Open website and buy in that window. The browser Purchase should appear while the Test events page stays open.
  2. Server. Server events appear in the tool only with its test ID sent as test_event_code: in server-side GTM, enter it in Meta's Conversions API Tag; in custom code, add it to the payload. Remove it afterwards, because test events are not dropped.
  3. No way to add the test ID, as may be the case with an app or the Meta-enabled option? Check instead that the server count in the Purchase event's Event Overview rises after the order.

How do I stop duplicate purchases on Shopify?

On Shopify, the Facebook & Instagram app (Facebook and Instagram by Meta) sends data according to its customer data-sharing level. Standard uses a Meta Pixel only, Enhanced adds the Conversions API, and Maximum adds what Shopify calls Facebook's latest advertising technology. The setting sits under Sales channels, Facebook & Instagram, Settings, Data sharing settings. Another Shopify page calls it Share data settings. Meta says Shopify handles the deduplication parameters automatically.

The risk Shopify warns about is a second Pixel. If a Meta Pixel was added to the theme code, "your store will have more than one pixel on it, which can result in duplicate or incorrect data in your reports." To remove it, open Online Store, your current theme, Edit code, then theme.liquid, and delete the Meta Pixel code between <head> and </head>. If an agency or an ads app manages your Facebook ads, confirm that a new Pixel won't duplicate data.

How do I check Meta for WooCommerce for duplicate purchases?

Meta for WooCommerce is the official extension that connects a WooCommerce store to Meta. WooCommerce's documentation says the Conversions API is built in, turns on automatically once the extension is set up, and deduplicates Pixel and server events by a unique event ID. Meta's Help Center also names WooCommerce among platforms that automatically handle the deduplication parameters. That WooCommerce.com page is no longer updated, but WordPress.org still lists the plugin as official, by Facebook.

The risk is a second Pixel. A theme snippet, a GTM tag or another plugin can fire its own Purchase without the extension's event ID. Meta's backup method does not merge two browser events, so that copy can stay.

Plugin updates can double purchases too: in May 2025, WordPress.org users reported duplicated Purchase events after updates 3.4.7 and 3.4.8. Plugin support advised rolling back to 3.4.6 and announced a fix on June 30, 2025.

How do I pass event_id through GTM and server-side GTM?

Google Tag Manager (GTM) is a Google tool that loads tracking tags from one place. Its web container runs in the shopper's browser. In server-side GTM, a GA4 (Google Analytics 4) tag in the web container sends data to a server container, where Meta's Conversions API Tag passes it to Meta.

For deduplication, the same event_id must reach both channels: as eventID in the Pixel tag's fbq call, and as event_id or x-fb-event_id in the GA4 event. Use the same trigger for both tags. GA4's purchase maps to Meta's Purchase, and transaction_id to order_id.

Customer details (user_data) reach the server container only if the GA4 Configuration tag sets the field first_party_collection to true. fbp and fbc, the browser and click IDs, go automatically when the tagging server runs on a first-party custom domain (a subdomain of your store). Otherwise, add the _fbp and _fbc cookies to the GA4 Configuration tag as the fields x-fb-ck-fbp and x-fb-ck-fbc.

What does the Pixel eventID code look like?

In custom code, the event ID goes into the optional fourth argument of fbq('track', ...), the Pixel's JavaScript call. Meta says it should be unique and must equal the event_id of the matching Conversions API event. This example runs once on the order confirmation page:

js
// Runs once on the order confirmation (thank-you) page.
// orderId must come from your store: use the order number.
var orderId = '1234';

fbq('track', 'Purchase',
  { value: 86.00, currency: 'USD' }, // 3rd argument: event data
  { eventID: orderId }                    // 4th argument: deduplication key
);

// Several Pixels on the page? Send the event to one Pixel only:
// fbq('trackSingle', 'YOUR_PIXEL_ID', 'Purchase',
//   { value: 86.00, currency: 'USD' },
//   { eventID: orderId });

An image Pixel, for pages that cannot run JavaScript, passes the ID in the eid URL parameter.

Use one ID per order. In Meta's example, orders 123 and 456 carry their own numbers in both the server event_id and the Pixel eventID, so Meta sees two purchases, not four. If you generate an ID instead, generate it once and pass it to both sides.

What does a Conversions API Purchase payload look like?

A payload is the data your server sends to Meta; for a purchase, it carries the order number as event_id. event_time is required: when the purchase happened, as a Unix timestamp (the number of seconds since January 1, 1970) in GMT. It can be up to 7 days old, but if any event in a request is older, Meta rejects the whole request and processes no events. Meta recommends sending events as soon as they occur, ideally within an hour.

action_source, where the conversion happened, is required for every event, and website events also require event_source_url, the browser URL where the event happened, and client_user_agent, the browser's identification string. Strip the comments before sending: JSON does not allow them.

json
{
  // "test_event_code": "TEST12345",  // only while testing, remove before going live
  "data": [
    {
      "event_name": "Purchase",         // must equal the Pixel's event name
      "event_time": 1791556200,         // example only: use the real order time in Unix seconds (GMT); older than 7 days = whole request rejected
      "event_id": "1234",               // same value as the Pixel's eventID
      "action_source": "website",       // the purchase happened on your site
      "event_source_url": "https://shop.example.com/checkout/thank-you",
      "user_data": {
        // SHA256 of the normalized email [email protected]
        "em": ["62a14e44f765419d10fea99367361a727c12365e2520f32218d505ed9aa0f62f"],
        // SHA256 of the normalized phone 16505551212
        "ph": ["e323ec626319ca94ee8bff2e4c87cf613be6ea19919ed1364124e16807ab3176"],
        "external_id": ["SHA256_OF_YOUR_CUSTOMER_ID"], // hashing recommended
        "client_ip_address": "203.0.113.10",           // never hashed
        "client_user_agent": "Mozilla/5.0 (Macintosh; ...)", // never hashed
        "fbp": "fb.1.1791555900000.1098765432",        // _fbp cookie, never hashed
        "fbc": "fb.1.1791555800000.AbCdEfGh123"        // from the _fbc cookie, or built from fbclid as fb.1.<time>.<fbclid>; never hashed
      },
      "custom_data": {
        "value": 86.00,    // order value as a number
        "currency": "USD",     // currency code
        "order_id": "1234"     // your order number, as a string
      }
    }
  ]
}

Remove test_event_code before going live. Meta says events sent with it "are not dropped. They flow into Events Manager and are used for targeting and ads measurement purposes."

How do I hash customer data, and how does it affect Event Match Quality?

Hashing turns a value such as an email address into a fixed-length code, a fingerprint of it. Meta's examples use SHA256, a standard hash function, and Meta says its systems are designed not to accept unhashed contact information.

Normalize first. For email, trim spaces at both ends and convert to lowercase: [email protected] becomes [email protected]. For phone numbers, remove symbols, letters and leading zeros, and include the country code: (650)555-1212 in the US becomes 16505551212. Never hash client_ip_address, client_user_agent, fbp or fbc. The Meta Business SDK, Meta's official code library, hashes automatically.

Event Match Quality (EMQ) is Meta's 0–10 score for how well this customer information may match a server event to a Meta account, based on the last 48 hours of data. Email and the click ID (fbc) have high priority; phone, external_id and the browser ID (fbp) are medium. EMQ measures matching, not counting.

How do I troubleshoot duplicate or missing purchases in Meta?

Find your symptom, then check the possible cause.

Symptom Possible cause Fix
Events Received is about twice your orders A raw sum of Pixel and server events Judge by the Event deduplication tab
Low Overlap Missing or mismatched event_id, or one side missing purchases Send the order number from both sides for every order
Browser purchases alone exceed orders A second Pixel, such as old Shopify theme code, without the shared event ID; or same-ID repeats, which Meta removes Keep one browser sender
Server purchases alone exceed orders Two server integrations with different event IDs Keep one server sender unless Meta documents the pair
Far fewer server events than Pixel events Below Meta's 75% server-to-Pixel coverage target Make every order trigger a server event
A whole server request is rejected One event_time older than 7 days Send events within an hour
Extra purchases after testing test_event_code events are not dropped Remove the code from live payloads

What does double-counting do to my ad budget decisions?

Meta warns that inflated conversion numbers can mislead optimization and budget decisions. A made-up example: ten real orders of $86 from a $500 campaign, counted twice, raise reported return on ad spend (ROAS) from 1.72 to 3.44, while your bank balance stays the same. You might raise that budget, or cut a campaign that reports honestly. The loss calculator puts your own gap into numbers.

Ads Manager may show a smaller gap than Events Manager: Meta says it shows only attributed events and may discard duplicates received for one person over a short period. So compare your order list with Meta's numbers for the same days before you move budget.

What changed after stores removed double-counted purchases?

Both reports concern unnamed clients; the numbers are the authors' claims. Elite Brands, an agency, says a Shopify store sent Meta "two, sometimes three, Purchase events" per order, so Ads Manager showed ROAS of 3.5 against about 1.7 and scaling lost money. After the fix, Ads Manager showed 2.1 within 30 days; after 60 days, real ROAS was 2.1 and cost per acquisition fell from $58 to $47.

Exact Click Digital says that once it found the doubling, "all the past ad data was basically worthless."

Is Meta Conversions API worth it if it can double-count?

Meta Conversions API is worth using despite the double-counting risk, as long as deduplication is in place. In a Meta experiment with 5,926 advertisers, run November 3–12, 2025, those with a Conversions API setup for web events saw an average 17.8% lower cost per result than those without it. Meta published the figure on April 15, 2026, with the Meta-enabled Conversions API.

Meta does not describe the comparison as Pixel plus Conversions API against the Pixel alone, and it says nothing about setups that double-count. An average also does not predict one store's result.

Without a server copy, purchases the browser misses never reach Meta; without a shared event ID, some reach Meta twice. The goal is one complete, deduplicated copy of each order.

Do I need help with Meta deduplication, or can I leave my setup alone?

Often you can leave a Meta setup alone. Meta says Shopify and WooCommerce handle the deduplication parameters automatically, and that the Meta-enabled Conversions API deduplicates its copies and can run next to another integration. You need no help if four things hold: each channel has one sender (plus, optionally, the Meta-enabled option), no old Pixel sits in your theme code, Overlap is high, and each source's purchases sit close to your order count.

Ask for help when two apps, plugins or tags send the same purchase, when GTM or custom code runs without a shared event_id, or when one source alone clearly exceeds your orders. Start with the free outside check: it needs only your store URL, no passwords, and if all is fine, you hear that with no quote attached. Prices are fixed and given in writing before you say yes. The Meta Pixel and Conversions API fix costs $300–400. A full audit with view-only access costs $0. The full package, which adds GA4, Google Ads and Consent Mode v2, costs $600.

FAQ

Does Meta deduplicate Pixel and Conversions API events automatically?

Only when both copies carry matching keys: the same event name and event ID, the same Pixel ID, and arrival within 48 hours, or, as a limited backup, the same event name plus fbp or external_id. Meta says Shopify and WooCommerce set these keys automatically, and that its Meta-enabled option deduplicates automatically. With custom code or Google Tag Manager, you pass the same event ID from both sides yourself.

Do I need event_id if I only use the Conversions API?

Not for Pixel-to-server deduplication: Meta says events not sent through both channels need no deduplication setup. Meta marks event_id as optional but recommends it, with an order number or transaction ID as possible values. Meta also deduplicates repeated server events that share event_name and event_id, and the ID protects you if a Pixel is added later.

Can I turn on Meta-enabled Conversions API next to the Shopify app?

Yes, according to Meta. Asked whether a store with a direct or partner integration should add the web-only option, Meta answers that it "can be used alongside your existing setup." Shopify is one of Meta's commerce platform partner integrations. Meta does not explain how it matches its copies to the server events the Shopify app sends on Enhanced and Maximum. After turning it on, compare purchases with orders for the same days and watch the Event deduplication tab.

Sources (29)
  1. [1]

    Meta Business Help Center, About deduplication for Meta Pixel and Conversions API events (accessed October 10, 2026)

  2. [2]

    Shopify Help Center, Facebook data sharing (accessed October 10, 2026)

  3. [3]

    Meta for Business, Removing Technical Barriers to Help Businesses of All Sizes Get More From Their Ads (April 15, 2026)

  4. [4]

    Meta Business Help Center, Compare Conversions API setup options (accessed October 10, 2026)

  5. [5]

    Meta for Developers, Handling Duplicate Pixel and Conversions API Events (June 28, 2026)

  6. [6]

    Meta for Developers, Server Event Parameters (February 12, 2026)

  7. [7]

    Meta for Developers, Customer Information Parameters (January 9, 2026)

  8. [8]

    Meta Business Help Center, View server event details in Meta Events Manager (accessed October 10, 2026)

  9. [9]

    Meta Business Help Center, Differences between event counts in Meta Ads Manager, Ads Reporting and Events Manager (accessed October 10, 2026)

  10. [10]

    Shopify Help Center, Meta pixel (accessed October 10, 2026)

  11. [11]

    WooCommerce, Meta for WooCommerce (documentation) (May 1, 2026)

  12. [12]

    Meta for Developers, Conversions API for Server-Side Google Tag Manager (GTM) (June 30, 2026)

  13. [13]

    Meta for Developers, Using the API (July 17, 2026)

  14. [14]

    Meta Business Help Center, About event match quality (accessed October 10, 2026)

  15. [15]

    WordPress.org Plugin Directory, Meta for WooCommerce (July 23, 2026)

  16. [16]

    Meta for Business, Conversions API (accessed October 10, 2026)

  17. [17]

    Meta Business Help Center, Test events tool: verify app and web browser events for Meta (accessed October 10, 2026)

  18. [18]

    Exact Click Digital, How to Fix a Double Counting Facebook Pixel in Shopify (February 15, 2022)

  19. [19]

    Shopify Community (user report), How can I remove an extra Facebook pixel from my website? (June 19, 2020)

  20. [20]

    Shopify Community (user report), my website has 2 facebook pixel.. pls help me (November 1, 2023)

  21. [21]

    Shopify Community (user report), Facebook Ads pixel reporting more purchases than are really happening (October 10, 2024)

  22. [22]

    Stape Community (user report), Shopify Native Integration + And Stape ss GTM tracking = Both togethert? (May 24, 2022)

  23. [23]

    Littledata Help Center, Turning off Shopify's CAPI integration (April 2, 2026)

  24. [24]

    WordPress.org Support Forums (user report), Duplicated Purchase event (October 29, 2024)

  25. [25]

    Shopify.dev, checkout.liquid (accessed October 14, 2026)

  26. [26]

    WordPress.org Support Forums (user report), Duplicate or Excessive Purchase Events in Facebook for WooCommerce (June 30, 2025)

  27. [27]

    Elite Brands, We Fixed a Brand's Meta Pixel Tracking: +20% ROAS Impact (May 26, 2026)

  28. [28]

    WordPress.org Support Forums (user report), Purchase Event Firing Problems After Version 3.4.7 (June 30, 2025)

  29. [29]

    Shopify Help Center, Non-Plus - Upgrading and replacing your Thank you and Order status pages (accessed October 14, 2026)

Andrii Duhin

About the author

Andrii Duhin

Independent conversion-tracking specialist

Sets up and fixes conversion tracking for online stores in the US, Europe and Israel: Meta Pixel and Conversions API, GA4, Google Ads, GTM and server-side GTM, Consent Mode. Before that, four years running paid ads on Meta, Google and TikTok, with about $550k in budgets.

Get the next change by email

A short email when a change can break your numbers: what changed, who it affects and what to check in 5 minutes.

Max 2 emails a month, sometimes with an offer from us. Unsubscribe anytime. Privacy