Every DTC operator has had this conversation with their media buyer. Meta says the campaign did 400 purchases. Shopify says 300. Someone pulls up GA4 and it says something else entirely. The buyer says “attribution windows,” you nod, and the meeting moves on.
That gap is worth understanding, because the two numbers are not measuring the same thing. One is a record of conversions the platform actually saw. The other is an estimate of conversions the platform believes happened but could not observe.
The difference matters less for reporting than it does for delivery. Ad platforms optimize on what they receive, not on what they estimate after the fact.
Two ways a platform counts a purchase
Captured. A user clicks your ad, the platform tags that click with an identifier, the user buys, and the purchase event comes back carrying that identifier. The platform matches the two and knows with certainty that this specific click produced this specific order.
Modeled. The platform sees a purchase but cannot connect it to a click, or sees a click and never receives a matching event. It fills the gap statistically, using aggregate patterns from similar accounts, similar audiences, and similar conversion paths.
Modeled conversions are not fabricated. They are a reasonable statistical response to missing data. But they are an average applied to your account, not a measurement of your account. And critically, a modeled conversion cannot be attributed back to a specific user, which means it contributes very little to the machine learning that decides who sees your ads tomorrow.
Where the signal actually breaks
Signal loss is not one event. It is an accumulation of small failures across the path from click to purchase.
Click identifiers get stripped.
The click ID (fbclid for Meta, gclid for Google)
is appended to your landing page URL. Ad blockers, privacy-focused browsers,
and some in-app browsers remove URL parameters they recognize as tracking.
If the parameter is gone before your page loads, there is nothing to store.
Cookies expire early. Safari’s Intelligent Tracking Prevention caps the lifespan of cookies set by client-side JavaScript. A shopper who clicks on Monday and converts nine days later may no longer carry the cookie that ties them to that click, even though nothing about their behavior changed.
The browser event never fires. Pixel scripts are blocked at the network level by a meaningful share of traffic. Script errors, slow loads, and users navigating away before the tag executes account for more.
Server-side events arrive without identity. Many brands turn on Conversions API and assume the problem is solved. But a CAPI event without a click ID, hashed email, or stable browser identifier attached is a purchase notification with no address on it. The platform receives it and cannot match it to a click.
None of these are exotic. They apply to every Shopify store running paid traffic.
Why a healthy-looking dashboard still costs money
Here is the part that gets missed. When signal degrades, your reported numbers often do not collapse. Modeling absorbs the loss and your ROAS looks roughly the same as last quarter.
What degrades quietly is delivery. The optimization algorithm builds its picture of your buyer from matched conversion events. Fewer matched events means a thinner signal, which means:
- Slower exit from the learning phase on new campaigns and creatives
- Broader, less accurate prospecting audiences
- Retargeting pools that undercount your actual site visitors
- Higher CPAs that get blamed on creative fatigue or auction pressure
You end up paying more per acquisition while your dashboard reports a number that looks acceptable. The cost shows up in the P&L before it shows up in the reporting.
How to check what you are looking at
You do not need a platform to run these checks.
Event Match Quality. In Meta Events Manager, look at the match quality score for your Purchase event. This is the platform telling you how often it can connect your events to real people. A score in the low-to-mid range is a direct signal that identity is being lost between your site and Meta.
Platform vs. backend. Compare platform-reported purchases against Shopify orders for the same window, using the same attribution settings, over a period long enough to smooth out noise. Persistent, structural gaps are different from timing gaps.
Browser split. If your Safari and iOS conversion rates look materially worse than Chrome on desktop, you are probably looking at a tracking problem, not a customer behavior problem.
Deduplication. If you are running pixel and CAPI together, confirm events share an event ID and are being deduplicated. Double-counted events are as damaging to optimization as missing ones.
What capturing signal actually requires
Fixing this is not a matter of adding another tag. Three things have to be true.
Capture the click identifier before anything can remove it. This means intercepting the parameter at the edge, before the page renders and before any client-side script or blocker has the chance to act on it. Once the browser has had its turn, the parameter may already be gone.
Persist identity server-side. The click identifier, the session, and the eventual order need to be stitched together outside the browser, where cookie policies and blockers do not apply.
Send clean, deduplicated events. Conversion events go to the platform with the identifiers attached, deduplicated so nothing is counted twice.
This is the architecture Nvektor runs. Click identifiers are intercepted at the edge through middleware before page load, stored in the format Meta expects, stitched to the order server-side, and forwarded through the Conversions API only, with deduplication handled internally rather than left to matching rules between pixel and server events. Accounts running this setup are reaching Event Match Quality scores of 9.3.
The goal is not a bigger number on the dashboard. It is a smaller share of your reporting that depends on someone else’s estimate of your business.
The honest version of the pitch
Plenty of platforms will tell you they recover lost conversions. Read the mechanism carefully. Some of them are running their own model over the same incomplete data your ad platform already has, then presenting the output as recovered truth. Two models on top of one gap is not measurement.
The only durable fix is to lose less signal in the first place.