The GA4 mistakes I see in almost every audit
Learn the most common Google Analytics 4 configuration errors that lead to bad data, and how to fix them before they cause real problems.
I've audited dozens of GA4 implementations, and I keep seeing the same mistakes over and over. Some are minor annoyances. Others completely corrupt your data.
Here are the top 10 GA4 setup mistakes I encounter, ranked roughly by how much damage they cause.
1. Duplicate tracking tags
The problem: You have both the Google tag (gtag.js) installed directly AND the same tag via Google Tag Manager. Result? Every pageview, every event gets counted twice.
How to spot it:
- Your pageview numbers seem suspiciously high
- Events are firing in pairs in DebugView
- Engagement rate is oddly close to 100%
The fix: Pick one method and stick with it. I recommend GTM for flexibility, but either works. Just not both.
❌ Wrong: gtag.js in <head> + GA4 Config tag in GTM
✅ Right: ONLY gtag.js in <head>
✅ Right: ONLY GA4 Config tag in GTM
Pro tip: Use Google Tag Assistant or the GA Debugger extension to spot duplicate tags.
2. Default data retention (2 months)
The problem: GA4's default data retention is 2 months. After that, your Exploration reports lose access to detailed user-level data. Standard reports keep aggregated data, but any custom analysis becomes impossible.
How to spot it: Go to Admin → Data Settings → Data Retention. If it says "2 months," you have a problem.
The fix: Change it to 14 months immediately. It's a free setting, so there's no reason not to.
| Retention Period | What you can see in Explorations |
|---|---|
| 2 months | Last 2 months of detailed data |
| 14 months | Last 14 months of detailed data |
For more on data settings, see our initial setup checklist.
3. Not filtering internal traffic
The problem: Your team visits your site constantly, testing features, checking content, debugging issues. All that internal traffic pollutes your actual user data.
How to spot it:
- Unusually high traffic from your office location
- High bounce rates on internal/admin pages
- Your own test conversions showing up
The fix:
- Define internal traffic: Data Streams → Configure tag settings → Define internal traffic
- Add your IP addresses or IP ranges
- Enable the filter: Admin → Data Settings → Data Filters → Internal Traffic
- Set to "Active" (after testing)
Warning: Test with "Testing" mode first. I've seen people accidentally filter real traffic because they used an IP range that was too broad.
4. Multiple web data streams for one site
The problem: Some people create separate data streams for different sections of their website, thinking it's like UA views. It's not. Multiple web streams for one site = fragmented, unreliable data.
How to spot it: Go to Admin → Data Streams. If you see multiple web streams pointing to the same domain or subdomains of the same site, that's wrong.
The fix:
- Delete extra streams
- Use one web stream per website
- If you need to segment data, use filters, segments, or separate properties instead of multiple streams
GA4 Structure (Correct)
─────────────────────────
Property: "My Company"
└── Web Stream: "Main Website" (example.com + blog.example.com)
GA4 Structure (Wrong)
─────────────────────────
Property: "My Company"
└── Web Stream: "Homepage" (example.com)
└── Web Stream: "Blog" (blog.example.com)
5. Not registering custom parameters
The problem: You're sending custom event parameters via GTM, but they don't show up in your reports. GA4 receives them, but doesn't surface them because they're not registered.
How to spot it:
- Custom parameters appear in DebugView but not in reports
- You can't find your custom dimensions in the reporting interface
The fix:
- Go to Admin → Custom definitions
- Click Create custom dimension
- Enter the parameter name (must match exactly what you're sending)
- Choose scope (Event or User)
You get 50 event-scoped and 25 user-scoped custom dimensions on free GA4. Use them wisely.
6. Ignoring Consent Mode
The problem: If you're in the EU/EEA or serving users there, you need to implement Consent Mode v2. Without it, you're either breaking privacy laws or losing data from users who don't consent.
How to spot it:
- No consent banner on your site
- Consent Mode not configured in GTM
- Google Ads showing "consent gaps" warnings
The fix: Implement Consent Mode v2 with your CMP (Consent Management Platform). This lets GA4 use modeling to fill in gaps from non-consenting users.
For a detailed walkthrough, check our Consent Mode v2 guide.
7. Not connecting BigQuery early
The problem: BigQuery export only captures data from the day you enable it. There's no way to backfill. The longer you wait, the more historical data you lose.
How to spot it: Go to Admin → Product Links → BigQuery Links. If nothing's connected, you're missing out.
The fix: Enable it now, even if you don't plan to use BigQuery immediately. The free daily export is enough for most use cases, and you'll thank yourself later when you need unsampled historical data.
| Export Type | Cost | Use Case |
|---|---|---|
| Daily | Free (storage costs only) | Historical analysis, unsampled data |
| Streaming | Pay per GB | Real-time dashboards, large-scale analysis |
8. Messy event naming
The problem: GA4 event names are case-sensitive and should follow snake_case convention. Random naming leads to duplicate events, broken reports, and confusion.
Examples of what I've seen:
❌ Wrong:
- "Form Submit"
- "form-submit"
- "FormSubmit"
- "form_Submit"
✅ Right:
- "form_submit"
The fix:
- Use lowercase snake_case for all event names
- Create a naming convention document for your team
- Audit existing events and consolidate duplicates
9. Not setting up key events
The problem: Key events (formerly Conversions) are how GA4 knows what matters to your business. Without them, you're just collecting pageviews with no business context.
How to spot it: Go to Admin → Events. If nothing is marked as a key event, you're flying blind.
The fix:
- Identify your most important user actions
- Create events for them (if not already tracked)
- Mark them as key events
Common key events:
| Business Type | Key Events to Track |
|---|---|
| E-commerce | purchase, add_to_cart, begin_checkout |
| SaaS | sign_up, trial_start, subscription |
| Lead gen | form_submit, contact_request |
| Content | newsletter_signup, pdf_download |
For detailed setup, see our key events guide.
10. Creating duplicate events with "Create event"
The problem: You're already sending an event via GTM or gtag, then you create a "derived event" in GA4's interface using the same trigger conditions. Now you have duplicates.
How to spot it:
- Event counts seem doubled
- DebugView shows events firing multiple times
- You have both a GTM tag AND a GA4 "Create event" rule for the same action
The fix: Use only ONE method to create each event:
- GTM/gtag for events you control at the source
- GA4 "Create event" only for modifying or renaming existing events
Bonus: High cardinality dimensions
This is more subtle but causes real headaches.
The problem: You're tracking a custom dimension with too many unique values (500+ per day), like exact timestamps or unique user identifiers. GA4 groups excess values into "(other)".
The fix:
- Bucket your values (e.g., time ranges instead of exact times)
- Reconsider if you really need that level of granularity
- Use BigQuery for high-cardinality analysis
Quick audit checklist
Run through this to catch the most common issues:
- Only one tracking method (GTM or gtag, not both)
- Data retention set to 14 months
- Internal traffic filter enabled
- Only one web stream per site
- Custom parameters registered as dimensions
- Consent Mode implemented (if serving EU users)
- BigQuery connected
- Event names in snake_case
- Key events configured
- No duplicate event creation
Need a cleaner analytics experience?
If dealing with GA4's complexity isn't your idea of fun, try Analayer. We give you clean dashboards and actionable insights without the configuration headaches. Free tier available.
See your analytics clearly
Stop struggling with Google Analytics. Connect your account and get a cleaner, simpler view of your data in seconds.