Debugging Tracking Events Not Firing on Sitecore
Learn how to diagnose and fix common tracking issues in Sitecore when Google Analytics, Google Tag Manager, or Meta Pixel events fail to fire.
Common Causes
Tracking failures in Sitecore are typically caused by:
- Experience Editor mode blocking scripts
- HTML cache serving outdated tracking code
- Cookie consent blocking execution
- Content Security Policy restrictions
- Rendering cache conflicts
- JavaScript errors preventing execution
- xDB tracking interference
- Ad blockers
Diagnosis Steps
Step 1: Verify Page Mode
Issue: Tracking loads in Experience Editor but shouldn't.
Check:
var isExperienceEditor = Sitecore.Context.PageMode.IsExperienceEditorEditing;
var isPreview = Sitecore.Context.PageMode.IsPreview;
var isNormal = Sitecore.Context.PageMode.IsNormal;
Fix:
@if (!Sitecore.Context.PageMode.IsExperienceEditorEditing)
{
@* Tracking code here *@
}
Test:
- Open page in Experience Editor - tracking should NOT load
- Open page in Preview mode - tracking SHOULD load
- View published page - tracking SHOULD load
Step 2: Check HTML Cache
Issue: Cached pages showing outdated or missing tracking.
Diagnose:
# Check HTML cache via Sitecore admin
/sitecore/admin/cache.aspx
Fix:
// Clear HTML cache
var site = Sitecore.Configuration.Factory.GetSite("website");
var cache = Sitecore.Caching.CacheManager.GetHtmlCache(site);
cache.Clear();
Or via Sitecore UI:
Prevent:
- Disable caching for tracking renderings
- Use client-side dynamic tracking
- Clear cache after tracking updates
<!-- Disable caching for tracking rendering -->
<rendering cacheable="false">
<placeholder>tracking</placeholder>
</rendering>
Step 3: Browser Console Check
Open DevTools (F12) and check Console:
Common Errors:
gtag is not defined- GA4/GTM script not loaded
- Script blocked by ad blocker
- Script load order issue
fbq is not defined- Meta Pixel script not loaded
- Script blocked
- Initialization failed
dataLayer is not defined- GTM not initialized
- dataLayer initialized after push
- Script order issue
Fix Script Order:
@* 1. Initialize dataLayer FIRST *@
<script>
window.dataLayer = window.dataLayer || [];
</script>
@* 2. Load GTM *@
<script>(function(w,d,s,l,i){...})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
@* 3. Then push events *@
<script>
window.dataLayer.push({
'event': 'pageview'
});
</script>
Step 4: Network Tab Check
Open DevTools → Network:
For GA4: Look for requests to:
https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXXhttps://www.google-analytics.com/g/collect
For GTM: Look for requests to:
https://www.googletagmanager.com/gtm.js?id=GTM-XXXXXXX
For Meta Pixel: Look for requests to:
https://connect.facebook.net/en_US/fbevents.jshttps://www.facebook.com/tr/
If requests are missing:
- Check if script is in page source
- Check for ad blockers
- Verify script isn't blocked by CSP
If requests fail (red):
- Check network connectivity
- Verify firewall settings
- Check CSP headers
Step 5: Verify Script Presence
View Page Source (Ctrl+U):
Search for your tracking IDs:
- GA4:
G-XXXXXXXXXX - GTM:
GTM-XXXXXXX - Meta Pixel: Your pixel ID
If not found:
- Check rendering is added to layout
- Verify site configuration
- Check conditional logic
- Clear HTML cache
Step 6: Cookie Consent Check
Issue: Tracking blocked by consent management.
Diagnose:
// Check consent status (browser console)
console.log(localStorage.getItem('cookieConsent'));
console.log(document.cookie);
Fix:
// Only load tracking after consent
function loadTracking() {
if (localStorage.getItem('cookieConsent') === 'true') {
// Initialize tracking
gtag('config', 'G-XXXXXXXXXX');
}
}
// Listen for consent event
document.addEventListener('cookieConsentGranted', loadTracking);
Test:
- Clear cookies and localStorage
- Reload page - tracking should NOT fire
- Accept cookies - tracking SHOULD fire
Sitecore-Specific Issues
Issue 1: Rendering Not Loaded
Symptom: Tracking code not in page source.
Diagnose:
// Check if rendering exists
var rendering = Sitecore.Context.Database.GetItem("/sitecore/layout/renderings/Feature/Analytics/GoogleAnalytics");
// Check if rendering is in presentation
var device = Sitecore.Context.Device;
var renderings = Sitecore.Context.Item.Visualization.GetRenderings(device, false);
foreach (var r in renderings)
{
Sitecore.Diagnostics.Log.Info($"Rendering: {r.RenderingItem.Name}", this);
}
Fix:
- Verify rendering exists in Sitecore
- Check presentation details on page
- Verify rendering is published to web database
- Add rendering to appropriate placeholder
Issue 2: Site Configuration Wrong
Symptom: Wrong tracking ID loads or no tracking on specific site.
Diagnose:
// Check site properties
var siteName = Sitecore.Context.Site?.Name;
var gtmId = Sitecore.Context.Site?.Properties["gtmContainerId"];
var gaId = Sitecore.Context.Site?.Properties["googleAnalyticsId"];
Sitecore.Diagnostics.Log.Info($"Site: {siteName}, GTM: {gtmId}, GA: {gaId}", this);
Fix:
<!-- Verify site configuration in web.config -->
<site name="website"
hostName="www.yoursite.com"
gtmContainerId="GTM-XXXXXXX"
googleAnalyticsId="G-XXXXXXXXXX" />
Issue 3: xDB Tracking Interference
Symptom: Sitecore tracking works but third-party tracking doesn't.
Diagnose:
var isXdbEnabled = Sitecore.Configuration.Settings.GetBoolSetting("Xdb.Enabled", false);
var isTrackerActive = Sitecore.Analytics.Tracker.Current?.IsActive ?? false;
Sitecore.Diagnostics.Log.Info($"xDB Enabled: {isXdbEnabled}, Tracker Active: {isTrackerActive}", this);
Fix: Ensure third-party tracking initializes correctly:
<script>
@* Initialize third-party tracking even if xDB is active *@
window.dataLayer = window.dataLayer || [];
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>
Issue 4: Publishing Issues
Symptom: Tracking works in master database but not web.
Diagnose:
- Check page in master database (CM server)
- Check page in web database (CD server/published site)
- Compare tracking code in both
Fix:
- Publish tracking rendering items
- Publish settings items
- Republish pages with tracking
- Clear HTML cache on CD servers
// Publish item and subitems
var publishOptions = new Sitecore.Publishing.PublishOptions(
Sitecore.Context.Database,
Sitecore.Configuration.Factory.GetDatabase("web"),
Sitecore.Publishing.PublishMode.SingleItem,
Sitecore.Context.Language,
DateTime.Now
);
var publisher = new Sitecore.Publishing.Publisher(publishOptions);
publisher.Options.RootItem = trackingItem;
publisher.Options.Deep = true;
publisher.Publish();
Issue 5: Content Security Policy (CSP)
Symptom: Scripts blocked by CSP headers.
Diagnose: Check browser console for CSP errors:
Refused to load the script 'https://www.googletagmanager.com/gtag/js' because it violates the following Content Security Policy directive...
Fix: Update CSP headers in web.config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy"
value="default-src 'self';
script-src 'self' 'unsafe-inline' https://www.googletagmanager.com https://www.google-analytics.com https://connect.facebook.net;
img-src 'self' data: https://www.google-analytics.com https://www.facebook.com;
connect-src 'self' https://www.google-analytics.com https://analytics.google.com;"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Google Analytics 4 Specific Issues
GA4 Not Sending Page Views
Diagnose:
// Check if gtag is loaded (browser console)
console.log(typeof gtag); // Should be "function"
// Check dataLayer
console.log(window.dataLayer);
// Manually fire page view
gtag('event', 'page_view', {
page_title: 'Test',
page_location: window.location.href
});
Fix:
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX', {
'send_page_view': true
});
</script>
GA4 Events Not Recording
Diagnose:
// Enable debug mode
gtag('config', 'G-XXXXXXXXXX', {
'debug_mode': true
});
// Fire test event
gtag('event', 'test_event', {
'event_category': 'test',
'event_label': 'test_label'
});
// Check DebugView in GA4
Fix: Ensure events have required parameters:
gtag('event', 'purchase', {
'transaction_id': 'T12345',
'value': 25.42,
'currency': 'USD',
'items': [/* items array */]
});
Google Tag Manager Specific Issues
GTM Container Not Loading
Diagnose:
// Check if GTM loaded (browser console)
console.log(window.google_tag_manager);
// Check dataLayer
console.log(window.dataLayer);
Fix: Ensure GTM code is in correct location:
<head>
@* GTM must be in <head> *@
<script>(function(w,d,s,l,i){...})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
</head>
<body>
@* Noscript must be after opening <body> *@
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXXX"...></iframe></noscript>
</body>
GTM Events Not Triggering
Diagnose: Use GTM Preview mode:
- Open GTM
- Click "Preview"
- Enter your Sitecore site URL
- Check which tags fire
Fix:
// Ensure events are pushed correctly
window.dataLayer.push({
'event': 'custom_event',
'eventCategory': 'category',
'eventAction': 'action'
});
DataLayer Not Defined
Fix: Initialize dataLayer before GTM:
<script>
window.dataLayer = window.dataLayer || [];
</script>
<script>(function(w,d,s,l,i){...})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
Meta Pixel Specific Issues
Meta Pixel Not Loading
Diagnose:
// Check if fbq is defined (browser console)
console.log(typeof fbq); // Should be "function"
// Check pixel initialization
console.log(window._fbq);
Fix:
<script>
!function(f,b,e,v,n,t,s){...}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
</script>
Meta Pixel Events Not Recording
Diagnose: Install Meta Pixel Helper Chrome extension.
Fix: Ensure event parameters are correct:
fbq('track', 'Purchase', {
'value': 25.00,
'currency': 'USD',
'contents': [
{'id': '1234', 'quantity': 1}
]
});
Testing Tools
Browser Extensions
- Google Tag Assistant: Verify GTM and GA4
- Meta Pixel Helper: Verify Meta Pixel
- EditThisCookie: Inspect cookies
Testing Checklist
- Test in incognito/private mode
- Test with ad blocker disabled
- Test in different browsers
- Test on different devices
- Clear cache and cookies
- Check in normal mode (not Experience Editor)
- Verify page is published to web database
- Check cookie consent is granted
Debugging Script
Add this to your layout for comprehensive debugging:
<script>
(function() {
console.log('=== Tracking Debug Info ===');
// Page mode
console.log('Sitecore Page Mode: @Sitecore.Context.PageMode.ToString()');
// Tracking scripts loaded
console.log('GA4/gtag loaded:', typeof gtag !== 'undefined');
console.log('GTM loaded:', typeof google_tag_manager !== 'undefined');
console.log('Meta Pixel loaded:', typeof fbq !== 'undefined');
// DataLayer
console.log('dataLayer exists:', typeof window.dataLayer !== 'undefined');
if (window.dataLayer) {
console.log('dataLayer contents:', window.dataLayer);
}
// Cookies
console.log('Cookies:', document.cookie);
// Site info
console.log('Site Name: @Sitecore.Context.Site.Name');
console.log('Database: @Sitecore.Context.Database.Name');
console.log('=== End Debug Info ===');
})();
</script>
Quick Fixes
1. Clear All Caches
// Clear all Sitecore caches
Sitecore.Caching.CacheManager.ClearAllCaches();
2. Force Script Reload
@* Add cache-busting parameter *@
<script src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX&v=@DateTime.Now.Ticks"></script>
3. Test Mode
@* Force tracking in all modes for testing *@
@if (true) // Change to normal logic after testing
{
@* Tracking code *@
}
Common Error Messages
"gtag is not a function"
Cause: GA4 script not loaded or blocked
Fix: Verify script tag in page source and check for blockers
"Cannot read property 'push' of undefined"
Cause: dataLayer not initialized
Fix: Initialize dataLayer before using it
"Refused to load the script because it violates CSP"
Cause: Content Security Policy blocking script
Fix: Update CSP headers to allow tracking domains
Prevention Best Practices
- Always check page mode before loading tracking
- Disable HTML caching for tracking renderings
- Initialize dataLayer before GTM
- Test in published web database
- Monitor browser console for errors
- Use GTM Preview and GA4 DebugView
- Implement tracking debugging script
- Clear caches after tracking updates