Quick Answer: On headless Shopify, installation and implementation are two different things, and nothing warns you about the gap between them. Verify by comparing Meta Pixel purchase events against actual Shopify order counts for the same window, checking every destination you use, not just Meta, and confirming express checkout orders show up separately from standard checkout. A small, consistent gap is normal. A large one means events are missing or misfiring, not that your ads got worse.
Key Takeaways
- Headless tracking doesn't throw obvious errors when it breaks. It quietly produces slightly lower numbers month after month, which is easy to blame on ad performance instead of the actual, broken data underneath it.
- The core check is comparing Meta Pixel purchase events against actual Shopify order counts for the same window. They should be close, a large gap means real events are missing or misfiring.
- Right after finishing a Hydrogen or custom JS implementation, use Meta's Test Event Code field to watch events land in real time, rather than waiting a week to discover something's broken.
- Most Shopify brands send data to several destinations, Meta, Google Ads, Klaviyo, TikTok, and a standard theme install covers all of them automatically. Headless removes that shortcut, so each destination needs to be checked independently, not just the one on your dashboard.
- Express checkout paths like Shop Pay, Apple Pay, and PayPal skip the standard checkout flow your tracking script is watching, and need to be verified as their own, separate check.
The biggest headache with headless Shopify tracking is that installing it doesn't mean it's actually working. You might have everything set up, but that doesn't guarantee your events are firing, and that's the core problem worth hitting on directly.
On standard Shopify stores, installing an app is basically proof that things are working. But with Hydrogen or custom builds, installation and implementation are two different things, and nobody warns you if there's a gap between them. You won't see an error message, you'll just see slightly lower numbers month after month, leaving you to guess why performance isn't what it should be.
Why do you need to look for a mismatch instead of an error?
Because headless tracking doesn't usually throw big, obvious errors, it just quietly stops working. You won't get a notification saying your checkout data is missing, you'll just see fewer conversions, which makes it easy to blame your ads instead of realizing the data itself is broken.
The fix is comparing two numbers that should already agree with each other.
What's the core check, and how do you actually run it?
Pull your Meta Pixel purchase event count from Events Manager for a set window, say the last 7 days. Then pull your actual placed-order count from Shopify for that same window.
These numbers should be close, not identical to the decimal, but within a small margin, maybe off by a handful depending on timezone or a 1 to 2 day attribution lag. If Meta shows 340 purchases and Shopify shows 512 orders, you've found a real gap, and now you know where to look. This works because Purchase is the event every headless build tends to prioritize, it's the one everyone's watching. Which means if even Purchase is off, everything upstream of it, AddToCart, InitiateCheckout, PageView, is probably in worse shape.
Why shouldn't you wait a week to find out?
Because comparing weekly Purchase counts means you don't know something's broken until a week's worth of data has already been lost. Right after finishing a Hydrogen or custom JS implementation, there's a faster check available.
Meta Events Manager has a Test Event Code field, under Meta Setup, that lets you watch events land in real time as you click through your own storefront. Add a product, start checkout, complete a test purchase. If the event shows up in the Test Events tab within seconds, that specific event is firing correctly. If it doesn't, you've found the gap immediately instead of a week from now. Use this right after implementation, then fall back to the weekly comparison for ongoing monitoring.
What does the Diagnostics tab tell you that Overview doesn't?
Events Manager's Diagnostics tab flags event quality issues directly, things like missing parameters or a recommended update, often before a full comparison against Shopify would even show a discrepancy.
Check Diagnostics before running the numbers, and you'll often already know which specific parameters are causing the gap, not just that a gap exists somewhere.
Why do you need to check every destination, not just Meta?
Because Meta is the easiest place to run this check, the comparison against Shopify orders is so direct, but stopping there means you've only verified one destination out of the ones you're actually using.
Most Shopify brands send data to some combination of Meta (Pixel, Conversions API), Google Ads, Klaviyo, and TikTok. A theme store's single app install typically covers all of them, since they all pull from the same theme-layer source. Headless removes that shortcut. Whatever manual method fires your events has to actually reach every destination you use, not just the one someone happened to check. This is where partial fixes usually hide. A team spots a gap in Meta and fixes it, but forgets to check whether Klaviyo or Google Ads are missing data too. Since every platform is its own silo, these issues stay under the radar just because no one thought to double-check the other channels.
Why does express checkout need its own separate check?
Because payment options like Shop Pay, Apple Pay, and PayPal often skip the normal checkout flow your tracking scripts are watching, leaving a real hole in your attribution even though the sales are hitting your Shopify dashboard normally.
If you're only tracking the standard path, you're missing data for those orders. Check a handful of orders from Shop Pay, Apple Pay, or PayPal specifically, and confirm they're actually showing up in your Meta Events Manager. Since these payment methods skip the usual checkout flow, they're easy to miss if they aren't firing, and for stores where express checkout makes up a meaningful share of orders, that gap can be a real, uncounted portion of total sales, not a rounding error.
What does a passing check actually look like?
Four specific conditions, all needing to hold at once, not just one of them.
Meta Pixel purchase events land within a small margin of actual Shopify order counts for a given window. The same check holds for every destination you use, not just Meta. Express checkout orders show up in your Pixel data, not just standard checkout orders. And your EMQ score sits in the range Meta's own ecosystem considers strong: roughly 8.6 to 9.3 for Purchase, 7.5 or higher for AddToCart and InitiateCheckout, ranges consistent with what independent Meta ad-tech guides cite as "very strong" or "ideal" for those specific event types.
If you hit all four, you're in good shape. If any of them are off, you've found the exact problem instead of just having a vague feeling that your data is wrong somewhere.
Headless Tracking Verification, At a Glance
| Check | What it confirms | How fast you get an answer |
|---|---|---|
| Meta Pixel purchases vs. Shopify orders | Whether Purchase events are complete overall | Within a week's window |
| Test Event Code | Whether a specific event fires correctly right now | Seconds, in real time |
| Diagnostics tab | Which specific parameters are causing a gap | Immediate, before running any comparison |
| Per-destination check (Google, Klaviyo, TikTok) | Whether the gap is Meta-specific or affects everything | As fast as the Meta check, repeated per platform |
| Express checkout spot-check | Whether Shop Pay, Apple Pay, PayPal orders are counted at all | A handful of manually reviewed orders |
What do you do when the numbers don't match?
Figure out exactly where the numbers are drifting apart before touching any code.
If you're on Hydrogen and the gap is small, check whether the implementation is using Hydrogen-specific components or generic manual JS bolted on top. That mismatch alone causes silent gaps. If you're on custom JS, the most common culprits are timing, an event fires before a step actually completes, and coverage, an event that was never wired up at all. Most brands end up missing data on InitiateCheckout and express checkout flows specifically.
If you hit a 500 error while setting any of this up manually, that's usually not the tracking code's fault. It typically means a connection the backend expects, like an app install, hasn't been completed yet. Get that sorted first, it's a much faster fix than digging through the code looking for a bug that isn't there.
How does Aimerce help with headless Shopify tracking specifically?
By removing the exact gap this piece is built to catch, the difference between installation and implementation, rather than requiring you to manually verify every destination and every checkout path yourself.
Aimerce captures purchase events directly from Shopify's order creation webhook rather than a browser script, so whether a customer completes checkout through the standard flow or through Shop Pay, Apple Pay, or PayPal, the order gets captured the same way, no separate express checkout implementation to build or verify manually. For the storefront side, Hydrogen and Next.js both get a JavaScript SDK that integrates at the application root, which stays consistent across server-side rendered and client-side navigated pages instead of depending on a hydration-timing-sensitive script bolted on afterward. Purchase events are then forwarded automatically to Meta, Google, TikTok, Pinterest, Snapchat, Reddit, Taboola, and Klaviyo from that same webhook-based capture, rather than requiring each destination to be wired up and verified as its own separate integration.
That doesn't remove the value of the verification steps in this piece, comparing Shopify orders to what each ad platform reports is still the right way to build confidence in any tracking setup, headless or not. What it does is shrink the list of things that can silently go wrong in the first place: no manual script to mistime, no express checkout path left uncovered by default, and one integration to check instead of four separate ones per destination.
Common mistakes to avoid
- Treating a slowly declining conversion number as an ads problem first. Headless tracking failures look identical to genuine ad performance decline, ruling out a tracking gap is the faster, cheaper check to run first.
- Only checking Meta and assuming other destinations are fine. Each platform is its own silo on a headless build, a fix in one doesn't confirm the others.
- Waiting a full week to discover an implementation gap. Test Event Code catches it in seconds, right after implementation, rather than after a week of lost data.
- Forgetting express checkout entirely. Shop Pay, Apple Pay, and PayPal orders complete normally in Shopify but can be invisible to a tracking setup that only watches the standard flow.
- Assuming a 500 error means the tracking code is broken. It usually means a backend dependency, like an app connection, hasn't been completed yet.
FAQ
How do I know if my Shopify tracking is actually working after going headless? Compare Meta Pixel purchase events against actual Shopify order counts for the same time window. If they're close, tracking is solid. A meaningful gap points to missing or misfiring events.
What EMQ score should I expect on a headless store? The same benchmarks apply regardless of framework: roughly 8.6 to 9.3 for Purchase, 7.5 or higher for AddToCart and InitiateCheckout. A score below that range usually means events are missing required customer data, not that headless itself lowers your score.
Does express checkout need to be checked separately from regular checkout? Yes. Shop Pay, Apple Pay, and PayPal skip the standard checkout flow. If your tracking implementation only watches the regular flow, express checkout orders won't show up in your ad platforms at all, even though they're real revenue.
Can I verify tracking without a developer? The comparison itself doesn't require code, it's just pulling two numbers and comparing them. Fixing a confirmed gap usually does require a developer, or a tracking layer that handles the implementation for you.
How quickly can I confirm a new Hydrogen or custom JS implementation is working? Within seconds, using Meta's Test Event Code field to watch events land in real time as you click through your own storefront, rather than waiting a full week for enough purchase volume to compare.
If Meta's numbers check out, does that mean my whole tracking setup is fine? Not necessarily. Meta is the easiest platform to check because the comparison against Shopify orders is direct, but Google Ads, Klaviyo, and TikTok are each their own silo on a headless build and need to be verified independently.
What does a 500 error during manual tracking setup usually mean? Usually a missing backend dependency, like an app connection that hasn't been completed yet, rather than a bug in the tracking code itself. Confirming that connection is typically the faster fix.
Sources
[1] Madgicx, "'How to Improve Event Match Quality for Higher ROAS" (event-specific EMQ benchmark ranges) [2] Aimerce, Why is Your Event Match Quality (EMQ) Low and How to Improve it?
Related reading

Try Aimerce Pixel Risk-Free
for 30 Days
Most teams see results within 2 weeks.
Money-back guarantee.
It pays for itself, or you don't pay anything.
30-Day Aimerce Pixel Free Trial