Why it happens
Nothing sends from the server yet. The Meta pixel reports a purchase from the shopper's browser. Without a server connection, every purchase lost to an ad blocker, a declined cookie banner or a shopper who never returns from the payment page is lost to Meta. On WooCommerce you can use Meta's own plugin, Meta for WooCommerce (Facebook for WooCommerce on WordPress.org), whose documentation page, which Meta no longer updates, says the Conversions API is built in. A server-side tag manager, your own code or an app such as Tikra can do it as well.
The access token is missing or wrong. Every server request needs an access token. In Events Manager you generate it under your pixel's Settings, in the Conversions API section. Meta shows the Generate access token link only to people with developer privileges for the business, so some store owners never see it. A token made for another pixel is refused. When a token stops working weeks later, see Meta Conversions API access token stopped working.
Old or wrongly timed events are refused. Meta takes an event_time up to 7 days in the past. If one event in a request is older, Meta returns an error for the whole request. A setup that sends late, or sends the time of the request instead of the time of the order, loses purchases or puts them on the wrong day.
Browser and server copies do not share an ID. When the pixel and the server send the same purchase, Meta counts it once only when both carry the same event ID and event name, and only within 48 hours of the first one. Without a shared ID, Meta may count both.
The purchase goes out at the wrong moment. WooCommerce can create an order, with the status Pending payment, before the shopper pays. A setup that sends Purchase at that moment counts orders that are never paid. One that waits for the order received page misses shoppers who do not come back.
Check it yourself
- 1In Events Manager > Data sources > your pixel > Overview, open the Purchase event and read where the events came from: browser, server or both, for the last 7 full days.
- 2In WordPress, open WooCommerce > Orders and count orders with the status Processing or Completed for the same days.
- 3If the server count is zero, open your pixel's Settings in Events Manager and check that a Conversions API connection exists and which tool it belongs to.
- 4Open Events Manager > Test events, copy the test code into your plugin or server tool and place a test order. Check that a server Purchase arrives with a value, a currency and an event ID.
- 5Remove the test code again when you are done: Meta says it does not belong in live requests.
- 6In the Purchase event's details, check deduplication between browser and server events. A low rate means the two copies do not share an ID.
- 7Compare the server count with your paid orders. If it is higher, look for orders that were sent before payment, or a second server sender.
- 8Keep one tool that sends the server Purchase to this pixel.
On Shopify the options are different; see Meta's Conversions API options for Shopify.
FAQ
Do I still need the pixel?
Usually yes. Meta's deduplication guide covers sending both and matching them by event ID. The pixel adds browser details, such as the cookie and click details, that help Meta match the buyer.
Can I send orders from last month?
No. Meta refuses events older than 7 days.
Does the Conversions API need a plugin?
No. It is an API, so any server that can call it works. A plugin or an app saves you the code.
Why does Meta count more purchases after I turned it on?
Usually the browser and server copies do not share an event ID, or two tools now send the same purchase.