Unmeasured, no baseline
To tell whether your tracking is right, check it against something that isn't a tag: your store's orders. Match one full week of orders with GA4 purchases by order number, and place one test order while watching which tags fire. The dated record of that check, with a list of what sends data and the Google Ads and Meta figures for the same week, is a tracking baseline. A store with no such record on file is U-001.
Symptom and cause
- Symptom
- Nobody can say what is and isn't tracked. Decisions run on gut because there's nothing to check them against.
- Cause
- Tracking was installed and never checked against the store's orders. Tags were added over years by different people, and nobody holds the full list.
- Where it's caught
- This is the starting state, not a single bug. A tracking baseline, usually the first output of a tracking audit, turns U-001 into a known list of specific faults.
Why tracking goes unchecked, and what a tracking baseline records
Most tracking is installed, then never checked. A theme comes with a GA4 snippet. A Shopify app adds Google and Meta. An agency adds a Google Ads tag for a campaign. Each one shows numbers on its own dashboard, and a dashboard with numbers looks like proof. A tag that fires twice, sends the wrong value or loses the source still draws a tidy chart.
U-001 is a starting state. The tracking may be fine; nobody can say. Every decision built on it (budgets, bids, which channel gets cut) inherits the doubt, and when GA4 and the store disagree there is no earlier reading to say whether the gap is new.
A tracking baseline is that earlier reading: a dated record of how far your tracking is from the store. It is not a performance baseline, such as conversion rate before a test. It answers a prior question: can these numbers be trusted at all? It has four parts.
1. Inventory: every tag, pixel and app that sends data, and where it lives (Google Tag Manager, theme code, an app, a server container).
2. Test order: what one real order produces, and whether GA4, Google Ads and Meta each received it.
3. Order match: GA4 purchases set against store orders for the same week, order by order.
4. Platform readings: what Google Ads and Meta report for that week, kept so later changes show. They are not meant to equal the store. Each counts by its own rules; Google Ads, in its standard columns, reports a conversion on the date of the ad click.
When it counts: all four exist, in writing, dated after the last change to checkout, theme, consent banner or purchase tags. Missing any one is U-001. Whatever the baseline turns up then gets its own code: a purchase counted twice is F-101, a purchase with no value is F-301.
| Baseline question | On file | Status |
|---|---|---|
| Tags sending data at checkout | no list | unknown |
| GA4 vs store orders, last full week | never compared | unknown |
| Google Ads purchase action | Active, never test-ordered | partial |
| Meta Purchase event | no test event on file | unknown |
| Last change to tracking | not recorded | unknown |
How to catch it
- Ask three questions of whoever looks after tracking. Which tags send data on the order confirmation page? When were GA4 purchases last compared with store orders, and what was the result? Which Google Ads conversion action and which Meta event do the campaigns optimise for? An answer of "not sure", or one that lives only in someone's head, is U-001.
- Place one test order with Tag Assistant open (Google's browser tool that shows which tags fire). Count the purchase events and note which tag sent each (on Shopify, see the next step). Note which identifier arrives as transaction_id: order number, order ID or checkout token. That is the column to export from the store for the match. More than one GA4 purchase for the order, or a purchase with no transaction_id (the order number your site sends to GA4), value or currency, is your first specific finding.
- On Shopify, a purchase sent by a custom pixel or an app pixel runs in Shopify's sandbox and may not show in Tag Assistant or GTM Preview. Confirm it instead in the browser's Network tab (a request containing en=purchase) or in Meta's Test Events. GA4 DebugView only shows it if debug_mode is set to true in the pixel's GA4 config while you test; remove it afterwards. Absent from Tag Assistant alone is not a finding.
- Watch GA4 DebugView (Admin → Data display → DebugView, a live view of incoming events) during the test order. Accept analytics cookies first: DebugView does not show events from visitors who declined. In Google Ads, open Goals → Summary and hover over any Status that is not Active. In Meta Events Manager, Test Events shows whether the purchase arrived from the browser, the server or both.
- This step needs someone with GA4 access and a store order export. Pick a full week that ended at least two days ago (GA4 processing can take 24 to 48 hours). In GA4, build a free-form exploration with Transaction ID as the dimension and Ecommerce purchases as the metric. Match it with the store's order numbers.
What putting it right involves
- Plan for a day or two of work by one person with read access to GTM, GA4, Google Ads, Meta Events Manager and the store's order export. If nobody in-house has all five, a [tracking audit](/services/tracking-audit) produces the baseline as its first output.
- Freeze a starting point. Export the live GTM container (the latest version with a date in the Published column), and write down today's date and who owns tracking.
- Build the inventory. One row per tag, pixel or app that sends data: where it lives, what it sends, on which pages. Check theme code and installed apps as well as GTM; a second purchase sender often sits outside the container.
- Run the test order and record what each platform received: events fired, transaction_id, value, currency.
- Run the order match and sort every order into one of four columns. Matched. In the store, missing from GA4. In GA4, not in the store: this is where a double count usually shows, because on a web stream GA4 drops a repeat purchase with the same transaction_id, so a second copy only survives with a different ID (an order number on one tag, a checkout token on another). Test and cancelled orders, set aside.
- Read the result as a ratio: GA4 purchases ÷ store orders. Below 100%, steady week to week, with the missing orders explained by declined analytics cookies (F-201), blocked scripts and test orders, is expected. Above 100%, an exact multiple, or a step on a date you can name is a fault, and gets a code.
- Write down the Google Ads and Meta purchase figures for the same week, with the conversion action, counting setting and attribution setting each used. File the four parts on one dated page. Repeat the order match monthly, and the whole baseline after any change to checkout, theme, consent banner or purchase tags.
Sources on file
- Analytics: Measure ecommerce, transaction_id (add one to every ecommerce event; GA4 deduplicates purchase events with the same transaction ID; web streams only; an empty string makes every empty-ID purchase one)support.google.com
- Analytics: Dimensions and metrics (Transaction ID: an identifier you create for an ecommerce transaction, from the transaction_id parameter)support.google.com
- Analytics: Monitor events in DebugView (Admin, Data display, DebugView; enable with Tag Assistant or GTM preview; last 60 seconds and last 30 minutes; events from users who decline analytics cookies do not appear)support.google.com
- Analytics: Data freshness (daily data about 12 hours on a standard property; processing can take 24 to 48 hours and reports may change in that time)support.google.com
- Analytics: Behavioural modelling for consent mode (needs at least 1,000 events a day with analytics_storage denied for 7 days and 1,000 daily consented users on 7 of the last 28 days; otherwise events from users who decline are not reported)support.google.com
- Google Ads: Troubleshooting conversion tracking status (Goals, Summary, Status column: Active, Needs attention, Misconfigured, Awaiting conversions, Removed)support.google.com
- Google Ads: Understand conversions by time (standard columns report conversions by the date the ad was clicked; the by conv. time columns use the conversion date)support.google.com
- Meta: Conversions API, Test Events (the tool generates a test ID sent as test_event_code; remove it from production events)developers.facebook.com
- Shopify: Web pixels (custom pixels load in a lax sandbox, an iframe that cannot access the top frame; app pixels run in a strict sandbox using web workers)shopify.dev
Questions on this file
How do I know if my GA4 tracking is accurate?
Check it against your store's orders. Take a full week that ended at least two days ago, export the orders, and match them with GA4 purchases on transaction ID, using whichever store identifier your tags send as transaction_id. Then place one test order with Tag Assistant open (on Shopify, the browser's Network tab, since app and custom pixels run in a sandbox) and count the purchase events. One purchase per order, and missing orders you can explain, mean it is broadly right.
What is a tracking baseline?
A dated record of how far your tracking is from the store: a list of every tag and app that sends data, one test order and what each platform received, one week of orders matched with GA4, and the Google Ads and Meta figures for that week. It is not a performance baseline like conversion rate before a test. It tells you whether the numbers can be trusted.
How big a gap between GA4 purchases and store orders is normal?
Work it out as a ratio, GA4 purchases ÷ store orders, week by week. Below 100% and steady, with the missing orders traced to declined cookies, blocked scripts and test orders, is expected. Above 100%, an exact multiple, or a jump on a date you can name is a fault. For revenue: GA4 revenue higher than Shopify.
Is a baseline the same as a tracking audit?
No. The baseline is the record; an audit is one way to produce it, and it goes further: Enhanced Conversions, consent, lost sources, dirty data and report definitions, each finding filed against a code. What an audit checks: tracking audit.
Can I build a baseline without access to Google Tag Manager?
Most of it. The order match needs GA4 read access and a store order export. The test order needs only a browser with Tag Assistant. The inventory is where you need GTM access, or a developer who can export the container and list the apps that send data.