What the Meta Conversions API actually is
The Conversions API (often called CAPI) is Meta's server-to-server channel. Instead of a script in the buyer's browser telling Meta that a purchase happened, a server sends the same Purchase event directly to Meta's API, using an access token you create in Events Manager.
It doesn't replace the pixel. Meta recommends running both: the pixel catches what happens in the browser, the Conversions API makes sure the important events still arrive when the browser can't send them. On Shopify that matters most for the Purchase event, because it's the one your campaigns optimize for.
What Meta needs to match a server purchase to an ad
A server event on its own is just an order. Meta has to work out which person it belongs to, and whether that person saw or clicked one of your ads. It does that with customer information parameters. The more of these you send, the better the match:
- fbc: the Facebook click id, built from the fbclid that's in the URL when someone clicks your ad. This is the strongest link to a specific click.
- fbp: the browser id Meta's pixel stores in the _fbp cookie.
- Email and phone, hashed with SHA-256 before they're sent. Never plain text.
- The buyer's IP address and user agent from the visit.
- An external id, so a returning buyer is recognized as the same person.
The part most setups get wrong: keeping the click
The fbclid only exists on the landing URL. If your buyer clicks an ad on Monday, leaves, and comes back through Google on Friday to buy, a server that only looks at the order has no fbc to send. Meta then has to rely on email and phone alone, which works for some buyers and not for others.
That's why the click has to be saved the moment the visitor lands, and stored with that visitor until they pay. Settl keeps it for 90 days, first-party, on your own store.
Deduplication: one purchase, not two
When the pixel and the Conversions API both report the same order, Meta needs to know they're the same event. It checks two things: the event name and the event id. If the browser pixel sends Purchase with eventID 1047-abc and the server sends Purchase with event_id 1047-abc, Meta keeps one.
If the ids differ, or one side sends no id at all, you get double counting. Your ROAS looks great in Ads Manager and nothing in your bank account agrees.
How to check it works in Events Manager
Open Events Manager, pick your dataset (pixel) and look at the Purchase event in the Overview. You want to see it received from both Browser and Server. The deduplication details show what share of browser and server events were matched up.
Event Match Quality is shown per event on a 0 to 10 scale. A Purchase score in the higher range usually means hashed email, phone and fbc are getting through. Use the Test Events tab with a test code to watch a test order arrive live, and check the Diagnostics tab for warnings about missing parameters or duplicates.
Meta Conversions API on Shopify: your three options
There are three common ways to run the Meta Conversions API on a Shopify store, and each suits a different kind of store.
Shopify's own Facebook & Instagram channel is free and already connected to your catalog. On its maximum data-sharing setting it sends server events for Meta. It's a sensible default if Meta is your only ad platform and you don't need to see what happens per order.
Server-side Google Tag Manager, often hosted on Stape, gives you full control over every parameter. It's flexible and the hosting can be cheap, but someone has to build and maintain the tags, the click storage and the deduplication. When a theme update breaks something, you need that person again.
A dedicated tracking app sits in between: no tags to build, but more control than the built-in channel. Settl saves the click on landing, sends every paid order to Meta with hashed details and a shared event id, retries failed sends, and does the same for TikTok, Google, Snapchat, Pinterest, X, Microsoft Ads and Reddit from one setup. Whichever route you choose, choose one per pixel.
Common mistakes on Shopify
- Two server sources at once, for example Shopify's Facebook & Instagram channel on maximum data sharing plus another CAPI app, without a shared event id. Pick one server source per pixel.
- Sending Purchase on order creation instead of on payment, so unpaid or cancelled orders count as sales.
- Leaving a test event code in a live setup, so real purchases end up in Test Events only.
- Theme snippets from an old pixel install still firing next to the app.
- Sending events days late. Meta only accepts events up to 7 days old.