Key takeaways
- A good Conversions API setup runs alongside the Meta Pixel, not instead of it, and sends the same events with the same event_name and event_id.
- Meta only deduplicates matching browser and server events received within 48 hours of the first one.
- Most "Ads Manager shows more sales than Shopify" problems are duplicate integrations, not a broken pixel.
- Event Match Quality is scored out of 10 and rises when you send hashed email and phone plus fbp, fbc, IP address and user agent.
- Meta says advertisers using both the Pixel and CAPI saw a 17.8% lower average cost per result than those without CAPI (its own figure, April 2026).
A Melbourne activewear store sees 486 purchases in Ads Manager for September. Shopify shows 410 orders from every channel combined. The founder sees a 2.9x ROAS and wants to double the budget. We ask for an hour first: Meta can't have driven more orders than the store took.
The opposite call is just as common. A Toronto skincare brand sees Ads Manager report half its real sales, plus a deduplication warning nobody understands. Both stores have the same root problem: a pixel and a Conversions API setup that don't agree on what happened.
Short answer: When the Meta Pixel and Conversions API don't match, check deduplication first. Each purchase must reach Meta from the browser and the server with an identical event_name and event_id, within 48 hours. Then remove duplicate integrations, send hashed email, phone, fbp, fbc, IP and user agent to raise Event Match Quality, and verify everything in Test Events.
What's changed in Meta tracking in 2025 and 2026?
If your tracking was set up in 2022 and left alone, several things have shifted under it.
Meta now offers a one-click server connection. On April 15, 2026, Meta announced a Meta-enabled Conversions API that it describes as needing "no technical expertise, no costs, no ongoing maintenance", alongside AI enhancements that let the Pixel add page and product details to events automatically. PPC Land's coverage of the launch notes existing Pixel users get a 30-day window before the AI feature switches on, and can turn it off in Events Manager. In the same announcement, Meta claimed advertisers using both tools saw a 17.8% lower average cost per result, as Social Media Today reported. Meta hasn't published the method, so treat it as Meta's number.
Shopify can quietly throttle app pixels. Since January 13, 2026, Shopify app pixels default to an "Optimized" data-sharing mode that can restrict data flow when Shopify sees no attribution signal, without notifying you, according to Analyzify's breakdown. Server-side CAPI isn't affected.
Attribution definitions moved. In March 2026, Meta's click-through window started counting only conversions after a link click, and a new engage-through window absorbed reactions, saves, other non-link clicks and engaged views, per Jon Loomer's 2026 attribution guide. If your reported purchases shifted in March, that may be why.
Browsers and users keep blocking more. Safari's Intelligent Tracking Prevention has capped cookies set by JavaScript, like the Pixel's _fbp cookie, at seven days since 2019. Apple's Link Tracking Protection strips click identifiers in Mail, Messages and Private Browsing. And in DoubleVerify's 2026 survey, nearly half of consumers said they use ad blockers.
How many shoppers block ads and tracking
Self-reported share of consumers, DoubleVerify global survey of 22,000 people in 22 markets, published September 2026. Browser-only pixels lose these users; server events don't depend on the browser.
Source: DoubleVerify, Global Insights: Media Quality in the Age of AI (2026), as reported by ExchangeWire
In all four markets we focus on, Safari carries between 40% and 56% of mobile browsing, so this isn't an edge case.
Safari's share of mobile browsing, September 2026
The higher this is, the more your browser-side signals suffer from 7-day cookie caps and stripped click IDs.
Source: StatCounter Global Stats, mobile browser market share for the Canada, Australia, US and UK, September 2026
How do you diagnose a Meta Pixel and CAPI mismatch?
Start by working out which way the numbers are wrong. Too many conversions points to duplication. Too few points to blocked, broken or unmatched events. Then follow the event from the checkout page to Ads Manager.
A conversion can drop out, or be doubled, at every stage. These checks find where.
- Compare three numbers for the same weekYour back-end orders, the Purchase count in Events Manager and the purchases in Ads Manager. Events Manager counts every event received; Ads Manager counts only those attributed to ads. Events Manager purchases well above real orders means duplication.
- Open the dataset in Events ManagerGo to Events Manager, select your dataset (the old pixel) under Data sources, and open Overview. Click the Purchase event to see browser and server counts, deduplication details and Event Match Quality.
- Read the Diagnostics tabLook for warnings about duplicate events, missing event_id, low match quality, invalid parameters or events sent from unverified domains.
- Watch a live order in Test EventsPlace a test order and confirm one browser Purchase and one server Purchase appear, with the same event ID, and that Meta marks one as deduplicated.
- Count your integrationsUse the Meta Pixel Helper Chrome extension on the thank-you page. Two pixel IDs, or the same Purchase firing twice, means more than one integration is live.
| What you see | Where to check | Most likely cause | First fix |
|---|---|---|---|
| Meta purchases above real orders | Events Manager Overview; Pixel Helper | Two integrations, or missing event_id | Remove the extra integration; share one event_id |
| Browser and server both counted | Purchase event deduplication details | event_id or event_name differ between sources | Use the order ID as event_id in both |
| Meta purchases far below orders | Overview: browser vs server counts | Pixel-only setup losing blocked browsers | Add CAPI; on Shopify use Maximum |
| Low Event Match Quality | Purchase event > Event Match Quality | Few customer parameters, or bad formatting | Send hashed em and ph, plus fbp, fbc, IP, UA |
| Server events missing for some days | Overview graph; server logs | Batch job failing, or events over 7 days old rejected | Send in real time; alert on failures |
| Sudden drop after a theme or checkout change | Test Events; Pixel Helper | Pixel code removed or app pixel restricted | Reconnect; set app pixel to Always on |
| Ads Manager differs from GA4 or Shopify reports | Ads Manager attribution setting | Different attribution rules, not a bug | Compare like for like; use first conversion |
What causes Meta Pixel and Conversions API data to disagree?
Ranked by how often we find them in the e-commerce and lead-gen accounts we audit.
1. Missing or mismatched event_id (deduplication event_id problems)
Meta's deduplication documentation is specific: the Pixel's eventID must match the server's event_id, and the event names must match, or both events count. Custom setups often generate a random ID in the browser and a different one on the server. The fix is to use one value both sides can see, and for purchases the order ID is the obvious choice.
Timing matters too. Meta only deduplicates events received within 48 hours of the first, and generally keeps whichever arrives first. A server job that sends yesterday's orders in a nightly batch still works. One that runs weekly doesn't.
2. More than one integration sending the same events
This is the Melbourne store's problem, and the most common source of inflated numbers. A Shopify or WooCommerce plugin sends Purchase, an old Google Tag Manager tag sends Purchase again, and sometimes a hard-coded snippet in the theme sends a third. Each has its own event IDs, so nothing deduplicates. Pick one owner for each event.
3. Event names that don't match exactly
"Purchase" from the browser and "purchase" or "Order Completed" from the server are different events to Meta. Standard event names should be identical in both places.
4. Low Event Match Quality
Meta's best-practice guide describes the EMQ score, out of 10, as a measure of how effective your server event's customer information may be for matching. Low scores usually mean the server sends only an IP address and user agent. Add hashed email (em) and phone (ph), external_id, and the fbp and fbc cookie values.
Formatting trips people up. Per Meta's customer information rules, email must be trimmed and lowercased before SHA-256 hashing, phone numbers need the country code with symbols and leading zeros removed (a Toronto number starts 1, a Manchester number 44, a Sydney number 61), and country is a lowercase two-letter code. The client IP address must never be hashed.
5. A browser-only setup losing events
If you never added CAPI, every shopper with an ad blocker or strict browser settings is invisible to Meta. Meta's own guidance says CAPI can capture events the Pixel loses to connectivity issues and recommends running both as a redundant setup.
6. Late, failed or rejected server events
Server event_time can be up to seven days in the past. Per Meta's server event parameters, if any event in a request is older than that, the whole request fails. A queue that backs up over a long weekend can silently lose a batch. Meta also requires event_source_url and client_user_agent for website events.
7. Platform settings: Shopify, WooCommerce and consent tools
On Shopify, the data sharing level decides what you get. Shopify's help page says Standard is Pixel only, while Enhanced and Maximum add the Conversions API. Consent tools are the other trap: a banner that blocks the Pixel is fine, but one misconfigured to block every Meta request also kills the server events you're legally allowed to send.
8. Attribution differences that aren't errors
Ads Manager credits conversions by Meta's attribution setting: by default 7-day click, 1-day engage-through and 1-day view. It can count several conversions from one person. GA4 and Shopify use their own rules. Some gap is permanent, and chasing a perfect match wastes days.
Conversions API setup: how do you do it correctly?
Choose the integration path first, then wire deduplication and matching. Here's the order we follow.
| Your site | Simplest CAPI route | Watch out for |
|---|---|---|
| Shopify | Facebook & Instagram app, data sharing set to Maximum | Old theme snippets or GTM tags duplicating events |
| WooCommerce | Meta's official Facebook for WooCommerce plugin | Caching plugins and a second pixel plugin |
| Any site, no developer | Meta-enabled Conversions API from Events Manager (April 2026) | Less control over which parameters are sent |
| Larger sites wanting control | Conversions API Gateway or Signals Gateway in your own AWS or Google Cloud account | Cloud hosting costs and an owner for upkeep |
| Custom stack or CRM leads | Direct API integration, or server-side Google Tag Manager | Generating and passing event_id consistently |
- Pick one owner per eventDecide which integration sends PageView, ViewContent, AddToCart, InitiateCheckout and Purchase. Disable the same events everywhere else, including GTM and theme code.
- Connect the server routeOn Shopify, go to Sales channels > Facebook & Instagram > Settings > Data sharing settings, turn on customer data sharing and choose Maximum. For other routes, start in Events Manager under your dataset's Settings, where Conversions API setup lives.
- Share one event_idIn custom builds, create the ID once (the order ID works for Purchase) and pass it to both the browser call, such as
fbq('track', 'Purchase', {value: 89.99, currency: 'USD'}, {eventID: 'ORD-10482'}), and the server event's event_id. - Send rich customer dataInclude hashed em and ph, external_id, fbp, fbc (built from the fbclid in the landing URL), client_ip_address and client_user_agent. Normalise before hashing.
- Respect consent and local lawFire events only where you have the right basis. For US states covered by Meta's Limited Data Use option, pass
data_processing_options: ["LDU"]with country and state set to 0, per Meta's data processing options. - Test before you trustUse the Test Events tab with a live order. Confirm one deduplicated Purchase, correct value and currency, and every customer parameter you expect.
- Watch Diagnostics for a weekNew warnings usually appear within days. Fix them before you judge campaign performance on the new data.
Send Purchase from the server when the order is confirmed, not when the thank-you page loads. Server events then capture shoppers who close the tab early or pay through a redirect, such as PayPal or Klarna.
For lead-gen businesses the same rules apply to Lead and to downstream CRM stages, which you can send through the Conversions API with an action_source that reflects where the conversion happened. Meta's offline events documentation now calls the old Offline Conversions API legacy, so new offline uploads should go through CAPI too. Our Meta ads team sets this up for clinics, real estate and B2B accounts.
Which tracking mistakes make the mismatch worse?
- Switching off the Pixel once CAPI is live. Meta recommends running both. Server-only setups lose browser signals and make deduplication by fbp impossible.
- Hashing the wrong things. Hashing IP addresses or fbp values, or sending unhashed email, breaks matching.
- Sending value in cents. A Purchase sent as 8999 instead of 89.99 inflates ROAS 100-fold overnight. We see it after almost every custom checkout rebuild.
- Optimising for a custom event nobody tested. If it fires twice per lead, Meta will happily find you people who trigger it twice.
- Judging campaigns during the fix. When duplicate purchases disappear, reported ROAS drops. Performance didn't get worse; the reporting got honest. Warn stakeholders first.
- Chasing an exact match with GA4. Different attribution rules guarantee a gap. Agree a tolerance instead.
Installing a new CAPI plugin "to be safe" on a store that already has one. In audits, layered plugins are the single biggest source of double-counted purchases we see.
How do you keep Meta tracking healthy?
Tracking breaks quietly: a theme update, a new checkout app, an expired access token. A short routine catches it before it costs a month of optimisation.
| Check | Where | How often | Healthy sign |
|---|---|---|---|
| Purchases vs back-end orders | Events Manager vs store admin | Weekly | Events Manager close to, not above, real orders |
| Browser vs server counts | Dataset Overview, Purchase event | Weekly | Both present every day; server not far below browser |
| Deduplication | Purchase event details | Weekly | Shared event IDs on most events |
| Event Match Quality | Purchase and Lead events | Monthly | Stable or rising; no sudden drops |
| Diagnostics warnings | Dataset > Diagnostics | Weekly | No new active issues |
| Live test order | Test Events | After any site, theme or app change | One deduplicated Purchase with correct value |
Teams selling into the US have one more item. Meta's Limited Data Use option currently applies to California, Colorado, Connecticut, Florida, Texas, Oregon and Montana, per its data processing options page. Check that list every quarter as more state privacy laws take effect.
If you'd like a partner to run this, our PPC management services include tracking QA for Meta and Google. Google-side issues are covered in our guide to fixing Google Ads conversion tracking, and our Google Ads team can audit both at once.
Worked scenario: a Melbourne activewear store double counting purchases
Illustrative numbers to show the method, not a client result.
The store from the opening moved to Shopify last year and installed the Facebook & Instagram app on Maximum. Nobody told the freelancer who'd built a GTM Purchase tag on the old site, and the tag came across with the container. In September the store spent A$24,000 on Meta, with an average order of A$145.
| Metric (September) | Before fix | After fix |
|---|---|---|
| Shopify orders, all channels | 410 | 410 |
| Purchase events in Events Manager | About 790 (app pair plus GTM tag) | About 400 |
| Purchases in Ads Manager | 486 | 268 |
| Reported revenue at A$145 per order | A$70,470 | A$38,860 |
| Reported ROAS on A$24,000 | 2.9x | 1.6x |
Pixel Helper on the thank-you page showed two Purchase events. The GTM tag sent no eventID, so Meta counted it on top of the app's deduplicated browser and server pair. Pausing the tag took five minutes. The harder job was the call with the founder: real ROAS had been about 1.6x all along, and doubling budget at a "2.9x" that never existed would have burned money fast.
The second fix was matching. Checkout stored mobile numbers as "0412 345 678". Normalising them to 61412345678 before hashing gives Meta a usable phone match for far more buyers. From there the store could judge creative and landing pages on honest data. Our landing page examples and Instagram conversion diagnostic are the next stops.