On this page
There's a sentence I've heard so often I could recite it: "We've got Google Analytics installed, so our data is complete."
Ask "how do you know it's complete?" and the answer is almost always the same: "I opened Realtime and saw people on the site."
Let me be blunt: numbers in Realtime prove exactly one thing, that a piece of code is sending data somewhere. They don't prove the data is correct. They don't prove each order is counted once. They don't prove that a visitor who came from your ads is still recorded as coming from your ads.
And here is the harder part: a broken GA4 setup is more dangerous than no GA4 at all. With no data, you know you're flying blind and you act carefully. With wrong data, you make confident decisions: you cut the channel that's actually bringing in revenue and pour money into the one that only looks efficient.
The numbers: most GA4 setups have errors
SR Analytics, an analytics audit firm, reports that after reviewing more than 200 GA4 implementations, over 81% contained implementation errors that compromise data accuracy. 73% were missing important event tracking, 71% had missing or misconfigured conversions, and 68% had broken cross-domain tracking (SR Analytics, Oct 2025).
I need to be honest about that figure: it comes from the client base of a company that sells audits, the methodology isn't published, and people who hire an auditor usually already suspect something is wrong. Don't read 81% as a market-wide rate.
There's a harder number to argue with: compare orders in your commerce system
with purchase events in GA4. Clickport audited 75 live WooCommerce stores
(May 2026) and found that a 15–25% gap is typical for US stores, while EU
stores often lose 40–60%
(Clickport, 2026). Part
of that gap isn't a setup bug at all, it's the ceiling of browser-based
measurement. eyeo estimates that 1.1 billion people, 30% of the global
internet population, used an ad blocker as of Q4 2025
(eyeo 2026 Ad-blocking Report).
In short: GA4 will never match your real revenue 100%. The question isn't "is there a gap?" but "how big, why, and how much of it did we cause by setting it up wrong?" That last part is entirely fixable.
Here are the 7 mistakes I run into most, ordered by how badly they distort business decisions.
Mistake 1: Installed twice, so everything counts double
Symptom: pageviews and conversions look unusually high; bounce rate looks suspiciously low.
Cause: the site has gtag.js pasted into the theme (or injected by a
plugin) and a Google tag in Google Tag Manager, both using the same
Measurement ID. Every page load fires twice. Another variant: the same GTM
container is injected twice, once by the theme and once by a plugin.
Nothing turns red. Nothing throws an error. Everything "works". The numbers are just wrong (Analytics Mania).
How to check: open the site, press F12 → Network, filter for collect, and
reload. Each page load should produce exactly one page_view request. If
you see two, you've just found the reason for last month's "traffic surge".
There's a variant specific to app-style sites (React, Vue, Next.js): GA4 can count a pageview whenever the URL changes, and GTM's "History Change" trigger does the same thing. Turn on both and every route change becomes two pageviews. Google's documentation is explicit: if GTM owns pageviews, turn off the automatic option in GA4 (Google Developers).
Mistake 2: Counting clicks on "Submit" instead of real leads
Symptom: GA4 reports 50 leads; the sales team received 30 forms.
This is the mistake I see on contact forms more than anywhere else. The fastest setup is to track "click on the Submit button". But a click is not a lead. A visitor clicks Submit with the phone field empty, the form shows an error, and GA4 still records a lead. A visitor double-clicks on a slow connection: two leads.
The opposite failure is just as bad: the form submits via AJAX (no page reload), GTM's default "Form Submission" trigger never sees it, and GA4 shows zero leads while your inbox fills up.
The rule: record a lead only after your server confirms it received the
form, and use Google's standard event name, generate_lead.
Take the site you're reading right now. Its contact form fires
generate_lead only after the API returns success, not when the button is
clicked:
const res = await fetch("/api/contact", {
method: "POST",
body: JSON.stringify({ ...form, locale }),
});
if (res.ok) {
setStatus("success");
trackEvent("generate_lead", { form_location: "contact_page", locale });
}Validation error, server error, network error: no lead is recorded.
Mistake 3: Using a "Thank you" page as the conversion without guarding it
Symptom: more conversions than real orders, with an uneven gap from day to day.
Marking "a view of /thank-you" as a conversion is popular because it needs no code. The problem: a thank-you page can be opened as many times as anyone likes. Refresh, Back then Forward, reopen it from browser history: each one is a new "conversion". If several forms share one thank-you page, it gets worse: your newsletter signup and your quote request merge into one number.
A related mistake: marking the page_view event itself as a key event. The
result is that every pageview on the whole site becomes a conversion. The
right approach is to create a separate event from page_view with a URL
condition, then mark that event.
Mistake 4: Orders without an order ID, or with the wrong one
Symptom: GA4 revenue is far off from your store's; product reports are empty even though there are orders.
GA4's purchase event has required fields that many setups skip:
transaction_id, a unique order ID. GA4 uses it to drop duplicate orders. Few people know this: if you send an empty string as the order ID, GA4 treats every order with an empty ID as the same order and drops all but the first (Google Analytics Help). You think you sold 100 orders; GA4 sees one.valuetogether withcurrency. Send a value without a currency code (USD,EUR) and the revenue may not be counted.items, the product list. Without it you know you made money but not what you sold.
And value is just the sum of price × quantity: don't add shipping and
tax to it. Google has separate fields for both.
One golden rule on top: send purchase only once the payment is confirmed,
not when the customer clicks "Place order".
Mistake 5: You pay for the ads, someone else gets the credit
Symptom: you run ads steadily, but your traffic sources are full of "Direct", "(not set)" and "Unassigned", or your payment provider sits at the top of the Referral list.
This is the most expensive mistake because it bends budget decisions directly. The usual culprits:
- Redirects strip the UTM tags. The ad link carries
?utm_source=facebook&utm_medium=paid_social, but the site redirects fromhttptohttps, or from the bare domain towww, and drops everything after the?. GA4 loads on the final page with no UTMs and records the visit as Direct. - The payment provider steals the credit. The customer goes from your site to Stripe, PayPal or a hosted checkout, then returns to your confirmation page. Unless the provider is listed under "unwanted referrals", the order is credited to... the payment provider.
- Messy UTM spelling.
Facebook,facebookandFBare three different sources to GA4. Google confirms UTM values are case-sensitive (Google Analytics Help). One campaign gets split into three rows, none of them big enough to notice.
One small trap that leads people to conclude "UTMs aren't working": GA4 deliberately excludes UTMs from the "Landing page + query string" dimension. They live in "Page location". Look in the wrong place and you'll go fix something that isn't broken.
Mistake 6: The cookie banner is there, but things run in the wrong order
Symptom: numbers swing in ways nobody can explain after adding a cookie banner; Google Ads remarketing audiences slowly shrink.
If you have visitors from the EEA, Google requires you to collect consent and pass consent signals to its tags (Google Analytics Help). Plenty of businesses have added a banner. Few have checked that it actually talks to GA4.
The two most common technical errors:
- The "default" command runs after the measurement command. Google requires
gtag('consent', 'default', …)to run before any command that sends data (Google Developers). Get the order wrong and the first hit, often the one carrying the ad source, uses the wrong consent state. - The two Consent Mode v2 signals are missing. Beyond
ad_storageandanalytics_storage, v2 needsad_user_dataandad_personalization. Without them, Google Ads remarketing and enhanced conversion measurement suffer.
One more thing to remember: Consent Mode does not store the visitor's choice for you. The banner has to store it and read it back on the next visit. Otherwise a visitor who clicks "Accept" today is treated as undecided tomorrow.
Mistake 7: The ones you can't take back
The six mistakes above are all fixable: fix them and your data is correct from that day forward. This group is different: get it wrong and the data is gone for good.
- An "Exclude" data filter switched to Active. Once an internal-traffic filter is Active, excluded data is removed from GA4 and from BigQuery, with no recovery (Google Analytics Help). Google gives you a "Testing" state precisely so you can trial it first. Type one IP range wrong and you may have deleted real customers' data too.
- Sending parameters but never registering them. You send
form_name,planorproduct_typewith your events, but to see them in reports they must be registered as Custom dimensions. Registration does not apply to data already collected (Google Analytics Help). Three months of sending without registering is three months you can't analyze. - The default 2-month data retention. This setting governs Explorations (advanced analysis). By the time you want a year-over-year comparison, the detail is already deleted. Most businesses should switch to 14 months on day one.
I don't hit 100% either, and you should know that
I showed off the form code above. To be fair, here's the rest of the story: this site measures entirely in the browser, too. With roughly 30% of internet users running ad blockers, some of my own leads never appear in GA4. I accept that because every lead still lands in my inbox. The inbox is the source of truth; GA4 is the compass.
That's the mindset I want you to keep: GA4 is for seeing trends and comparing channels, not for keeping the books. Set up properly, the trends are trustworthy. Set up wrong, the trends are wrong too, and that's the real problem.
A 30-minute check for business owners
You don't need to code to run this. You need one afternoon and someone with access to GA4.
1. Reconcile against your source of truth (10 minutes). Take last month's real orders or leads from your store, CRM or inbox. Compare with GA4 for the same period and time zone. A 10–25% shortfall is the normal range for browser-based tracking. GA4 higher than reality almost certainly means double counting (mistakes 1–3). GA4 far lower points to mistakes 2, 4 and 6.
2. Count the requests (5 minutes). F12 → Network → filter collect. Load a
page: one page_view. Submit a valid test form: one generate_lead. Submit
the form with a required field empty: nothing.
3. Check your sources (10 minutes). Open the Traffic acquisition report and look at Unassigned, (not set) and Referral. Your payment provider or your own domain under Referral: mistake 5. The same source in different capitalizations: mistake 5 again.
4. Check the settings you can't undo (5 minutes). Admin → Data retention: is it 14 months yet? Admin → Data filters: anything Active that nobody remembers testing? Admin → Custom definitions: are the parameters you send actually registered?
Keep three questions separate when you check: Does the tag fire? (Tag Assistant, GTM Preview). Does GA4 receive it correctly? (DebugView, Realtime). Are the processed numbers right? (reports after 24–48 hours, reconciled against real revenue). Each tool answers one question. Seeing a tag fire and concluding "the numbers are right" skips the other two.
The cost of wrong numbers
Back to where we started. A business with a broken GA4 setup doesn't lose money because of GA4. It loses money because of the decisions made on top of it.
An ad channel credited as "Direct" looks like it's burning cash, so it gets cut. A form that counts clicks makes cost per lead look cheaper than it is, so you raise its budget. An order counted twice makes ROAS look twice as good, right up until the books are closed.
Fixing these 7 mistakes won't make your website prettier or faster. It does something more important: it tells you which marketing dollars are actually bringing customers in.
If you've reconciled and found a gap you can't explain, send me the results of steps 1 and 2 above. Those two numbers are usually enough to narrow down where the problem is. And if you want to know why Google just added hostname filters to GA4, Google Analytics Just Got Dashboards is the natural next read.
Sources:
- SR Analytics — Broken GA4? Audit What's Costing You Revenue (Oct 2025)
- Clickport — WooCommerce Sales Not Tracking in GA4? We Audited 75 Stores (May 2026)
- eyeo — 2026 Ad-blocking Report
- Google Analytics Help — Minimize duplicate key events with transaction IDs
- Google Analytics Help — Collect campaign data with custom URLs
- Google Analytics Help — Filter out internal traffic
- Google Analytics Help — About custom dimensions and metrics
- Google Analytics Help — Verify and update consent settings
- Google for Developers — Set up consent mode on websites
- Google for Developers — Measure single-page applications
- Analytics Mania — Duplicate Events in Google Analytics 4 and How to Fix Them


