Skip to content

GuidesShopify8 min read

Shopify Tracking Audit Checklist: What Each Check Proves

A row-by-row Shopify tracking audit checklist: what each check verifies, which source it reads, how, and what stays unknown once you've run it.

Published
Reviewed
Check the evidence behind each tracking result.

Daniil MaximkinProduct & Solutions Engineer

Short answer

A Shopify tracking audit checks scope and access, whether the purchase event reaches each platform from a source that still works, whether browser and server copies of one order collapse into a single count, and whether consent and reporting explain the rest of the gap. Each check has a source, a way to verify it, and a limit — what it still cannot tell you. Passing every row narrows a problem; it does not certify attribution.

— Daniil

Key takeaways

  • A checklist row only earns its place if it says what it cannot prove, not just what passed — that fourth column is the point of this list.
  • Scope comes first: one store, one agreed problem, up to three systems, confirmed before any access is granted or any row is checked.
  • Browser and server signal are different sources with different blind spots; checking a tag in DebugView is not the same as confirming a server-side copy exists.
  • Deduplication is verified per platform — GA4 on transaction_id, Meta on event_id and event name within its matching window — never assumed because a total looks plausible.
  • A checklist that passes clean doesn't mean nothing is wrong; it means nothing checked failed. The honest next step depends on what's still unknown, not on the pass count.
In this guide

Merchants running paid traffic on Shopify keep asking the same question: what should a tracking audit actually check? Most answers list tools — install this pixel, glance at that dashboard — without saying what checking it actually proves, or what it leaves unanswered once you’re done.

A checklist worth using is organized around checks, not tools: a question worth asking, the source you’d look at to answer it, how you’d verify that source, and — the part usually missing — what you still don’t know afterward. That fourth column is the reason a checklist like this is worth having at all: passing a row narrows a problem, it does not close it.

Read the columns like this: the first two say what you’re checking and where; the third is the concrete action — a report to pull, a tool to open, a field to inspect; the fourth is the actual finding. A three-column checklist lets you tick boxes without knowing what a green tick still leaves open. Everything below is read-only, in the same order I use in the methodology: review existing records and retained test evidence. If a row needs new evidence, mark it unverified. A new checkout or consent-interaction test is a separate, explicitly authorised step outside this checklist.

What scope and access does a Shopify tracking audit actually need?

Before any platform is compared against any other, the audit needs to know what it’s allowed to look at, and for how long. Skipping this step is how a verdict ends up covering a system nobody agreed was in scope.

QuestionSource checkedHow it is verifiedWhat stays unknown after this check
Is the scope actually one store, one problem, and an agreed set of systems?The written scope note agreed before access is grantedThe systems named in the note are compared against what’s actually being checkedWhether the real cause sits in a system outside the agreed scope — this check only confirms what’s in view
Is the access read-only and does it cover what’s needed?GA4 viewer role, Google Ads read-only, Meta Events Manager, Shopify staff accountLog in with the granted role and read the permission level the platform itself showsWhether the access turns out to be insufficient once the reconciliation is under way
What order window is actually available to check?Shopify order export (Admin or Orders API) for the agreed periodThe order count and date range in the export are checked against Shopify admin directlyWhether the same pattern held before the export window — a 30-day baseline is not a promise of full history
Which pixels and tags are actually installed, not just remembered?Shopify admin → Settings → Customer events, plus any GTM container in useEach entry in Customer events is opened and checked against what the merchant describedWhy each entry is there and who owns it — this confirms what’s present, not who added it or whether it’s still needed

Is the purchase event coming from a source that still works?

Shopify has changed, more than once, where a purchase tag may run, so an audit that checks the old location finds nothing wrong: there is nothing left there to find. The sandboxed pixel, the retired Additional Scripts field and untested express-checkout paths are catalogued on the Shopify tracking pillar page; the rows below say which applies.

QuestionSource checkedHow it is verifiedWhat stays unknown after this check
Does the purchase event reach GA4 from a real order?Existing GA4 DebugView evidence from a previously authorised test orderReview the saved purchase-event parameters and match them to that test order; if the evidence was not retained, mark this check unverifiedWhether every payment path — Shop Pay, other express checkouts — fires the same event; the evidence covers only the order tested
Is the purchase tag running where Shopify actually lets it run?Shopify admin → Settings → Customer events (app pixels and custom pixels)Each active pixel is opened and its subscribed events are checked against what Shopify’s Web Pixels API exposesWhether a listed pixel is also configured correctly — being present is not being correct
Is a purchase tag still sitting in a retired field?Checkout settings → Additional ScriptsThe field is opened directly; Shopify made it view-only for non-Plus stores, and scripts there are not carried over to the upgraded Thank you and Order status pages, so anything still in it is not running on a store that has upgradedHow long the tag had already been silent before the check — nothing alerts a merchant when a script in that field stops firing
Does a server-side copy of the same order exist?Server container or Conversions API delivery log, matched by orderThe server event’s order reference is compared to the browser event for the same orderWhether the server path also covers orders the browser path misses, without checking a wider sample

Is one purchase counted once, on every platform?

A platform reporting more orders than Shopify shipped is a deduplication question before it is a volume question — and each platform deduplicates on its own identifier, so this has to be checked per platform, not assumed from a total that happens to look plausible.

QuestionSource checkedHow it is verifiedWhat stays unknown after this check
Does GA4 count one purchase per order?The transaction_id parameter on the purchase eventThe value is compared against the real order id, in DebugView and in a next-day exportWhether a specific payment path produces a blank or repeated value that one test order didn’t hit
Do the browser and server Meta events for one purchase collapse into one conversion?Meta Events Manager’s Test Events tool and Diagnostics tabThe same event_id and event name are confirmed on both the browser and server copy of one purchase, received inside Meta’s stated deduplication windowWhether the same event_id discipline holds across every order, not only the sample checked
Is only one purchase path active per order?Shopify sales channels plus the custom pixel or GTM configurationConfirm by inspection that the native Shopify sales channel and any custom pixel aren’t both sending the same purchaseIf both are found active, whether GA4’s own transaction_id dedup is absorbing the overlap cleanly or missing some of it
Does the reconciled order count match Shopify’s ledger?Shopify’s order export joined to GA4’s purchase export on transaction_id; Meta and Google Ads expose no per-order feed, so they are compared in aggregateOrders are matched row by row on a shared identifier, not compared as totalsWhy a given order is missing or repeated — the join shows which rows don’t match, not the mechanism behind them

Not every gap between a platform and Shopify’s orders is a defect. Consent choices, modeled traffic, and platforms that only report in aggregate all produce differences that look identical to a bug from inside a dashboard. This covers technical implementation, not legal advice.

QuestionSource checkedHow it is verifiedWhat stays unknown after this check
Does the consent banner actually block or allow tags the way it’s configured to?Consent Mode v2 signals (ad_storage, analytics_storage)Review existing request captures for each consent choice, checking cookieless versus full payload; mark unverified if those captures are unavailableWhether Google’s own modeling recovers denied traffic accurately — that happens inside Google’s systems, not in anything visible here
Is Unassigned traffic in a range consistent with this store’s consent setup?GA4 Traffic acquisition report, Unassigned rowThe percentage is read directly from the report for the checked periodThere’s no fixed figure that marks Unassigned as “too high” for every store — this check reports the number, not a verdict on it
Does Meta’s Event Match Quality reflect what this store is actually sending?Meta Events Manager Overview, EMQ score and parameter breakdownThe score and any listed missing or malformed parameters are read for the checked pixel or datasetEMQ is a data-completeness score, not a measure of ad performance — a low score doesn’t mean the campaign itself is failing
Does Google Ads report conversions for the same window Shopify shows the orders in?Google Ads conversion report versus Shopify orders, same date rangeAggregate conversion counts are compared for the window, since Google Ads exposes no per-order feed to readWhich specific orders sit behind any gap — an aggregate comparison can say a difference exists, not which orders it is

Conclusion and next step

Two honest answers come out of a checklist like this, and both are legitimate.

No defect found in the checked scope. The completed checks found no failure in the systems, orders and period reviewed. Record any unverified rows and remaining limits alongside that result. It does not certify all payment paths, historical coverage or attribution, and it does not establish that every reported number is correct.

Investigate further. One or more rows land in the fourth column with a gap that isn’t explained by consent, modeling, or aggregate reporting — a repeated transaction_id, a pixel that went silent, a server event with no matching browser event. That is a signal a specific cause is findable, not a verdict that it has been found yet.

Either way, the write-up I’d keep looks like the one in the worked example of this diagnostic method: what was checked, what it proved, and what it didn’t — on a fictional store, in the same format a real one would use.

Before a seasonal peak, my BFCM 2026 tracking readiness checklist puts these checks on a schedule, with a tag freeze and a review after the peak.

If a row here turns up something you can’t explain, the next step is to describe it, not to buy anything: get in touch with the store URL, which row failed, and what you saw. If the cause or scope genuinely needs a closer, read-only look beyond what you can check yourself with the access above, that is what the Health Check is for — not the default next step, only the one for when self-checking has reached its limit.

Questions

Questions this guide answers

Do I need the paid Health Check to use this checklist?

No. Every check here can be run with the access a store owner or in-house developer already has — GA4, Meta Events Manager, Google Ads, and Shopify admin. The Health Check is a separate standalone diagnosis for when the cause or scope is genuinely uncertain and these checks haven't settled it; it is not a precondition for reading or using this list.

Does a passed checklist prove attribution is right?

No. This checklist checks measurement: whether an event fires, from a source that still works, once per order, with consent respected. Attribution is a separate layer on top of that — which channel gets credit for a sale, under what model and window. A store can pass every row here and still see a channel over- or under-credited by an attribution model that has nothing to do with whether the underlying event fired correctly.

How is this different from the free check at /check/?

The free check observes what a public storefront visitor's browser would see — which tags and pixels load on the storefront itself. It does not read checkout, orders, or server-side events, so it can flag an obviously missing pixel but not a deduplication problem or a checkout-only gap. This checklist covers what that outside view cannot reach.

If a check fails, do I need to hire someone immediately?

No. A failed row tells you what to investigate next, not that you need an engagement. Some causes are one setting away from fixed; others need a closer, read-only look to trace properly. Describe what you found before deciding whether it's a quick fix or worth a second pair of eyes.

Daniil Maximkin

Hi, I’m Daniil.

I work with you from defining the problem to implementation and handover. You talk to the person who does the work. I work in English and Russian.

Tried it and still stuck?

Describe your task

The first answer is free, within one working day. Or write directly: next@taskfordaniel.com