Server-side events · Platform reference
Meta Conversions API checker
The Meta Conversions API lets your server POST web, app, offline and messaging events straight to a Meta Pixel (dataset) ID, alongside or instead of the browser Pixel. Events usually show as received but go unattributed because of weak or wrongly formatted customer information (hashed fbc/fbp, missing IP or user agent, phone without country code), an event_time more than 7 days old, or an event_id that doesn't match the Pixel's eventID.
Read from the official documentation on 9 November 2026. Sources are listed at the end.
Check your own setup
Paste a Meta CAPI JSON payload and the checker flags the problems above: fbc/fbp format (and whether they were hashed), event_time older than 7 days, a missing or invalid action_source, unhashed contact fields, a missing event_id for dedup, and Purchase without value/currency. It can't see your Pixel, so it can't confirm that the browser eventID really matches.
Open the Meta CAPI Event CheckerEndpoint and authentication
POST https://graph.facebook.com/{API_VERSION}/{PIXEL_ID}/events
access_token query parameter carrying the Conversions API access token you generate for the Pixel/dataset
Standard event names
Spelled exactly as Meta expects them. A near miss is treated as a different event.
| Event | Use it for |
|---|---|
| Purchase | the only standard event Meta marks as requiring value and currency |
| Lead | lead or form submission |
| CompleteRegistration | sign-up completed |
| InitiateCheckout | checkout started; value and currency optional |
| AddToCart | value and currency optional |
| AddPaymentInfo | payment details added |
| ViewContent | key page or product view |
| Subscribe | paid subscription started |
| StartTrial | free trial started |
| Contact | contact made (call, SMS, email, chat) |
| Schedule | appointment booked |
| SubmitApplication | application submitted |
| Search | site search |
| AddToWishlist | wishlist add |
| CustomizeProduct | product customised |
| Donate | donation |
| FindLocation | store locator use |
Required and recommended fields
| Field | What it needs |
|---|---|
| event_name | Required. Standard or custom event name; it is also half of the dedup key |
| event_time | Required. Unix timestamp in seconds; at most 7 days in the past |
| user_data | Required. Customer information object (see matchKeys) |
| action_source | Required. One of email, website, app, phone_call, chat, physical_store, system_generated, business_messaging, other. Meta says that by using the API you agree the value is accurate |
| event_source_url | Marked optional, but required for website events sent through the Conversions API |
| user_data.client_user_agent | Required for website events; not hashed; must be set manually for server events |
| event_id | Optional but recommended for deduplication; Meta recommends sending it (and external_id) on all events |
| custom_data.value + custom_data.currency | Required for Purchase |
| data_processing_options | Optional; if you send LDU, data_processing_options_country is required |
Match keys and hashing
| Key | Normalise and hash |
|---|---|
| em | SHA-256 required. Trim leading and trailing spaces and lowercase first |
| ph | SHA-256 required. Remove symbols, letters and leading zeros; always include the country code, e.g. (650)555-1212 becomes 16505551212 |
| fn / ln | SHA-256 required. Lowercase, no punctuation; special characters UTF-8 encoded |
| db | SHA-256 required. YYYYMMDD, e.g. 19970216 |
| ge | SHA-256 required. f or m |
| ct | SHA-256 required. Lowercase, no punctuation, no special characters, no spaces (newyork) |
| st | SHA-256 required. US: lowercase 2-letter ANSI code (ca); elsewhere lowercase with no punctuation, special characters or spaces |
| zp | SHA-256 required. Lowercase, no spaces or dashes; US first 5 digits only; UK area+district+sector (m11ae) |
| country | SHA-256 required. Lowercase ISO 3166-1 alpha-2 (us) |
| external_id | SHA-256 recommended, not required. Any unique advertiser ID |
| client_ip_address | Never hash. Valid IPv4 or IPv6, no spaces |
| client_user_agent | Do not hash |
| fbc | Do not hash |
| fbp | Do not hash |
| lead_id | Do not hash. Integer ID from Meta Lead Ads |
Click ids
| Click id | Where it comes from |
|---|---|
| fbc | From the _fbc cookie. Format fb.${subdomain_index}.${creation_time}.${fbclid}, e.g. fb.1.1554763741205.AbCdEf...; send it unhashed in user_data |
| fbp | Browser ID from the _fbp cookie. Format fb.${subdomain_index}.${creation_time}.${random_number}, e.g. fb.1.1596403881668.1116446470; unhashed |
| ctwa_clid | Click-to-WhatsApp click ID; do not hash |
Deduplication
- Recommended method: the Pixel's eventID must equal the server event_id, and the Pixel's event must equal event_name.
- Window: events are deduplicated only if received within 48 hours of the first event with that event_id; Meta generally keeps the first one received.
- If a browser and a server event arrive at about the same time (within 5 minutes), the browser/app event is favoured.
- Alternative method: event_name plus fbp and/or external_id. This only works when the browser event arrives first; server events are not discarded if no browser event arrived in the prior 48 hours.
- An order number or transaction ID makes a good event_id. Otherwise generate a random one and send the same value from browser and server.
- Retrying is fine: if the same event_id and event_name arrive more than once, only the first copy is kept.
Time limits and batch sizes
- event_time is Unix seconds and can be up to 7 days before you send the event.
- If any event_time in data is more than 7 days in the past, Meta returns an error for the entire request and processes none of its events.
- Up to 1,000 events per request in the data array.
- Offline/physical store transactions: upload within 62 days of the conversion.
- Meta recommends sending events in real time or in batches close to real time. You should be able to verify events about 20 minutes after you start sending.
How to test before you trust it
- Test Events tool (Events Manager): Copy the generated test ID and send it as test_event_code in the payload. Remove it before sending production payloads.
- Payload Helper: Fill in the required and recommended fields to see how your payload should be structured before your server sends it.
- Event Match Quality: In Events Manager, each server event gets a score out of 10 showing how well its customer information can match to a Meta account. Web events only.
- Events Manager overview: Shows the number of raw, matched and attributed events received.
Why events arrive but don't attribute
- fbc or fbp sent hashed. Meta says not to hash them, so a hashed value can't be matched to the click. Read them from the _fbc and _fbp cookies, send them as-is, and refresh them regularly.
- A single stale event sinks the batch: if any event_time is more than 7 days old, the whole request is rejected and none of its events are processed.
- Pixel eventID and server event_id differ (or the Pixel event and server event_name differ), so the pair isn't deduplicated and Purchase is double-counted. Duplicates arriving more than 48 hours apart are never merged.
- Website events with no client_user_agent or event_source_url. Both are required for website events, and client_ip_address has to be added manually on the server.
- Contact information (email, phone, name) sent unhashed. Meta's systems are designed not to accept it.
- Phone numbers without a country code, or with leading zeros, hash to a different value and won't match. Meta says to always include the country code.
- Purchase sent without value and currency. Both are required for Purchase, so there is no value for ROAS reporting.
- test_event_code left in production code. Meta says to remove it from production payloads.
Sources
- Meta for Developers: Conversions API server event parameters
- Meta for Developers: Customer information parameters
- Meta for Developers: Handling duplicate Pixel and Conversions API events
- Meta for Developers: Using the Conversions API
- Meta for Developers: Conversions API best practices
- Meta for Developers: Meta Pixel API reference
Platforms change these rules without notice. If a source says something different from this page, the source wins.