Skip to content
Meta Measurement

One Customer Action, Two Pipes, One Event: Fix Meta CAPI Deduplication

The browser and server may describe the same customer action. Give that action one durable identity so Meta can deduplicate it—and so a green dashboard cannot hide a broken event contract.

Paid media team tracing browser and server conversion events

Field note

By XenGrowth EditorialPublished Reviewed 10 min read

Key takeaways

  • Browser and server copies of the same action need the same event name and a stable shared event ID.
  • Create the event ID when the business action occurs; do not generate unrelated IDs inside each transport.
  • Test duplicates, retries, missing browser signals, delayed server delivery, consent states, and rejected payloads.
  • Reconcile platform events with orders, qualified leads, or another business system before trusting campaign reports.

01

Name the business event before configuring the pixel

A purchase, submitted inquiry, booked appointment, or qualified lead is a business event. The browser pixel and the server API are two delivery paths for describing it. If each path invents its own identity, Meta cannot reliably recognize that both messages refer to the same action.

Define when the event becomes true, which system creates its ID, and which later states are separate events. A form view, form submit, sales-qualified lead, and closed client should not all be renamed “Lead.” Better measurement begins with honest state changes.

02

Create one event identity and carry it across both paths

Meta’s server-side API reference describes event_name and event_id as the pair used for browser-and-server deduplication. Generate a durable event ID at the moment the action is accepted, expose that same value to the browser event when permitted, and pass it unchanged to the server event. A retry keeps the ID; a genuinely new action receives a new one.

Do not use an email address, phone number, or other personal value as the event ID. Keep customer matching fields separate, minimize them, hash where the specification requires it, and apply the organization’s consent, access, and retention rules.

Swipe to compare every column

SituationEvent identityExpected handling
Browser + server copySame name and event IDOne business event after deduplication
Server retrySame event IDRetry without inventing another action
Second real purchaseNew event IDA second business event
Lead becomes qualifiedNew event name and IDA distinct downstream milestone

03

Test failure modes, not only the happy request

Use Meta’s test tools and your own logs to exercise browser-only, server-only, paired, duplicated, delayed, retried, rejected, and consent-denied events. Record the internal event ID, time, event name, transport attempts, response, and final processing state without putting unnecessary personal data into operational logs.

A high event match score does not prove the business count is correct. Compare daily totals and sampled records with the CRM, booking system, or order database. Investigate unexplained ratios by device, browser, consent state, source, and release—not by randomly changing identifiers until the warning disappears.

04

Make ownership visible before the next tracking change

Give one team ownership of the event contract and name the engineering, analytics, media, and privacy reviewers. Version the event definition. When a checkout, form, tag manager, consent platform, CRM, or API release changes, run the same reconciliation tests again.

The goal is not to make platform reporting match the CRM perfectly; attribution rules and timing differ. The goal is to explain the difference, detect breakage early, and send the strongest permitted representation of real customer outcomes.

Primary sources and further reading

Use the source material to validate details against your own context and current platform configuration.

This field note follows the XenGrowth editorial policy: primary sources where available, visible limitations, material review dates, and no invented first-hand experience.

Stay with the problem

Explore Paid growth