Conversions API
Also called CAPI
By the AdFlint research team · Last reviewed November 2026
Sends conversion events to Meta from your server or CRM instead of the visitor's browser, bypassing client-side signal loss.
Your backend posts events straight to Meta's endpoint with hashed customer parameters and the browser identifiers fbp and fbc for matching. You add it because pixel-only setups lose events to blockers and tracking prevention, and because server events can carry offline or delayed outcomes. Send the same event from both sources with a shared event_id so Meta deduplicates; skip that and you will double-count purchases and mislead the bidding system.
Key takeaways
- The Conversions API sends events from your server to Meta, so ad blockers and browser restrictions cannot remove them.
- Send the same event from the Pixel and the server with a shared event_id and matching event name, or Meta cannot deduplicate it.
- Hash email, phone, and name fields with SHA-256, but never hash fbp, fbc, the IP address, or the user agent.
- Deduplication only works within 48 hours, and server events older than 7 days make the whole request fail.
In practice.
The Conversions API (CAPI) is Meta's way of receiving events from your server instead of from a visitor's browser. Your backend, CRM, or a partner integration sends an HTTP POST request to Meta's Graph API at an address built from your Pixel ID, with an access token attached. Each event carries an event_name such as Purchase, an event_time as a Unix timestamp in seconds, an action_source such as website, and a user_data block that holds the identifiers Meta uses to match the event to a person. You manage the connection in Events Manager, where the same data set (the Pixel ID) receives both browser and server events. The access token you attach is a credential, so store it on the server and never in page code. Most small shops use a partner integration instead of hand-written code.
Matching depends on the customer information you send. Meta requires fields like email (em), phone (ph), first and last name, city, state, zip, and country to be normalized and hashed with SHA-256 before sending. Email is trimmed and lowercased. Phone numbers drop symbols, letters, and leading zeros and include the country code. Some values must not be hashed: client_ip_address, client_user_agent, fbp, and fbc. The fbp value is the browser ID the Pixel stores in the _fbp cookie, and fbc carries the fbclid from an ad click. Server events are only as good as what your backend knows at the moment of sending. A checkout that saves the email, phone, and browser IDs with the order gives you more to match than one that records only an order number and a total.
CAPI works alongside the Pixel, not against it. The recommended setup sends the same event from both sources and gives them a shared event_id. Meta deduplicates when the Pixel eventID equals the server event_id and the event names match, both sent to the same Pixel ID, and only if the second copy arrives within 48 hours of the first. If you have no event_id, Meta falls back to matching on event_name plus fbp or external_id, which generally works only when the browser event arrives first. Events sent from one source alone are not deduplicated against themselves. Keep the two sources aligned in more than the ID. Send the same event names, the same currency, and the same value from the Pixel and the server, or one copy will disagree with the other and you will chase a gap that is really a formatting difference.
The usual mistakes are all about matching and timing. Sending server events without an event_id means purchases get counted twice, which inflates reported results and trains delivery on bad numbers. Sending too little customer information leaves events unmatched, so they cannot be attributed to an ad. Hashing the fields Meta says not to hash breaks matching. Late uploads fail too: event_time can be up to 7 days before the send, and if any event in a request is older, the whole request returns an error and nothing is processed. For offline store events with physical_store as the action source, Meta says to upload transactions within 62 days of the conversion. There is also a quieter mistake: sending every event twice from the server alone, for example when a webhook retries. Because deduplication needs a matching event_id, a stable ID built from the order number is safer than a random one generated on each send.
To read it in reporting, open Events Manager and look at each event's source: Browser, Server, or both. Check the event match quality information and the deduplication status for Purchase and Lead. This week, pick your one most valuable event, confirm the browser and server copies share an event_id, and compare the server count to your store or CRM orders for the same dates. If the server count tracks your real orders more closely than the Pixel does, that gap is the signal you were losing before. When you review it, test one real order end to end instead of trusting a green status light. Place the order, find it in the event list, check its source, and confirm only one Purchase was kept.
Duplicate purchases without an event_id
Say an online shop spends $6,000 in a month on Meta and truly gets 200 orders at $60 each, which is $12,000 in revenue and a true ROAS of 2.0. Ad blockers and browser limits mean the Pixel only sees 150 of those orders. The shop adds the Conversions API, and the server sends all 200 orders.
If both sources send Purchase with the same event_id and the same event name, Meta keeps one copy of each order and reports 200 purchases, $12,000, and a cost per purchase of $30. If the developer forgets the event_id, the 150 orders the Pixel caught are counted twice. Meta reports 350 purchases and $21,000, a ROAS of 3.5 and a cost per purchase of about $17.14. Delivery then optimizes on numbers that overstate the truth by 75 percent, and the owner scales spend on a result that does not exist. The fix costs a few lines of code, a stable ID built from the order number, and it protects every later decision made from that account.
Conversions API compared with
The settings this gets confused with, and how to tell them apart.
Common questions.
Do I still need the Meta Pixel if I use the Conversions API?
Meta's guidance is to run both and deduplicate them with a shared event_id. The Pixel catches browser signals like page views and clicks quickly, and the server copy fills gaps left by blockers and tracking prevention.
What is the difference between fbp and fbc?
The fbp value is a browser identifier the Pixel saves in the _fbp cookie on your domain. The fbc value carries the click ID from the fbclid parameter added to your URL when someone clicks a Meta ad. Both are sent unhashed.
How long can I wait before sending a server event?
The event_time can be up to 7 days before you send it. If any event in a request is older than that, the entire request returns an error and none of its events are processed.
Why are my purchases showing twice in Events Manager?
Most often the browser and server events lack a matching event_id, or the event names differ in spelling or case. Meta deduplicates on the ID and event name together, within 48 hours of the first copy.
Sources
- Handling Duplicate Pixel and Conversions API Events, Meta for Developers, checked Nov 4, 2026
- Customer Information Parameters, Meta for Developers, checked Nov 4, 2026
- Using the API (Conversions API), Meta for Developers, checked Nov 4, 2026
You should not need to know this to advertise.
AdFlint handles the settings for you, inside the Google and Meta accounts you already own.
Next step: How AdFlint tracks and optimizes these numbers
Try AdFlint free