Loading tutorials…
Loading tutorials…
GA4 says 30,000 page views. Crazy Egg says 24,000. Your A/B test counts don't match your Shopify order count. Numbers diverging across tools is normal — numbers diverging in the WRONG direction is a bug. This is how to tell the difference and fix the real bugs.
Who this is forOperators who've noticed Crazy Egg page views, Recordings counts, A/B test conversions, or Snapshot click counts don't match what GA4, Shopify, or other source-of-truth tools report. Or operators about to make a CRO decision based on a number they can't trust.
What you'll need
Step 1
GA4 is not 'truth.' Server logs are closer. Shopify/Stripe transactions are truth for purchases. Before fixing Crazy Egg, decide what 'right' means for each metric.
Page views: server logs are the source of truth. GA4 typically reports 5-15% fewer than server logs (bots filtered, DNT honored, ad-blocked users excluded). Crazy Egg typically reports 10-25% fewer than GA4 (more aggressive bot filtering, DNT respected, blocked by more ad blockers).
Sessions: GA4 is the de-facto source of truth, though it undercounts vs server logs for the same reasons.
Transactions: Shopify, Stripe, your CRM — whatever processes the payment. This is the ground truth for ecommerce.
Email captures: your ESP (Mailchimp, Klaviyo) — the system that actually has the email. Crazy Egg's CTA capture count should match within a few percent.
A/B test conversions: should match GA4 conversion event count within ~10-15% (different bot filtering accounts for the gap).
Write down expected ranges for each metric BEFORE looking at Crazy Egg numbers. Otherwise you'll either panic over normal gaps or miss real bugs.
Step 2
If Crazy Egg shows 2x GA4, the snippet is firing twice per page. Usually a GTM tag + a platform plugin both installed. Catch in DevTools Network tab.
Open your site in clean incognito. Open DevTools → Network tab → filter for "crazyegg".
Refresh the page. Count the requests to script.crazyegg.com/pages/scripts/*. There should be exactly ONE request per page load.
If you see 2-3 requests: the snippet is installed via multiple methods (e.g., GTM tag + Shopify app + direct <head> snippet). Each method fires the snippet, multiplying your tracked page views.
Fix: pick ONE install method. Common deduplication: (a) if using GTM, remove the platform plugin (Shopify/WordPress), (b) if using platform plugin, remove the GTM tag, (c) check the theme files for a leftover direct <script> in <head>.
After removing the duplicate, wait 24 hours and re-check Crazy Egg tracked page views. Should drop by ~50% (if double-tracked) or ~67% (if triple-tracked).
If the install is correct (1 request per page load) but Crazy Egg still shows 2x GA4: GA4 itself may be undercounting (filters, sample rates, consent mode blocking). Check GA4 DebugView for filtered events.
Step 3
If Crazy Egg shows 50% of GA4, the script is being blocked by ad blockers, DNT headers, or CSP. Each accounts for predictable shrinkage.
Ad blockers: uBlock Origin, AdGuard, Brave Shields, and Ghostery block Crazy Egg by default. Estimated 5-20% of traffic uses ad blockers (higher on tech sites, lower on B2C consumer sites). These users still appear in GA4 (some don't block GA4) but never in Crazy Egg.
Do Not Track (DNT): Crazy Egg respects DNT by default. ~5-10% of users have DNT enabled. They appear in GA4 (GA4 doesn't respect DNT by default) but not in Crazy Egg.
Content Security Policy (CSP): if your site has a strict CSP that doesn't allow script.crazyegg.com, the script fails to load on every page. Check DevTools Console for 'Refused to load script' errors. Fix: add script.crazyegg.com, *.crazyegg.com, trk.crazyegg.com to your script-src directive.
Bot filtering: Crazy Egg filters bots more aggressively than GA4 by default. ~3-10% of GA4 traffic is bot traffic that Crazy Egg legitimately excludes.
Cumulatively, expect Crazy Egg to show 70-90% of GA4 page views on a healthy install. If you see less than 70%, investigate CSP and ad-block detection specifically.
If you want to measure ad-block impact: install Crazy Egg via your domain's first-party proxy. Crazy Egg supports this on Pro+ tiers. Reduces ad-block evasion by 30-50%.
Step 4
Recordings are sampled separately from Snapshots. They're not 1:1 with page views — they're sampled sessions. The math is different by design.
Crazy Egg Snapshots track page views (every page load that fires the snippet).
Recordings sample SESSIONS — a session is typically 30 minutes of activity from one user. Crazy Egg's plan cap on Recordings is separate from page-view cap.
On Standard plan: ~500 Recordings/mo cap. A site with 75K page views/mo at 5 pages/session = ~15K sessions/mo. Recordings sample ~3% of sessions to stay under cap.
If you see far fewer Recordings than expected: (a) you've hit the monthly Recordings cap (check Account & Settings → Usage); (b) your capture-rule URL filters exclude most pages; (c) ad blockers / DNT are even more aggressive on Recordings than on Snapshots.
If Recordings count is dramatically lower than Snapshots count: this is BY DESIGN. Recordings are sampled; Snapshots are not. Don't confuse the two metrics.
If you need 1:1 Recordings on every session: you'll need to upgrade to Pro tier or accept that sampling produces enough signal for most CRO decisions.
Step 5
A/B test conversion counts often don't match GA4 conversion counts. Causes: different goal definitions, audience filters, or session/page-view scope.
Crazy Egg A/B test 'conversions' fire when a user matches the goal definition in the test config. GA4 conversions fire when a user triggers the GA4 event.
These are different systems with different filters: Crazy Egg filters by test audience (only users who entered the test); GA4 counts all users.
If Crazy Egg test shows 200 conversions and GA4 shows 350 for the same goal: the test audience is a subset (e.g., test runs only on /pricing and only on desktop, excluding 40% of GA4 conversion sources).
If counts are MUCH closer than expected: you may have included the wrong audience or not enabled audience filters. Double-check that 'Variant + Control' visitor counts roughly equal the GA4 page-view count for the test URL.
Common bug: a/b test goal is 'visit /thank-you'. /thank-you is loaded after redirect from /checkout. If the page-view fires in JS before the URL update, Crazy Egg may not record the conversion. Fix: explicitly call CE2.tracker('newPageview') after the URL update on SPAs.
Validate goal firing: open the test in preview, complete the conversion path, watch DevTools Network for the conversion ping to Crazy Egg.
Step 6
Once you've identified the discrepancy cause, fix the install. Single script source, no duplicate firing, CSP allow-list updated, first-party proxy if needed.
Remove duplicate install methods. Audit your site for: GTM tag with Crazy Egg snippet + platform plugin + direct <head> code. Keep ONE; remove the others.
Update CSP: confirm script-src and connect-src directives include script.crazyegg.com, *.crazyegg.com, and trk.crazyegg.com. Test by visiting the site in a CSP-strict browser (Brave) and confirming no console errors.
Configure first-party tracking (Pro+ tier): Crazy Egg can proxy requests through your own domain (e.g., trk.yourdomain.com). This evades most ad blockers. Setup requires a small DNS record + Crazy Egg-side config.
Block bots and internal IPs: Account & Settings → Filters. Add your office IPs, VPN IPs, common bot user agents (AhrefsBot, SemrushBot, Pingdom). This reduces noise but doesn't change real-user numbers.
Wait 48 hours. Re-check Crazy Egg vs GA4. Healthy: Crazy Egg = 70-90% of GA4 page views. If still outside that range, the issue is install/config — re-audit.
Document the install: which method, which CSP rules, which filters. Add to your team wiki. Future install bugs will be caught faster with documentation.
Step 7
Numbers drift. New deploys, new CMS plugins, new CSP changes all break tracking silently. Audit monthly so you catch breakage before making bad CRO decisions.
Calendar a 30-minute monthly Crazy Egg data-health audit (first Monday of each month is standard).
Audit checklist: (1) Tracked page views ÷ GA4 page views ratio — should be 70-90%. (2) Tracked Recordings ÷ monthly cap — should be < 80% (so you don't hit the cap mid-month). (3) Active Snapshots — pause any older than 6 months. (4) DevTools Network on 3 page templates — confirm CE2 loads on each. (5) A/B test conversion math — open each running test and confirm conversion counts are increasing.
If the ratio drops below 60% suddenly (e.g., from 80% last month to 50% this month): something just broke. Recent deploys, theme updates, or CSP changes are the usual suspects.
Document the monthly ratio in a tracking spreadsheet. Trend over time tells you whether your install is stable or degrading.
Quarterly: do a deeper audit. Re-verify with DevTools on 5 page templates, re-check all CSP allow-list entries, re-verify ESP integrations are still firing.
Monthly audits catch 90% of tracking breaks within 30 days — vs the typical operator who discovers tracking broke 3-6 months ago when reading data they can't trust.
Common mistakes
Assuming Crazy Egg numbers should match GA4 exactly
What goes wrong: Operator sees Crazy Egg = 75% of GA4 and panics that the install is broken. Spends 6-12 hours debugging a non-issue. Meanwhile real bugs (double-tracking, CSP block) on other pages go undiagnosed. Wasted ~$500-1,500 of dev time on a phantom issue.
How to avoid: Expect 70-90% ratio of Crazy Egg : GA4 on a healthy install. Investigate only if outside that range. Document expected ranges per tool.
Double-tracking due to GTM + platform plugin
What goes wrong: Snippet fires 2x per page. Tracked page views are 2x reality. Plan capacity exhausted in half the time. Operator either upgrades to a tier they don't need ($50-200/mo wasted) or loses tracking for the rest of the month. Snapshots have 2x clicks counted — making conversion-rate calculations wrong by 100%.
How to avoid: Audit install monthly. ONE install method per site. DevTools Network tab is the definitive test — exactly one request to script.crazyegg.com per page load.
CSP blocking Crazy Egg silently
What goes wrong: Site has a strict CSP that doesn't allow script.crazyegg.com. Crazy Egg script fails to load on most pages. Tracked page views appear at 10-20% of GA4. Operator assumes it's just ad blockers. Real issue undiagnosed for months. Decisions made on a sample so small the data is statistically meaningless.
How to avoid: Open DevTools Console on the homepage. Look for "Refused to load script" errors mentioning crazyegg. Add script.crazyegg.com, *.crazyegg.com, and trk.crazyegg.com to script-src in your CSP.
Conflating Recordings count with page-view count
What goes wrong: Operator sees 30,000 tracked page views but only 400 Recordings in the same month. Files support ticket: 'Recordings aren't working.' Actually they are — Recordings are sampled separately at much lower volume by design. ~4-8 hours of support back-and-forth, plus a week of operator distrust in the tool.
How to avoid: Recordings ≠ page views. Recordings sample sessions at a rate determined by your plan cap. Pro tier samples more than Basic. Read your plan's Recording cap and expect that volume, not 1:1 with page views.
Ignoring monthly data-health drift
What goes wrong: Crazy Egg : GA4 ratio drops from 80% to 50% silently after a deploy. Operator doesn't notice for 3 months. Three months of CRO decisions made on broken data. When discovered, the team has to throw out 3 months of insights and restart baselines. Lost: $3,000-10,000 of shipping velocity + the time to re-baseline.
How to avoid: Calendar a monthly data-health audit. Track the ratio in a spreadsheet. Investigate any drop > 10% from baseline immediately.
Making CRO decisions while the install is broken
What goes wrong: Operator notices the numbers look off but ships a CRO change anyway based on the bad data. Change doesn't move the metric (or moves it the wrong way). Operator concludes 'the heatmap was wrong' when actually the install was broken. Lost 2-4 weeks of momentum + design-and-dev cost ($2K-6K) on a fix aimed at a false signal.
How to avoid: Fix the data discrepancy FIRST. Don't ship CRO changes off questionable data. If the install is broken, every insight is suspect.
Recap
Done — what's next
How to set up a Crazy Egg account from scratch
Read the next tutorial
Hand it off
Data discrepancies usually take operators 6-12 hours to diagnose and another 6-12 to fix. A specialist runs the audit in 30 minutes and ships the fixes in an afternoon — $80-200 one-time, or as part of an ongoing CRO engagement at $14-16/hr.
See specialist rates
Three main causes: (1) Ad blockers — uBlock, AdGuard, Brave block Crazy Egg by default; ~5-20% of traffic. (2) Do Not Track — Crazy Egg respects DNT, GA4 by default does not; ~5-10% of traffic. (3) Bot filtering — Crazy Egg filters bots more aggressively than GA4. Expect a healthy Crazy Egg : GA4 ratio of 70-90%.
Double-tracking. The snippet is firing twice per page. Most commonly: GTM tag + platform plugin (Shopify, WordPress) both installed. Open DevTools Network tab, filter for 'crazyegg' — there should be exactly one request to script.crazyegg.com per page load. If you see 2+, remove the duplicate.
Usually not wrong — just different filters. Crazy Egg counts conversions only for users in the test audience (e.g., users who loaded the test URL on the target device). GA4 counts conversions globally. The test audience is a subset of GA4 traffic, so test conversions will be lower than GA4. They should be proportional, not equal.
Probably not — Recordings are sampled separately from Snapshots. Your plan has a monthly Recording cap (e.g., 500 on Standard) and Crazy Egg samples sessions to stay under that cap. Recordings are NOT 1:1 with page views by design. Check Account & Settings → Usage to confirm you're under cap.
Use first-party tracking on Pro+ tier: Crazy Egg can proxy requests through your own domain (e.g., trk.yourdomain.com). Set up via Account & Settings → First-Party Tracking. Reduces ad-blocker evasion by 30-50%. Doesn't fully eliminate it — sophisticated blockers detect first-party tracker patterns too.
Yes if the CSP allows it. Add script.crazyegg.com, *.crazyegg.com, trk.crazyegg.com to script-src. Add same domains to connect-src. If running first-party tracking, also add your tracker subdomain. Check DevTools Console for 'Refused to load script' errors to diagnose CSP blocks.
Crazy Egg
Crazy Egg's install is famously easy — paste a script, done. The part nobody warns you about is the page-view budget burning through in week one because the default setup tracks every page on every device. This is the setup that prevents that.
Crazy Egg
Crazy Egg Recordings are powerful — and most-wasted. The difference is filter discipline. This is the setup that turns 1,000 recordings/month into 5 useful insights, not 1,000 hours of 'someday I'll watch these.'