WordPress Tracking Events Not Firing - Troubleshooting | Blue Frog Docs

WordPress Tracking Events Not Firing - Troubleshooting

Debug and fix analytics tracking issues on WordPress including plugin conflicts, caching, and JavaScript errors

WordPress Tracking Events Not Firing - Troubleshooting

Comprehensive troubleshooting guide for when analytics tracking doesn't work on WordPress sites. Covers GA4, GTM, Meta Pixel, and WordPress-specific issues.

Quick Diagnosis Checklist

Before deep debugging, check these common issues:

  • Is tracking code installed correctly?
  • Are you logged in as admin? (tracking may be disabled for admins)
  • Is an ad blocker enabled?
  • Is caching preventing script updates?
  • Are there JavaScript errors in console?
  • Is the site in staging/development mode blocking tracking?

Verifying Tracking Installation

Check if Scripts Load

Browser DevTools → Network Tab:

  1. Open DevTools (F12)
  2. Click Network tab
  3. Filter by:
  4. Reload page
  5. Verify scripts load with 200 OK status

Expected script URLs:

https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX
https://www.googletagmanager.com/gtm.js?id=GTM-XXXXXX
https://connect.facebook.net/en_US/fbevents.js

Check if Scripts Initialize

Browser Console:

// Check if GA4 loaded
console.log(window.gtag); // Should show function
console.log(window.dataLayer); // Should show array

// Check if GTM loaded
console.log(window.google_tag_manager); // Should show object

// Check if Meta Pixel loaded
console.log(window.fbq); // Should show function

// Check if jQuery loaded (many WordPress plugins need it)
console.log(window.jQuery); // Should show function

If any return undefined, the script didn't load.

WordPress-Specific Issues

1. Admin Tracking Exclusion

Symptom: Tracking works for visitors but not when you're logged in.

Cause: Most WordPress analytics plugins exclude administrators by default.

Diagnosis:

// Check if current user is admin
if (current_user_can('manage_options')) {
    echo 'You are an admin - tracking may be disabled';
}

Solutions:

Temporarily Enable Admin Tracking (for testing):

// Add to functions.php temporarily
remove_filter('wp_head', 'admin_tracking_exclusion'); // If using custom exclusion

// Or modify plugin settings:
// MonsterInsights → Settings → Engagement → Track Admins: Enable
// Site Kit → Settings → Admin Bar: Show stats even when logged in

Or test while logged out:

  • Use incognito/private browsing
  • Log out of WordPress
  • Test from different browser

2. Caching Plugin Interference

Symptom: Tracking works after clearing cache, then stops working.

Cause: Caching plugins serve stale HTML without updated tracking code.

Diagnosis:

// Check if page is cached
// Look for cache plugin comments in HTML source:
<!-- Cached by WP Rocket -->
<!-- Served from cache by W3 Total Cache -->

Solutions:

Clear All Caches

// Clear WordPress object cache
wp_cache_flush();

// Clear transients
delete_expired_transients();

Plugin-specific:

  • WP Rocket: Clear cache in Settings → WP Rocket → Clear Cache
  • W3 Total Cache: Performance → Purge All Caches
  • LiteSpeed Cache: LiteSpeed Cache → Toolbox → Purge All

Exclude Tracking Scripts from Optimization

WP Rocket:

add_filter('rocket_exclude_js', 'exclude_tracking_from_optimization');
function exclude_tracking_from_optimization($excluded) {
    $excluded[] = 'googletagmanager.com/gtag/js';
    $excluded[] = 'google-analytics.com/analytics.js';
    $excluded[] = 'googletagmanager.com/gtm.js';
    $excluded[] = 'connect.facebook.net/en_US/fbevents.js';
    return $excluded;
}

W3 Total Cache:

Performance → Minify → JS Minify Settings
Never minify the following JS files:
googletagmanager.com/gtag/js
google-analytics.com/analytics.js
googletagmanager.com/gtm.js
connect.facebook.net/en_US/fbevents.js

LiteSpeed Cache:

LiteSpeed Cache → Page Optimization → JS Excludes:
googletagmanager.com
google-analytics.com
connect.facebook.net

Exclude Dynamic Pages from Cache

WP Rocket:

add_filter('rocket_cache_reject_uri', 'exclude_woocommerce_from_cache');
function exclude_woocommerce_from_cache($uri) {
    $uri[] = '/checkout/';
    $uri[] = '/cart/';
    $uri[] = '/my-account/(.*)';
    return $uri;
}

3. Plugin Conflicts

Symptom: Tracking worked, then stopped after installing/updating a plugin.

Diagnosis Steps:

  1. Enable Troubleshooting Mode (Health Check plugin)

    • Install Health Check & Troubleshooting
    • Enable Troubleshooting Mode (disables all plugins for you only)
    • Test if tracking works
    • Re-enable plugins one by one
  2. Check for JavaScript Errors

    • Open Browser Console (F12 → Console)
    • Look for red errors
    • Note which plugin script is causing error

Common Conflicting Plugins:

Multiple Analytics Plugins

  • Problem: Installing MonsterInsights + GA Google Analytics + GTM4WP fires duplicate events
  • Solution: Use ONE analytics implementation method
// Check for multiple analytics installations
add_action('wp_footer', 'detect_multiple_analytics');
function detect_multiple_analytics() {
    if (!is_admin()) {
        ?>
        <script>
            // Count how many times gtag/fbq are defined
            let gaCount = 0;
            let fbCount = 0;

            if (typeof gtag !== 'undefined') gaCount++;
            if (typeof ga !== 'undefined') gaCount++;
            if (typeof fbq !== 'undefined') fbCount++;

            if (gaCount > 1) console.warn('Multiple GA implementations detected!');
            if (fbCount > 1) console.warn('Multiple Meta Pixel implementations detected!');
        </script>
        <?php
    }
}

JavaScript Optimization Plugins

  • Autoptimize, WP Rocket, Asset CleanUp may defer/delay tracking scripts incorrectly
  • Solution: Exclude tracking scripts (see caching section above)

Security Plugins

  • Wordfence, Sucuri, iThemes Security may block external scripts
  • Solution: Whitelist tracking domains in security plugin settings

4. Theme Issues

Symptom: Tracking doesn't appear in page source.

Cause: Theme missing wp_head() or wp_footer() hooks.

Diagnosis:

Check theme's header.php:

// Must be present before </head>
<?php wp_head(); ?>
</head>

Check theme's footer.php:

// Must be present before </body>
<?php wp_footer(); ?>
</body>

Solution:

If hooks are missing:

  1. Add them to theme files (if you have access)
  2. Switch to a properly coded theme
  3. Create child theme with correct hooks

5. Tracking Not in Theme Hooks

Symptom: You added tracking code but it doesn't appear.

Cause: Code added outside wp_head() or wp_footer() hooks.

Incorrect:

// functions.php - This won't work
echo '<script>gtag(...)</script>';

Correct:

// functions.php - Use hooks
add_action('wp_head', 'add_tracking_code', 10);
function add_tracking_code() {
    ?>
    <script>
        gtag('config', 'G-XXXXXXXXXX');
    </script>
    <?php
}

Google Analytics 4 Troubleshooting

GA4 Events Not Showing in Reports

Diagnosis Steps:

  1. Check Real-Time Reports First

    • GA4 → Reports → Realtime
    • Events should appear within 30 seconds
    • If not in Realtime, check installation
  2. Enable Debug Mode

gtag('config', 'G-XXXXXXXXXX', {
    'debug_mode': true
});
  • Then check Admin → DebugView in GA4
  1. Check Browser Console
// View dataLayer
console.log(window.dataLayer);

// Manually fire test event
gtag('event', 'test_event', {
    'test_parameter': 'test_value'
});

Common GA4 WordPress Issues:

Wrong Measurement ID

// Verify your Measurement ID
// Should be format: G-XXXXXXXXXX (starts with G-)
// NOT UA-XXXXXXXXX-X (that's Universal Analytics, deprecated)

Events Fire But Don't Match Filters

  • Check event name spelling (case-sensitive)
  • Verify parameter names match exactly
  • Check GA4 data filters aren't excluding events

Duplicate Events

// Check for multiple GA4 installations
add_action('wp_footer', 'check_duplicate_ga4');
function check_duplicate_ga4() {
    ?>
    <script>
        let gtagCalls = 0;
        const originalGtag = gtag;
        gtag = function() {
            gtagCalls++;
            console.log('gtag call #' + gtagCalls, arguments);
            return originalGtag.apply(this, arguments);
        };
    </script>
    <?php
}

WooCommerce Events Not Tracking

Diagnosis:

// Check if WooCommerce is active
if (!function_exists('WC')) {
    echo 'WooCommerce not active';
}

// Check if on WooCommerce page
if (is_woocommerce()) {
    echo 'On WooCommerce page';
}

// Check if purchase tracking fires
add_action('woocommerce_thankyou', 'debug_purchase_tracking');
function debug_purchase_tracking($order_id) {
    error_log('Purchase tracking should fire for order: ' . $order_id);
}

Common Issues:

AJAX Cart Events Don't Fire

// Ensure AJAX events are hooked correctly
add_action('wp_footer', 'debug_ajax_cart');
function debug_ajax_cart() {
    ?>
    <script>
        jQuery(document.body).on('added_to_cart', function(event, fragments, cart_hash, button) {
            console.log('WooCommerce AJAX add to cart triggered');
            console.log('Button:', button);
            // Your tracking code should fire here
        });
    </script>
    <?php
}

Variable Products Don't Track Correct Price

// Get variation data when add-to-cart clicked
jQuery('.variations_form').on('found_variation', function(event, variation) {
    console.log('Variation selected:', variation);
    console.log('Price:', variation.display_price);
});

Google Tag Manager Troubleshooting

GTM Container Not Loading

Diagnosis:

// Check if GTM loaded
console.log(window.google_tag_manager);

// Check dataLayer exists
console.log(window.dataLayer);

Common Issues:

Wrong Container ID

// Verify Container ID format: GTM-XXXXXX
// Check in page source: View Source → Search for "GTM-"

Body Tag Missing

<!-- This must be immediately after <body> tag -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX"></iframe></noscript>

Check if theme supports wp_body_open() hook:

// In theme's functions.php
if (!function_exists('wp_body_open')) {
    function wp_body_open() {
        do_action('wp_body_open');
    }
}

GTM Tags Not Firing

Diagnosis with Preview Mode:

  1. In GTM, click Preview
  2. Enter WordPress site URL
  3. Browse site
  4. Check Tag Assistant panel:
    • Tags Fired - Working correctly
    • Tags Not Fired - Check triggers

Common Issues:

Trigger Configuration Wrong

  • Page View triggers: Should use "All Pages" or specific page path
  • Click triggers: Verify CSS selector matches
  • Form Submit triggers: Check form ID/class

Data Layer Variables Empty

// Debug data layer in WordPress
add_action('wp_footer', 'debug_data_layer');
function debug_data_layer() {
    ?>
    <script>
        console.log('DataLayer contents:', window.dataLayer);

        // Watch for new pushes
        const originalPush = window.dataLayer.push;
        window.dataLayer.push = function() {
            console.log('dataLayer.push:', arguments[0]);
            return originalPush.apply(this, arguments);
        };
    </script>
    <?php
}

DOM Elements Not Ready

For page builders (Elementor, Divi), elements load dynamically:

Solution: Use "Window Loaded" trigger instead of "DOM Ready"

Meta Pixel Troubleshooting

Pixel Not Loading

Diagnosis:

// Check if pixel loaded
console.log(window.fbq);

// Check if initialized
console.log(window._fbq);

Use Meta Pixel Helper Chrome Extension:

  • Green: Working
  • Yellow: Warnings
  • Red: Errors

Common Issues:

Wrong Pixel ID

// Verify Pixel ID is 15-16 digits
// Check in page source: View Source → Search for "fbq('init'"

Ad Blocker Blocking Pixel

  • Test in incognito mode with ad blocker disabled
  • Check Network tab for blocked requests

Events Not Sending to Meta

Diagnosis:

// Manually fire test event in console
fbq('track', 'TestEvent', {test_param: 'test_value'});

// Check Events Manager → Test Events

Common Issues:

Event Fired Before Pixel Initialized

// Ensure pixel loads BEFORE events fire
add_action('wp_head', 'load_pixel', 1); // Priority 1 (early)
add_action('wp_footer', 'fire_events', 99); // Priority 99 (late)

Purchase Event Fires Multiple Times

// Prevent duplicate purchase tracking
add_action('woocommerce_thankyou', 'track_fb_purchase');
function track_fb_purchase($order_id) {
    // Check if already tracked
    $tracked = get_post_meta($order_id, '_fb_pixel_tracked', true);
    if ($tracked) {
        return; // Skip
    }

    // Fire event
    // ...

    // Mark as tracked
    update_post_meta($order_id, '_fb_pixel_tracked', 'yes');
}

Server-Side Tracking Issues

Conversions API (CAPI) Not Working

Diagnosis:

// Test CAPI connection
add_action('init', 'test_capi_connection');
function test_capi_connection() {
    if (!isset($_GET['test_capi'])) {
        return;
    }

    $pixel_id = 'YOUR_PIXEL_ID';
    $access_token = 'YOUR_ACCESS_TOKEN';

    $test_event = array(
        'data' => array(
            array(
                'event_name' => 'Test',
                'event_time' => time(),
                'action_source' => 'website',
                'user_data' => array(
                    'client_ip_address' => $_SERVER['REMOTE_ADDR'],
                    'client_user_agent' => $_SERVER['HTTP_USER_AGENT']
                )
            )
        ),
        'access_token' => $access_token
    );

    $response = wp_remote_post(
        "https://graph.facebook.com/v18.0/{$pixel_id}/events",
        array(
            'body' => json_encode($test_event),
            'headers' => array('Content-Type' => 'application/json')
        )
    );

    echo '<pre>';
    print_r($response);
    echo '</pre>';
    die();
}

// Visit: yoursite.com/?test_capi=1

Common Issues:

Access Token Invalid

  • Regenerate token in Meta Events Manager
  • Check token hasn't expired

WordPress Blocking Outbound Requests

// Check if wp_remote_post works
$test = wp_remote_post('https://httpbin.org/post', array('body' => 'test'));
if (is_wp_error($test)) {
    echo 'Error: ' . $test->get_error_message();
}

Some hosts block outbound requests - contact hosting support.

GA4 Measurement Protocol Not Working

Diagnosis:

add_action('init', 'test_ga4_mp');
function test_ga4_mp() {
    if (!isset($_GET['test_mp'])) {
        return;
    }

    $measurement_id = 'G-XXXXXXXXXX';
    $api_secret = 'YOUR_API_SECRET';

    $payload = array(
        'client_id' => 'test.12345',
        'events' => array(
            array(
                'name' => 'test_event',
                'params' => array('test' => 'value')
            )
        )
    );

    $response = wp_remote_post(
        "https://www.google-analytics.com/mp/collect?measurement_id={$measurement_id}&api_secret={$api_secret}",
        array(
            'body' => json_encode($payload),
            'headers' => array('Content-Type' => 'application/json')
        )
    );

    echo '<pre>';
    print_r($response);
    echo '</pre>';
    die();
}

Debugging Tools

Enable WordPress Debug Mode

// Add to wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);

Check log file:

tail -f /path/to/wp-content/debug.log

Browser Extensions

  • Google Analytics Debugger - Console logging for GA
  • Meta Pixel Helper - Validates Facebook Pixel
  • Tag Assistant - Debug Google tags
  • Web Developer - Disable cache, cookies, JavaScript

WordPress Plugins

  • Query Monitor - PHP errors, hooks, HTTP requests
  • Health Check - Plugin conflict diagnosis
  • Code Snippets - Test tracking code without editing theme

Testing Checklist

Before concluding tracking is broken:

  • Test while logged out (or disable admin tracking exclusion)
  • Clear all caches (browser, WordPress, CDN)
  • Disable ad blocker
  • Check browser console for JavaScript errors
  • Verify tracking code in page source (View Source)
  • Test in incognito/private browsing
  • Test on different browser
  • Check Real-Time reports (GA4, Meta Events Manager)
  • Verify correct IDs (Measurement ID, Pixel ID, Container ID)
  • Test with plugin conflicts disabled (Troubleshooting Mode)

Next Steps

// SYS.FOOTER