Why is Meta counting my leads twice with the pixel and the Conversions API, and how do I deduplicate them?
Meta counts a lead twice when your pixel and the Conversions API both send it without a shared key. Give both copies the same event name (such as Lead) and the same event ID: eventID in the pixel, event_id on the server. Send both to the same pixel within 48 hours and Meta keeps one, generally the first it receives. Without an event ID, Meta can match on fbp or external_id, but generally only if the browser copy arrives first. Check Events Manager's Event Deduplication tab. The Overview page counts events before deduplication, so a doubled total there proves nothing.
Ask Tofu next
Pick a question and Tofu Ads Agent answers it in chat.
- Are my Meta pixel and Conversions API Lead events being deduplicated?
- How do I pass the same event ID from my HubSpot form to the Meta Conversions API?
- Compare my Meta Ads Manager leads with the form fills in my CRM for last month
- Should my CRM send qualified leads to Meta under a different event name than Lead?
- Which of my Meta ad sets optimize for website leads, and what did each cost per lead last month?
As of November 2026.
Before you start
- Access to your pixel in Events Manager, and to whoever controls your tags or server code.
- Know how each copy is sent. The browser copy comes from the pixel code or a tag manager. The server copy comes from your own code, server-side Google Tag Manager, a partner integration, Meta's one-click setup or the Conversions API Gateway. For the one-click setup and the Gateway, start with how to set up the Meta Conversions API without a developer.
- A test form you can submit.
Step 1: Check that Meta is really counting twice
Don't judge by Events Manager's totals. Meta's setup guide says the Overview page shows "the number of events we received before they are deduplicated." With a pixel and a server both sending Lead, a total near twice your form fills is normal.
Compare leads in Ads Manager with form submissions in your CRM for the same days instead. Some gap is normal, from attribution windows and repeat submissions (see why Meta Ads Manager results don't match GA4). A count close to double points to duplicates.
Step 2: Read the Event Deduplication tab
In Events Manager, open your pixel's Overview, open the details for the Lead event (Meta's guide calls the button Event Details), then open the Event Deduplication tab. Meta says it shows:
| Metric | What Meta says it means |
|---|---|
| Rate of Events Deduplicated | The share of events deduplicated from each source. Higher is better, and a warning appears when the rate is too low |
| Rate of Deduplication Key Usage | The share of events from each source that carried each key, such as the event ID |
| Overlap | The share of events with a given key received from both sources, out of the source with fewer events. Low overlap means non-unique keys, or a key sent from only one source |
If server events rarely carry an event ID, or both sources carry one but overlap is low, go to Step 4.
Step 3: Send the same event name from both
Meta deduplicates only when the pixel's event matches the server's event_name. So the pixel's Lead and the server's Lead must be the same standard or custom event.
The reverse also holds. Meta's help article says that if you send different events from each source (its example is AddToCart from the browser and Purchase from the server), no deduplication is needed. For B2B, that means a CRM stage such as a qualified lead can go server only, under its own name. See how to send CRM lead stages to Meta.
Step 4: Give each lead one event ID and send it from both
The pixel's eventID must match the server event's event_id. In the pixel it is the fourth argument. Meta's example for an event with no value or currency:
fbq('track', 'Lead', {}, {eventID: 'EVENT_ID'});
An image pixel sends it as the eid parameter instead. The server sends the same string as event_id.
The ID must be unique to each lead. Meta suggests an order or transaction number, and for events with no natural ID, a random number, "so long as the same random number is sent between browser and server events."
The hard part in B2B is that the two copies often come from different systems: a form embedded on your page, and a webhook from your CRM or form tool. The server can only send the ID if it receives it. One way is to create the ID in the browser when the form is submitted, use it in the pixel call, and write it to a hidden form field. It then travels with the lead to your server, which sends it as event_id. This is an implementation choice, not a Meta requirement.
With server-side Google Tag Manager, Meta's guide suggests firing the pixel tag and the GA4 event tag on the same trigger, with the same event ID in both.
Step 5: Send both copies to the same pixel within 48 hours
Meta's deduplication guide sets two limits:
- Same pixel. Meta discards later copies when the same keys reach "the same Pixel ID within 48 hours." The rule covers copies sent to one pixel ID. If you run more than one pixel, see one Meta pixel or separate datasets.
- 48 hours. Events are deduplicated only if they arrive within 48 hours of the first event with that event ID. A CRM sync that resends Lead three days later counts again. Give later CRM events their own event name (Step 3).
Which copy does Meta keep? Meta says that if the two copies "do not differ meaningfully in their content," it "generally" prefers the one received first. Its Server Event Parameters reference adds that when a server and browser event arrive within 5 minutes of each other, it favors the browser event. Neither page promises a fixed rule, so don't depend on which copy wins.
Step 6: Add fbp and external_id as a backup
Meta's second method matches the event name plus fbp (the browser ID in the _fbp cookie) and/or external_id (any unique ID you hold, such as a user ID). Meta lists its limits:
- It generally works only when the browser event arrives first and the server event follows. A server event isn't discarded if no browser event arrived in the past 48 hours, even if one arrives later.
- It doesn't remove duplicates within one source. Two identical browser events are both kept, and so are two identical server events.
So use it alongside the event ID, not instead of it. Meta's tag manager guide says to include event_id, external_id and fbp "whenever possible." Customer details also feed match quality; see why Event Match Quality is low on Meta lead events.
Step 7: Test, then watch the tab
- In Events Manager, click Data sources, select your pixel and click Test events.
- Enter your website URL, click Open website and submit your test form. For server events, send the test ID the tool gives you as the
test_event_codeparameter. - Meta says the tool lets you "check which events are processed and which are deduplicated." You want the browser and server Lead with the same event ID, and one of them deduplicated.
- Remove
test_event_codebefore you go live, as Meta's guide says.
Test data isn't kept apart: Meta says test activity "will still appear" in Events Manager, ads reporting and audience creation, so expect your test leads in the counts. After a few days of real leads, check the Event Deduplication tab again.
Common problems
| Problem | Why it happens | Fix |
|---|---|---|
| Both sources send event IDs, but overlap is low | Browser and server each make their own ID | Create the ID once and pass it to the server (Step 4) |
| IDs differ with server-side Google Tag Manager | The pixel tag and GA4 event tag fire on different triggers | Use one trigger and one event ID variable for both |
| Only some leads double, often days later | The server copy arrived more than 48 hours after the first | Send in real time, or give late CRM events their own name |
| Doubles with no server events at all | Pixel code on the page twice, or automatic events adding their own Lead | Check with Meta Ads Data Advisor and review automatic events |
| Two server routes send the same lead | Meta drops a repeated server event only when its event name and event ID match | Use one server route per pixel, or send the same event ID from each |
| Two identical server events both counted | The fbp and external_id method doesn't deduplicate within one source | Add an event ID |
| Test leads show in reporting | Meta keeps test events in Events Manager and ads reporting | Use clearly named test entries and remove the test code when done |
Sources
- Handling Duplicate Pixel and Conversions API Events (Meta for Developers), checked 2026-11-06
- About deduplication for Meta Pixel and Conversions API events (Meta Business Help Center), checked 2026-11-06
- Verifying Your Setup (Meta for Developers), checked 2026-11-06
- Server Event Parameters (Meta for Developers), checked 2026-11-06
- Customer Information Parameters (Meta for Developers), checked 2026-11-06
- Conversions API for Server-Side Google Tag Manager (GTM) (Meta for Developers), checked 2026-11-06
- Using the API: Conversions API (Meta for Developers), checked 2026-11-06
- Test events tool: verify app and web browser events for Meta (Meta Business Help Center), checked 2026-11-06