Meta CAPI troubleshooting

Facebook CAPI Deduplication: Fix Duplicate Events (2026)

Last reviewed: October 1, 2026 Published by The Architect — CreatorOpsMatrix

How do you fix Facebook CAPI duplicate events?

The primary Meta deduplication method is straightforward: the browser Pixel event and the Conversions API event for the same action need the same event_id and the same event_name, sent to the same Pixel/dataset within Meta’s deduplication window. Meta’s documented primary method uses those two fields as the deduplication keys and discards the later duplicate.

For a purchase, the safest pattern is to create one unique identifier for that purchase — commonly an order or transaction identifier — and pass that exact value through both tracking paths. Do not generate one ID in the browser and another in the server webhook.

Building the server-side flow in Make.com? Use the troubleshooting sequence below first, then automate the webhook, transformation, hashing and CAPI delivery.

Open Make.com →

Affiliate disclosure: The Make.com link is an affiliate link. CreatorOpsMatrix may earn a commission at no additional cost to you.

Prefer a visual walkthrough?

Watch the CreatorOpsMatrix walkthrough showing the Pixel + CAPI event flow and the event_id matching problem.

Meta Ads Showing Double Conversions? Fix CAPI Deduplication — CreatorOpsMatrix
Primary dedup key event_id + event_name on the browser and server copies.
Same destination The redundant events must belong to the same Meta Pixel/dataset for the primary method.
48-hour window Meta’s documented primary deduplication method considers matching events received within 48 hours.
Unique per event One purchase should have one event ID, and that ID should be preserved through retries.

1. What Meta CAPI Deduplication Actually Does

When you use both the Meta Pixel and Conversions API for the same website event, Meta can receive two representations of one real-world action.

For example, one purchase can produce:

  • a browser-side Purchase event from the Meta Pixel; and
  • a server-side Purchase event from a payment webhook, CRM, backend or automation platform.

That dual-channel architecture is useful because the two environments see different information and can have different delivery failure modes. Meta’s own Conversions API documentation has recommended browser + server connections for redundant event coverage.

The problem occurs when the two events do not give Meta enough information to recognize that they describe the same event.

Important distinction: deduplication does not mean Meta decides which event is “more accurate” and repairs a bad implementation for you. Your implementation has to provide a valid deduplication key. The primary method is an identical event_id and event_name on the corresponding browser and server events.

2. The Two Primary Deduplication Keys: event_id + event_name

Meta’s documented primary deduplication method compares the browser event and server event using the same event_name and event_id, sent to the same Pixel ID. Events received within 48 hours of one another with those matching values are considered duplicates, and Meta discards the latter of the two.

FieldBrowser PixelConversions APIMust correspond?
Event namePurchase"Purchase"Yes
Event IDorder_18492"order_18492"Yes
DestinationMeta Pixel / datasetSame Pixel / datasetYes
TimingReceived by MetaReceived by MetaWithin the dedup window
Other parametersBrowser contextServer contextCan differ

event_id is the identity of the event, not the visitor

This distinction prevents a large number of implementation errors.

An event_id should identify one specific event instance. For a Purchase event, an order or transaction identifier is usually convenient because the identifier already exists in the business system.

A UUID also works when you generate it once and persist it so both tracking paths use exactly the same value. What you should not do is generate one random ID in the browser and independently generate another random ID in your server webhook.

Do not reuse the same event_id for multiple real events. If five separate purchases are sent with one shared ID, Meta can treat events that share the same deduplication key as related when they should have been distinct. Generate or assign one stable ID per event instance.

Preserve the ID across retries

If a server request fails and your automation retries it, the retry should retain the original event ID for that same event. A retry that creates a new ID is no longer an identical replay from Meta’s perspective; it can become a second event.

event_name matters too

The event names need to correspond. For example, the browser event and CAPI event should both represent Purchase, not one side using Purchase and the other using a different event name.

Do not use a naming convention where the browser emits one event name and the server silently renames it during transformation. Treat the event name as part of the deduplication contract.

3. How Pixel + CAPI Should Fit Together

Browser Pixel Purchase + eventID = order_18492
Server CAPI Purchase + event_id = order_18492
↓
Meta receives the matching pair Same event name + same event ID + same destination + within the deduplication window → one logical event after deduplication.

The two payloads do not need to contain identical information. Browser and server environments naturally have different context available to them.

For example, the server event may contain hashed customer information and payment-system data, while the browser event may contain browser-side identifiers. The key requirement for the primary deduplication method is that the event identity used for the two representations matches.

Do not disable one tracking path merely because duplicates appeared. First determine whether the same purchase is being sent by both paths without a shared deduplication key, or whether multiple independent integrations are sending the same event. A clean server-only implementation is a different architecture; a browser + server implementation needs a clean deduplication strategy.

4. Exact event_id Implementation

For a purchase, imagine your commerce system has this order number:

order_18492

That value becomes the shared identity for the browser and server copies of the same Purchase.

Browser Pixel

fbq('track', 'Purchase', {
  value: 100.00,
  currency: 'USD'
}, {
  eventID: 'order_18492'
});

The important part is the fourth argument: the Pixel’s eventID.

Conversions API

{
  "data": [
    {
      "event_name": "Purchase",
      "event_time": 1760000000,
      "action_source": "website",
      "event_id": "order_18492",
      "user_data": {
        "em": ["NORMALIZED_SHA256_EMAIL"],
        "ph": ["NORMALIZED_SHA256_PHONE"],
        "fbp": "fb.1.example",
        "fbc": "fb.1.example"
      },
      "custom_data": {
        "value": 100.00,
        "currency": "USD"
      }
    }
  ]
}

The browser and server examples use the same logical event:

BrowserServer
event = Purchaseevent_name = Purchase
eventID = order_18492event_id = order_18492
Browser contextServer/customer context

Do not copy the example hashes or IDs into production. They are placeholders illustrating the structure. Your implementation needs the actual values belonging to the event being sent.

Good event_id sources

SourceUseful forRequirement
Order IDCommerce purchasesUnique for each order
Transaction IDPayment eventsStable across browser/server paths
UUIDEvents without an existing business IDGenerated once and persisted
Checkout event IDCheckout systemsSame value reaches both tracking paths

For a Purchase, an existing order or transaction identifier is often easier to reconcile against your own records than a newly invented identifier.

5. The Most Common Causes of Duplicate Meta CAPI Events

When one purchase appears twice, do not immediately assume Meta’s deduplication system is broken. Work through the event sources.

1. Browser and server use different event IDs

This is the classic failure:

Browser:
eventID = order_18492

Server:
event_id = 6a1a8f4e-new-random-id

Those are different event IDs. Meta cannot treat them as the same event under the primary deduplication method.

2. One side has no event ID

If the browser sends a Purchase without the shared event ID while the server sends a different or independent ID, the two implementations have no deterministic primary deduplication key.

3. Multiple systems are all sending Purchase

This is especially common after adding server-side tracking.

For example, a business might have:

  • a native ecommerce-platform Meta integration;
  • a Google Tag Manager browser implementation;
  • a server-side GTM or CAPI connector; and
  • a custom Make.com webhook sending Purchase.

Every individual integration can appear to be working correctly while the combined system sends the same purchase more than once.

Audit the complete event graph, not just the CAPI request. Search every source capable of sending the affected event. A perfect server payload cannot fix a second independent integration that is also sending Purchase.

4. The event names don’t correspond

Check the browser event name and the CAPI event_name together. Standardize the naming convention before debugging anything else.

5. The CAPI event is delivered too late

Meta’s primary deduplication method uses a 48-hour matching window. A payment event normally should not be sitting in a queue for days before the corresponding CAPI request reaches Meta.

For delayed server processing, inspect the real event timestamps and the time Meta receives the events instead of assuming that the original transaction time tells you whether the deduplication window was met.

6. A retry generates a new event ID

This is a subtle but important failure in custom webhook systems.

Correct:

Attempt 1 → event_id = order_18492
Attempt 2 → event_id = order_18492
Attempt 3 → event_id = order_18492

Dangerous:

Attempt 1 → event_id = order_18492
Attempt 2 → event_id = retry_839221
Attempt 3 → event_id = retry_410882

The retry logic should preserve the event identity. A retry is another delivery attempt for the same event, not a new real-world purchase.

7. The Pixel and CAPI are pointing at different destinations

Verify the Pixel or dataset destination on both sides. The primary method requires the events to be associated with the same Pixel ID.

8. The Purchase fires more than once in the browser

Not every duplicate Purchase problem is Pixel-versus-CAPI duplication. A thank-you page that fires Purchase again after a refresh, multiple tracking plugins, duplicate tag-manager triggers, or a checkout script that initializes twice can produce multiple browser events before CAPI is even considered.

Always establish how many times the browser event itself fires, how many times the server event fires, and how many sources are involved.

6. How to Test Meta CAPI Deduplication

Do not validate a new implementation solely by looking at campaign-level ROAS. Use Meta’s event-testing tools and compare the actual browser and server payloads.

Step 1: Generate a controlled test event

Open Meta Events Manager and use the Test Events area for the relevant data source. Meta’s Conversions API playbook documents using a test event code so server events can appear in the Test Events window.

Step 2: Trigger one test conversion

Use a controlled test purchase or equivalent test event. Do not generate several unrelated test events before you understand what the first one produced.

Step 3: Verify the browser event

Confirm the browser event contains:

  • the expected event name;
  • the expected event ID; and
  • the intended destination Pixel/dataset.

Step 4: Verify the server event

Inspect the server-side request generated by your platform, webhook or Make scenario.

For the same test transaction, confirm:

Browser:
event = Purchase
eventID = order_TEST_001

Server:
event_name = Purchase
event_id = order_TEST_001

Step 5: Check the resulting event information

Meta’s documentation describes Event Overview and Event Deduplication views where you can inspect received, processed and deduplicated events and review deduplication-key coverage.

Deduplication test checklist

  • ✓ Browser Purchase fires once.
  • ✓ Server Purchase fires once.
  • ✓ Browser eventID equals server event_id.
  • ✓ Browser event name equals server event_name.
  • ✓ Both events use the intended Pixel/dataset.
  • ✓ The server retry preserves the original event ID.
  • ✓ No second plugin, app or tag fires an independent Purchase.

7. Event Coverage Is Not the Same as Event Deduplication

This distinction is important because Meta now exposes several separate diagnostics, and the terms are easy to mix up.

DiagnosticWhat it tells youWhat it does not tell you
Event CoverageHow much browser-side event activity is also represented through server-side delivery.It does not by itself prove that duplicate browser/server events were correctly deduplicated.
Event DeduplicationWhether redundant browser/server events are being recognized as the same event.It does not tell you whether a missing browser event was recovered by CAPI.
Event Match QualityHow effectively customer information attached to server events can be matched to Meta accounts.It does not prove that browser/server duplicates are correctly deduplicated.
Data FreshnessHow quickly event data is reaching Meta compared with when the event occurred.It does not replace event-ID validation.

Meta’s documentation separates these diagnostics: Event Deduplication examines redundant events and their deduplication keys, while Event Coverage and Data Freshness measure different parts of the data connection.

Example: you can have good server coverage but poor deduplication if your server is faithfully sending every Purchase while using IDs that do not correspond to the browser IDs. Conversely, you can have clean deduplication for the subset where both paths overlap while still having incomplete server coverage.

8. Deduplication vs Event Match Quality

Event Match Quality is another separate diagnostic.

Fixing duplicate Purchase events does not automatically make the server events easier for Meta to match to people. Conversely, a server event can have useful customer information while still being incorrectly duplicated.

For that reason, treat these as two separate engineering tasks:

  • Deduplication: make the browser/server copies identify the same event using the appropriate deduplication keys.
  • Match quality: send accurate customer information in the format Meta expects when that information is legitimately available.

Do not invent customer identifiers simply to increase a score. Use real information collected through the applicable customer journey and handle consent and data-processing requirements appropriately.

For the complete normalization, hashing, fbp, fbc, IP, user-agent and external_id discussion, see the dedicated Facebook CAPI Match Quality guide. That page deliberately treats EMQ as a diagnostic rather than a universal pass/fail number.

9. The Secondary Deduplication Method

Meta’s developer playbook also documents a secondary method that can use event_name together with fbp and/or external_id, plus event timing. The browser event must arrive first for this method, and Meta explicitly recommends the event_name + event_id method instead because the fallback has limitations.

This is why a common explanation that says “Meta deduplicates on fbc, fbp and IP” is misleading.

fbc and fbp are useful customer/browser context, and they can contribute to matching and attribution, but they should not be substituted for a stable shared event_id when you control both event paths.

Best practice: use a deterministic, event-specific event_id wherever you can. Preserve the same ID from event generation through every server retry. Treat browser identifiers such as fbp and click identifiers such as fbc as separate data fields with separate purposes.

10. What a Clean CAPI Purchase Architecture Looks Like

Browser Pixel fires Purchase + shared event ID
Server Payment/webhook path sends Purchase + same event ID
↓
One event identity Meta receives corresponding browser + server copies and applies its deduplication rules.

A practical implementation can look like:

Customer completes order
        ↓
Order / transaction ID created
        ↓
 ┌───────────────────────┐
 │   Shared event_id     │
 │   order_18492         │
 └───────────────────────┘
        ↓
   ┌───────────────┬───────────────┐
   ↓                               ↓
Browser Pixel                    Server
Purchase                         Purchase
eventID                           event_id
order_18492                       order_18492
   │                               │
   └──────────────┬────────────────┘
                  ↓
             Meta dataset
                  ↓
        Deduplication + processing

11. Where Make.com Fits

Make.com does not perform Meta’s deduplication decision. Its role is to help you move, transform and deliver the event correctly.

A typical Make-based architecture can look like:

Payment / CRM / Application
        ↓
Make Webhook
        ↓
Validate event
        ↓
Map event fields
        ↓
Preserve event_id
        ↓
Normalize / hash eligible customer data
        ↓
HTTP or Meta integration
        ↓
Meta Conversions API

The critical part is not “using Make.” It is preserving the event identity from the originating business event through the entire automation.

If a Stripe webhook contains an order or transaction identifier, that value can be carried into the CAPI event. If your source already contains a browser-generated event ID, the automation should preserve that same ID instead of creating a new one at the webhook stage.

Make is the routing layer, not the deduplication engine. Meta decides whether the browser and server events are duplicates. Make’s job is to deliver the correct fields reliably and consistently.

When Make is useful for this architecture

  • Payment processors need to send conversion events into Meta.
  • CRM events need to be routed into Conversions API.
  • You need field transformation before delivery.
  • Customer information needs controlled normalization and hashing.
  • You want logging and error handling around the API request.
  • You need one event source to feed several downstream systems.

Build the CAPI workflow in Make.com

If your problem is not just the Meta payload but the workflow moving the event from Stripe, a CRM or another source into CAPI, Make provides the scenario builder and webhook/API infrastructure for that routing layer.

Open Make.com →

Affiliate link. CreatorOpsMatrix may earn a commission at no additional cost to you.

Related Meta Tracking Fixes

Frequently Asked Questions

Why are my Meta Pixel and CAPI Purchase events being counted twice?

The most common cause is that the browser and server versions of the same Purchase do not share a valid deduplication key. For Meta’s primary method, check that both events use the same event_name and the same event_id, and that they are associated with the same Pixel/dataset within the deduplication window. Also check for a second independent integration sending its own Purchase event.

What event_id should I use for Facebook CAPI deduplication?

Use a stable unique identifier for that specific event. For a Purchase, an order ID or transaction ID is often convenient because it already exists in your business system. A UUID can also work, provided the exact same value reaches both the browser and server copies of the event.

Does event_id have to be the same on Pixel and CAPI?

Yes. For Meta’s primary deduplication method, the browser Pixel’s eventID must correspond to the Conversions API’s event_id for the same event, along with the corresponding event name. Meta’s documented method uses those values as deduplication keys.

What is the Facebook CAPI deduplication window?

Meta’s documented primary method uses a 48-hour window for corresponding events with the same event name and event ID sent to the same Pixel ID. The later duplicate is discarded.

Can Meta deduplicate without event_id?

Meta also documents a secondary method involving event_name with fbp and/or external_id plus event timing. It has limitations, including an ordering requirement, and Meta recommends the event-name plus event-ID method instead.

Does fbc prevent duplicate CAPI events?

fbc is useful click-context data for Meta measurement and matching, but it should not be treated as a replacement for a shared event_id when you control both browser and server event paths. The primary deduplication method is the matching event name and event ID.

Should I turn off the Meta Pixel if I already have CAPI?

Not simply because you see duplicates. First determine whether the browser and server events are supposed to represent the same event and whether their deduplication keys match. Meta’s documentation supports browser + server connections for redundant event coverage. A server-only implementation is possible, but it is a different architecture and should be evaluated deliberately rather than used as a quick fix for a broken deduplication setup.

What does 0% Event Coverage mean in Meta?

Event Coverage is a separate diagnostic from deduplication. It looks at how browser-side events are represented through server-side delivery. A low coverage result does not automatically prove that your browser Pixel is broken, and it should not be confused with the Event Deduplication metric.

What is the difference between Event Coverage and Event Deduplication?

Event Coverage concerns the amount of browser event activity represented through server-side delivery. Event Deduplication concerns whether corresponding browser and server events are recognized as the same event rather than being processed as two independent events. You should inspect both when evaluating a browser + CAPI setup.

Does fixing deduplication improve Event Match Quality?

Not necessarily. Deduplication and Event Match Quality measure different things. Deduplication is about identifying redundant browser/server copies of an event. Event Match Quality is about how effectively customer information attached to server events can be matched to Meta accounts. Fix the two independently.

What happens when my CAPI webhook retries?

Preserve the original event ID for the original event. A retry is a new delivery attempt, not a new purchase or lead. Creating a new event ID during each retry can prevent Meta from recognizing the requests as the same event.

How do I verify that Meta CAPI deduplication is actually working?

Use Meta Events Manager’s testing and event-detail tools with one controlled test event. Confirm the browser and server copies use the same event name and event ID, then inspect the resulting event and deduplication information. Meta’s developer playbook specifically documents Test Events and Event Deduplication views for this purpose.

Official Documentation

TA

The Architect — CreatorOpsMatrix

The Architect researches automation platforms, APIs, tracking systems and workflow reliability using official platform documentation, implementation analysis and clearly identified examples.

Scroll to Top