Pixel events firing twice — how to fix

Pix-Vu Team||3 min read
Pixel events firing twice — how to fix

Quick Answer

Add a unique event_id to every event when you fire it from both the Pixel and the Conversions API. Meta uses the event_id to deduplicate matching events within 48 hours of each other. Most double-fire issues come from running Pixel and CAPI without deduplication.

Step-by-step fix

  1. Open Events Manager → your pixel → Overview → check the "Deduplication" indicator. If it shows red or warns about duplicates, you have a problem.
  2. Identify the source. Click into the event → check "Event Sources" — is it firing from both Pixel (browser) and Conversions API (server)? Or twice from the same source?
  3. For Pixel + CAPI duplicates: add a matching event_id to both events. The Pixel's eventID parameter and the CAPI's event_id field must be identical.
  4. For Pixel-only duplicates (firing twice in the browser): check for multiple pixel installations, double-tag-manager triggers, or React strict mode causing double effects.
  5. For CAPI-only duplicates: check your server-side code — webhooks and order completion handlers often fire twice on retries.
  6. Test in Test Events (Events Manager → Test Events). Trigger the event once and confirm only one event appears.
  7. Check the Diagnostics tab for the deduplication score. You want it above 90% to be confident.

Why it happens

Double-firing causes, in order of frequency:

  1. Pixel + Conversions API without event_id matching. Both fire the same event for the same user, but Meta can't tell they're the same, so it counts both.
  2. Multiple pixel base codes on the same page. Common when an old pixel wasn't removed before adding a new one, or when a tag manager and a hard-coded pixel both run.
  3. React Strict Mode in development triggers effects twice. If your event-firing code is inside a useEffect, it'll fire twice in dev.
  4. Tag Manager misconfiguration — the tag fires on both DOM Ready and Window Loaded.
  5. Webhook retries server-side. Stripe, Shopify, and others retry webhooks that don't return 200 fast enough — your CAPI handler then sends the event twice.
  6. Single Page App (SPA) navigation. The pixel fires on initial load and again on client-side navigation back to the same page.
  7. Double form submissions. User clicks submit twice, your code fires the lead event twice.
  8. Multiple Google Tag Manager containers loading the same pixel.

How to prevent it

  • Always set event_id when firing events. Use a UUID or a hash of (user_id + event_name + timestamp_hour).
  • Pass event_id from Pixel to CAPI so they match. The standard pattern is to generate it server-side and inject it into the page.
  • Audit your site for duplicate pixel installations. Use Pixel Helper to count how many pixel IDs are detected on each page.
  • Disable double-fire in tag manager by setting triggers to fire once per page.
  • Use idempotency keys server-side for webhook handlers so retries don't double-count.
  • Throttle button clicks in your forms to prevent double submission.
  • For SPAs, fire PageView only on actual route changes, not on every render.
  • Set up event_id deduplication in Meta: it works automatically as long as both events have the same event_id within 48 hours.

When to escalate to Meta support

Escalate if:

  • You've added matching event_ids and the Diagnostics tab still shows duplicates.
  • The duplicate rate is above 50% even with proper deduplication.
  • You see ghost events with no source attribution (rare Meta-side issue).

Use Pro Team Chat with the dataset ID, sample event_ids, and a screenshot of the Diagnostics tab. Most deduplication issues are configuration problems, not Meta bugs.

Pix-Vu mention

Fix your tracking, then upgrade your creative — those are the two highest-leverage things you can do this week. Pix-Vu helps with the second part by cleaning up and modernising your existing ad library.

Ready to automate your Facebook ads?

Let AI handle your ad creative, targeting, and optimization. Launch profitable campaigns on autopilot.

Get Started Free