If you’re running a WooCommerce store and using Google Analytics 4 via Google Tag Manager, you may notice something confusing:
💥 Your WooCommerce revenue is higher than GA4 revenue
This is a very common issue — and in most cases, it’s NOT a bug.
Let’s break down your exact situation and understand what’s really happening.
🎯 1. The Problem in Simple Terms
You observed:
- WooCommerce shows full revenue and all orders
- GA4 shows lower revenue
- Purchase events are firing correctly
👉 This creates confusion:
“If tracking is working, why is GA4 still wrong?”
🔍 2. First Step: Verifying the Tracking Setup
You did the most important thing — debugging properly
✅ What You Tested
Using GTM Preview (Tag Assistant):
- Triggered test purchases
- Verified
purchaseevent fires - Confirmed GA4 receives the event
👉 You even recorded proof via screen recordings
🧠 What This Confirms
This eliminates the biggest fear:
✔ GTM is configured correctly
✔ GA4 tags are firing correctly
✔ DataLayer is pushing purchase events
❗ Important Insight
If events fire correctly in debug mode, the issue is NOT technical tracking failure
Instead:
The issue is data differences, not tracking failure
🧠 3. Understanding How GA4 and WooCommerce Think Differently
This is the core reason most people miss.
🔵 WooCommerce Logic
WooCommerce records revenue when:
- Order status = Completed
👉 This can happen:
- Immediately
- Or later (after manual confirmation)
🟢 GA4 Logic
GA4 records revenue when:
purchaseevent is triggered
👉 This happens:
- Instantly when user completes checkout
⚠️ Why This Creates Problems
Same order can:
- Appear in GA4 on Day 1
- Appear in WooCommerce on Day 2
👉 Result:
- Daily reports don’t match
- Revenue looks inconsistent
⚠️ 4. Manual Orders — The Silent Data Killer
This is one of the biggest hidden reasons in your case.
📦 What You Found
- 2723 real checkout orders
- 488 manual/admin orders
🧠 How Manual Orders Work
Manual orders:
- Created in WooCommerce backend
- No user session
- No browser interaction
- No GTM trigger
❗ Why GA4 Misses Them
GA4 depends on:
event: "purchase"
👉 Manual orders never trigger this event
📊 Real Example
| Type | WooCommerce | GA4 |
|---|---|---|
| Real order | ✅ | ✅ |
| Manual order | ✅ | ❌ |
💡 Conclusion
Manual orders will never appear in GA4 — and that’s expected
🍪 5. Cookie Consent — The Biggest Modern Limitation
You are using Cookiebot
This introduces a privacy layer that directly affects tracking.
🟢 Scenario 1: User Accepts Cookies
Everything works normally:
- GA4 sets cookies (
_ga) - User is tracked
- Purchase is recorded
- Attribution works (Google Ads, Organic, etc.)
🔴 Scenario 2: User Rejects Cookies
This is where things break.
❌ Without Consent Mode
- No cookies
- No tracking
- No purchase recorded
✅ With Consent Mode Enabled
- GA4 sends cookieless pings
- Some events may still be sent
- Data is modeled (estimated)
📊 What Actually Happens
| Data Type | Result |
|---|---|
| Purchase event | ⚠️ Sometimes tracked |
| User/session | ❌ Not tracked |
| Source attribution | ❌ Lost |
| Accuracy | ⚠️ Modeled |
❗ Important Reality
Even with perfect setup, GA4 will miss some purchases
🔧 6. Your Changes — Explained Properly
You didn’t just “try things” — you made meaningful configuration improvements.
Let’s understand each one deeply.
✅ A. Include Full Category Path
🧠 What It Does
- Sends full product category hierarchy to GA4
📌 Example
Instead of:
Category: Shoes
You get:
Category: Men > Shoes > Sneakers
🎯 Impact
- Better reporting
- ❌ No impact on revenue
✅ B. Order Tracking Window (30 → 120 days)
🧠 What It Does
- GTM4WP tracks older orders
🎯 Impact
- Recovers some missed purchases
- ❌ Not main cause of mismatch
✅ C. Include Tax in Revenue
🧠 Before
GA4 value = Product price only
🧠 After
GA4 value = Product + Tax
🎯 Impact
- Revenue closer to WooCommerce
⚠️ D. Shipping Still Excluded
🧠 Problem
WooCommerce total includes:
Product + Tax + Shipping
GA4 may be:
Product + Tax (no shipping)
🎯 Impact
GA4 revenue will always be lower
🔄 7. Raoul’s Fix — Referral Exclusion
Raoul added payment providers to:
👉 Referral exclusion list in Google Analytics 4
🧠 The Problem He Solved
When user pays:
Your site → PayPal → Back to your site
GA4 thinks:
Source = paypal.com ❌
✅ After Fix
GA4 keeps:
Source = google / cpc ✅
🎯 Impact
✔ Fixes attribution
✔ Prevents session breaks
✔ Keeps marketing data accurate
❗ Important
This does NOT fix missing purchases
Only fixes “who gets credit”
🌐 8. Self-Referral Fix (Your Domain)
He also added:
mementi-urnen.de
to unwanted referrals
🧠 Why?
To prevent:
mementi-urnen.de / referral ❌
🎯 Impact
✔ Cleaner analytics
✔ No session reset
✔ Better attribution
📊 9. Final Root Causes of Your Issue
Now everything connects.
🧾 Why GA4 Revenue is Lower
1. Manual Orders
- Not tracked
2. Cookie Rejection
- Partial or no tracking
3. Shipping Exclusion
- Lower value sent
4. Timing Differences
- Different reporting logic
5. Modeled Data Delay
- GA4 updates later
🔮 10. What Will Improve After Fixes?
After your work + Raoul’s fix:
✔ Better attribution
✔ Cleaner data
✔ Slightly improved revenue accuracy
⚠️ 11. What Will NEVER Match 100%
Even with perfect setup:
| System | Accuracy |
|---|---|
| WooCommerce | 100% |
| GA4 | 70–90% |
👉 Because of:
- Privacy laws
- Cookie rejection
- Modeled data
✅ 12. Final Takeaway
Your setup is technically correct and well-implemented
The mismatch is caused by:
- Real-world limitations
- Not technical errors
so finally can you tell me if user denied the consent via cookiebanner, can we capture it’s purchase in GA?
Short answer: Yes — but not fully, and not reliably at user level.
Let’s make this crystal clear 👇
🧾 What Happens When User Denies Consent (Cookiebot + GA4)
When a user clicks “Reject” on your Cookiebot banner:
❌ 1. Normal Tracking Stops
- No GA cookies (
_ga) are set - No user/session identification
- No proper attribution (source/medium lost)
👉 This means:
GA4 cannot track the user like a normal visitor
✅ 2. Consent Mode Still Sends Limited Data
If Google Consent Mode is implemented correctly:
- Google Analytics 4 still receives cookieless pings
- Your purchase event may still be sent
⚠️ 3. But This Data Is Limited
Even if purchase is sent:
| Feature | Result |
|---|---|
| Purchase count | ⚠️ Partially captured |
| Revenue value | ⚠️ May be included |
| User tracking | ❌ Not available |
| Attribution | ❌ Not accurate |
| Session continuity | ❌ Broken |
🧠 4. The Most Important Truth
GA4 does NOT truly “track” these users
It only estimates (models) their data later
📊 5. Real Example
Imagine:
- 100 users purchase
- 70 accept cookies → fully tracked
- 30 reject cookies →
👉 GA4 might:
- Capture some purchases directly
- Estimate the rest using modeling
❗ Final Answer (Very Clearly)
👉 Can GA4 capture purchases when user denies consent?
✔ Yes — partially (via cookieless pings)
❌ No — not fully, not accurately, and not always
🔥 Practical Expectation
- WooCommerce → 100% accurate
- GA4 → always lower
👉 Even with perfect setup
🧾 One-Line Conclusion
When users deny consent, GA4 may still receive limited purchase data via Consent Mode, but it cannot track it completely — so some conversions will always be missing or modeled.
In this case what will be the ideal settings for cookiebot plugin?
Good question — this is exactly where most setups go wrong.
There’s no “magic setting” that makes GA track everything after consent denial, but you can configure Cookiebot + GA4 in the best possible way to maximize data quality while staying compliant.
Here’s the ideal setup (practical + developer-focused) 👇
🧾 🎯 Goal of Ideal Setup
You want to:
✔ Track 100% users who accept cookies (full data)
✔ Capture as much signal as possible from users who reject cookies
✔ Keep everything GDPR compliant
✔ Enable GA4 modeling (Consent Mode)
🍪 1. Cookiebot Core Settings (Must Be Enabled)
Inside Cookiebot:
✅ A. Enable Google Consent Mode
- Turn ON:
- Google Consent Mode (v2)
🧠 Why:
This is what allows GA4 to:
- Receive cookieless pings
- Do conversion modeling
👉 Without this → rejected users = completely invisible
✅ B. Enable Auto Blocking
- Turn ON:
- Automatic cookie blocking
🧠 Why:
- Ensures scripts don’t fire before consent
- Required for GDPR compliance
👉 Important: GTM must work with this (see below)
✅ C. Correct Category Mapping
Make sure:
| Cookiebot Category | Google Consent |
|---|---|
| Statistics | analytics_storage |
| Marketing | ad_storage, ad_user_data, ad_personalization |
👉 This mapping must be correct
🧠 2. Google Tag Manager (Most Critical Part)
Using Google Tag Manager
✅ A. DO NOT Block GA4 Tags Completely
🚨 Common mistake:
Setting GA4 tag to fire only when consent = granted
❌ Wrong:
- GA4 tag blocked when user rejects
👉 Result:
- No cookieless pings
- Consent Mode useless
✅ Correct:
- GA4 tag should always fire
- Consent controls data usage, not firing
✅ B. Use Built-in Consent Checks
In GTM:
- Let GA4 tag respect:
analytics_storagead_storage
👉 GTM will automatically adjust behavior
✅ C. Default Consent State (VERY IMPORTANT)
Before user interacts:
analytics_storage = denied
ad_storage = denied
ad_user_data = denied
ad_personalization = denied
👉 This must load before any tag fires
📊 3. GA4 Settings (Often Missed)
Inside Google Analytics 4:
✅ A. Reporting Identity
Go to:
- Admin → Reporting Identity
Set to:
👉 Blended (Observed + Modeled)
🧠 Why:
- Enables GA4 to:
- Fill gaps from rejected users
- Estimate missing conversions
✅ B. Enable Google Signals
- Turn ON Google Signals
👉 Helps improve:
- Cross-device tracking
- Modeling quality
🧪 4. What Should Happen After Ideal Setup
🟢 User Accepts Cookies
✔ Full tracking
✔ Purchase captured
✔ Attribution works
🔴 User Rejects Cookies
✔ GA4 tag still fires
✔ Cookieless ping sent
✔ Purchase may be partially recorded
✔ GA models missing data
⚠️ 5. What You STILL Cannot Fix
Even with perfect setup:
❌ You cannot:
- Track rejected users fully
- Get exact attribution
- Match WooCommerce 100%
🔍 6. How to Verify Your Setup (Quick Check)
✅ Test 1: Reject Cookies
- Open GTM Preview
- Click Reject
Check:
- GA4 tag fires ✅
- Consent = denied ✅
✅ Test 2: Network Tab
Look for:
collect?v=2
👉 Even after rejection:
- Requests should still be sent
✅ Test 3: GA4 DebugView
- You may see:
- Purchase event (limited)
- Or nothing (also normal)
🧾 Final Recommendation (Based on Your Case)
Given your setup (WooCommerce + GTM4WP + Cookiebot):
👉 The ideal configuration is:
✔ Consent Mode ON
✔ GA4 tags always firing
✔ Consent controls data (not firing)
✔ Blended reporting enabled
✔ Tax/shipping aligned in values
✔ Referral exclusions already done (good)
🧠 Final One-Line Answer
The ideal Cookiebot setup doesn’t “force tracking” after rejection — it ensures GA4 still receives limited signals and can model missing purchases as accurately as possible.
What will be the ideal settings for gtm4wp in this case (specially for woocomemrce addon)?
Great — now we’re getting into the real source of truth for your data: GTM4WP WooCommerce settings.
This is important because whatever GTM4WP pushes into the dataLayer = what GA4 receives as revenue.
Let’s go step by step and define the ideal setup for your case (WooCommerce + GTM + Cookiebot + GA4) 👇
🧾 🎯 Goal for GTM4WP (WooCommerce)
You want to ensure:
✔ Correct purchase value is sent
✔ Data matches WooCommerce as closely as possible
✔ Works with Consent Mode
✔ Avoids double tracking / missing events
⚙️ 1. Core GTM4WP WooCommerce Settings (Important Ones)
Inside GTM4WP → WooCommerce Integration:
✅ A. Include Tax in Revenue → ENABLE
🧠 Why:
WooCommerce total includes tax
If disabled:
GA4 value < WooCommerce total
✔ Ideal:
👉 Enabled
⚠️ B. Include Shipping in Revenue → ENABLE (Recommended)
🧠 Why:
WooCommerce total = Product + Tax + Shipping
If shipping excluded:
- GA4 will always be lower
✔ Ideal:
👉 Enable this if available
If plugin doesn’t provide this option → you may need custom adjustment in GTM/dataLayer
✅ C. Use Order Total (Instead of Item Price)
(Some versions show as “Use order total” or similar)
🧠 Why:
You want:
value = full order total
NOT:
value = sum of item prices only
✔ Ideal:
👉 Ensure GA4 value = WooCommerce order total
✅ D. Order Status to Trigger Purchase → Completed (Recommended)
🧠 Why:
You have 2 options:
| Status | Behavior |
|---|---|
| Processing | fires early |
| Completed | fires after confirmation |
✔ Ideal (your case):
👉 Use Completed
💡 Reason:
- Matches WooCommerce reporting
- Avoids fake/incomplete orders
- Cleaner data
⚠️ E. Avoid Double Tracking
🧠 Common Issue:
Purchase fires multiple times if:
- Thank you page reloads
- User revisits page
✔ Ideal:
- GTM4WP usually handles this with order ID
- Ensure:
- No duplicate purchase events in GTM preview
🍪 2. Consent Mode Compatibility (VERY IMPORTANT)
Your GTM4WP setup must work with Cookiebot
✅ A. Always Push dataLayer (Even Without Consent)
🧠 Why:
Consent Mode depends on:
dataLayer.push({ event: "purchase" })
👉 Even when user rejects cookies
✔ Ideal:
- GTM4WP should push purchase event regardless of consent
- GTM decides what to do with it
❗ If Not:
- No event → no modeling → lost data
📊 3. DataLayer Structure (Critical Check)
Your purchase event should look like:
{
event: "purchase",
ecommerce: {
transaction_id: "12345",
value: 99.99,
currency: "EUR",
tax: 10,
shipping: 5,
items: [...]
}
}
🧠 What to Verify
✔ value = full order total
✔ tax included
✔ shipping included
✔ transaction_id present
🔄 4. Refund Tracking (Often Missed)
✅ Enable Refund DataLayer Push
🧠 Why:
WooCommerce refunds should also reflect in GA4
✔ Ideal:
- Refund events sent
- GA4 shows net revenue
⚠️ 5. Common GTM4WP Mistakes (Avoid These)
❌ 1. Value Mismatch
- Sending:
- item total instead of order total
❌ 2. Shipping Not Included
- Causes permanent revenue gap
❌ 3. Purchase Fires Only on “Processing”
- Leads to mismatch with WooCommerce reports
❌ 4. Blocking dataLayer on Consent Denied
- Breaks Consent Mode completely
❌ 5. Duplicate Purchase Events
- Inflates GA4 revenue
🧪 6. How to Validate Your Setup
✅ Step 1: GTM Preview
Make test purchase:
Check:
- purchase event fires once
- correct value
✅ Step 2: Compare 3 Values
| Source | Value |
|---|---|
| WooCommerce | 100€ |
| dataLayer | 100€ |
| GA4 | ~100€ |
👉 If mismatch happens → issue found
✅ Step 3: Test with Consent
| Scenario | Expected |
|---|---|
| Accept cookies | Full data |
| Reject cookies | Limited data |
🧾 Final Ideal Configuration (Your Case)
✔ GTM4WP WooCommerce Setup
- Include tax → ✅
- Include shipping → ✅
- Use full order value → ✅
- Trigger on Completed → ✅
- Push dataLayer always → ✅
- Avoid duplicate events → ✅
🧠 Final One-Line Answer
The ideal GTM4WP setup ensures that the exact WooCommerce order total (including tax & shipping) is pushed to the dataLayer and sent via GTM, while still allowing Consent Mode to work even when users reject cookies.
