Why WooCommerce Revenue Doesn’t Match Google Analytics (GA4) — Complete Explanation

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 purchase event 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:

  • purchase event 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

TypeWooCommerceGA4
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 TypeResult
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:

SystemAccuracy
WooCommerce100%
GA470–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:

FeatureResult
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 CategoryGoogle Consent
Statisticsanalytics_storage
Marketingad_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_storage
    • ad_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:

StatusBehavior
Processingfires early
Completedfires 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

SourceValue
WooCommerce100€
dataLayer100€
GA4~100€

👉 If mismatch happens → issue found


✅ Step 3: Test with Consent

ScenarioExpected
Accept cookiesFull data
Reject cookiesLimited 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.