Conversion tracking

Why is Meta counting my leads twice with the pixel and the Conversions API, and how do I deduplicate them?

By The Tofu team ·

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.

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:

MetricWhat Meta says it means
Rate of Events DeduplicatedThe share of events deduplicated from each source. Higher is better, and a warning appears when the rate is too low
Rate of Deduplication Key UsageThe share of events from each source that carried each key, such as the event ID
OverlapThe 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

  1. In Events Manager, click Data sources, select your pixel and click Test events.
  2. 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_code parameter.
  3. 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.
  4. Remove test_event_code before 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

ProblemWhy it happensFix
Both sources send event IDs, but overlap is lowBrowser and server each make their own IDCreate the ID once and pass it to the server (Step 4)
IDs differ with server-side Google Tag ManagerThe pixel tag and GA4 event tag fire on different triggersUse one trigger and one event ID variable for both
Only some leads double, often days laterThe server copy arrived more than 48 hours after the firstSend in real time, or give late CRM events their own name
Doubles with no server events at allPixel code on the page twice, or automatic events adding their own LeadCheck with Meta Ads Data Advisor and review automatic events
Two server routes send the same leadMeta drops a repeated server event only when its event name and event ID matchUse one server route per pixel, or send the same event ID from each
Two identical server events both countedThe fbp and external_id method doesn't deduplicate within one sourceAdd an event ID
Test leads show in reportingMeta keeps test events in Events Manager and ads reportingUse clearly named test entries and remove the test code when done

Sources

Let an agent build your next campaign.

Tofu Ads Agent reads your CRM, plans the funnel, builds the audience and creative, and stages full campaigns across LinkedIn, Google and Meta for your approval.