Thank you for submitting!

The winner will be chosen at random and contacted with more information.
Check out your free gift below!

Free Gift: TruSource Tracking Script

The script below can be placed on a website that stores paid/organic source information in a cookie, so that you don’t lose data on where leads come from. When a lead fills out a form, all of the source information is dynamically added to Marketo. And if you’re using Marketo forms, then hidden fields aren’t even needed. Copy and save the script below!

				
					<script>
// JavaScript Document
/********************************************************************
 * === Code block Update starts here ===							*
 * Code has been modernized to use original marketo forms script    *
 * Also uses a variable for code reuse                              *
 * Update added - December 3th, 2025                                *
 ********************************************************************/

// IIFE to prevent global variable pollution
(function () {
    const GA4_MEASUREMENT_ID = '' // 🚨🚨 Replace with your GA4 measurement ID G-XXXXXXXXXX


    // Variables moved inside IIFE to avoid global scope pollution
    var source,
        medium,
        term,
        content,
        campaign;

    // Flag to track initialization state - prevents duplicate processing
    var isInitialized = false;

    /********************************************************************
     * === jQuery and MktoForms2 Loading ===                            *
     ********************************************************************/
    // Load jQuery if not already available
    if (typeof (jQuery) == 'undefined') {
        var script = document.createElement('script');
        script.src = 'https://code.jquery.com/jquery-3.4.1.min.js';
        script.type = 'text/javascript';
        document.getElementsByTagName('head')[0].appendChild(script);
    }

    // Load Marketo Forms JS if not already available
    if (typeof (MktoForms2) == 'undefined') {
        var script = document.createElement('script');
        script.src = 'https://app-sjst.marketo.com/js/forms2/js/forms2.min.js';
        script.type = 'text/javascript';
        document.getElementsByTagName('head')[0].appendChild(script);
    }

    // Get hostname for domain configuration
    var hostname = document.location.hostname;
    var hostnameMatch = hostname.match(/(([^.\/]+\.[^.\/]{2,3}\.[^.\/]{2})|(([^.\/]+\.)[^.\/]{2,5}))(\/.*)?$/);
    if (hostnameMatch) {
        hostname = hostnameMatch[1].toLowerCase();
    }

    // Define domains for cross-domain tracking
    var domains = [];
    domains.push(hostname);

    /********************************************************************
     * === GA4 Implementation ===                                       *
     ********************************************************************/
    // Load Google Analytics 4 script (gtag.js) only if not already loaded
    function setupGA4() {
        // Check if gtag is already defined
        if (typeof gtag === 'undefined') {
            // Check if the script is already loaded
            var gtagScriptExists = false;
            var scripts = document.getElementsByTagName('script');
            for (var i = 0; i < scripts.length; i++) {
                if (scripts[i].src && scripts[i].src.indexOf('googletagmanager.com/gtag/js') !== -1) {
                    gtagScriptExists = true;
                    break;
                }
            }

            // If gtag script doesn't exist, load it
            if (!gtagScriptExists) {
                var gtagScript = document.createElement('script');
                gtagScript.async = true;
                gtagScript.src = `https://www.googletagmanager.com/gtag/js?id=${GA4_MEASUREMENT_ID}`;
                document.head.appendChild(gtagScript);

                // Initialize gtag
                window.dataLayer = window.dataLayer || [];
                window.gtag = function () { dataLayer.push(arguments); };
                gtag('js', new Date());
            } else {
                // Script exists but gtag isn't defined yet, define it
                window.dataLayer = window.dataLayer || [];
                window.gtag = function () { dataLayer.push(arguments); };
            }
        }

        // Configure your GA4 property with cross-domain tracking
        // (This will run regardless of whether we just loaded gtag or it was already there)
        gtag('config', GA4_MEASUREMENT_ID, {
            'cookie_domain': hostname,
            'linker': {
                'domains': domains
            }
        });

        // Set up GA4 linker
        if (typeof gtag !== 'undefined') {
            gtag('set', 'linker', {
                'domains': domains,
                'decorate_forms': true
            });
        }
    }

    // Setup cross-domain link tracking - moved to a function to control when it runs
    function setupCrossDomainLinks() {
        // Only run once
        if (window.crossDomainLinksInitialized) {
            return;
        }
        window.crossDomainLinksInitialized = true;

        var arr = document.getElementsByTagName('a');
        for (var i = 0; i < arr.length; i++) {
            var tmp = arr[i].getAttribute('onclick');
            var doname = '';
            try {
                doname = arr[i].hostname.match(/(([^.\/]+\.[^.\/]{2,3}\.[^.\/]{2})|(([^.\/]+\.)[^.\/]{2,4}))(\/.*)?$/)[1];
                doname = doname.toLowerCase();
            } catch (err) {
                doname = arr[i].href;
            }

            if (tmp != null) {
                tmp = String(tmp);
                if (tmp.indexOf('gtag(') > -1) continue; // Skip if already processed
            }

            for (var j = 0; j < domains.length; j++) {
                //auto-linker
                if (doname != hostname && doname.indexOf(domains[j]) != -1 && doname.indexOf('mailto:') == -1) {
                    arr[i].setAttribute('onclick', '' + ((tmp != null) ? tmp + '; ' : '') +
                        "gtag('event', 'click', {" +
                        "'event_category': 'outbound'," +
                        "'event_label': '" + arr[i].href + "'," +
                        "'transport_type': 'beacon'," +
                        "'event_callback': function(){document.location = '" + arr[i].href + "'}" +
                        "}); return false;");
                }
            }
        }
    }

    // Initialize all tracking - this is our main entry point
    function initializeTracking() {
        // Only run once
        if (isInitialized) {
            return;
        }
        isInitialized = true;

        // Set up GA4
        setupGA4();

        // Handle cross-domain link tracking
        setupCrossDomainLinks();

        // Continue with cookie handling and form population
        checkJQueryAndMarketo();
    }

    // Check for jQuery and Marketo availability
    function checkJQueryAndMarketo() {
        // Use a counter to limit the number of retries
        if (!window.checkJQueryRetryCount) {
            window.checkJQueryRetryCount = 0;
        }

        if ((typeof jQuery === 'undefined' || typeof MktoForms2 === 'undefined') && window.checkJQueryRetryCount < 20) {
            window.checkJQueryRetryCount++;
            setTimeout(checkJQueryAndMarketo, 500);
        } else {
            // Continue with script execution after libraries are loaded
            // or after 10 seconds (20 * 500ms) to prevent infinite waiting
            setTimeout(executeMainScript, 2000);
        }
    }

    // Main script execution
    function executeMainScript() {
        if (!jQuery) {
            console.warn("jQuery not available - some functionality will be limited");
            return;
        }

        //domain finder helper function
        function get_top_domain() {
            var i, h,
                top_cookie = 'get_top_level_domain=cookie',
                hostname = document.location.hostname.split('.');
            for (i = hostname.length - 1; i >= 0; i--) {
                h = hostname.slice(i).join('.');
                document.cookie = top_cookie + ';domain=.' + h + ';';
                if (document.cookie.indexOf(top_cookie) > -1) {
                    document.cookie = top_cookie.split('=')[0] + '=;domain=.' + h + ';expires=Thu, 01 Jan 1970 00:00:01 GMT;';
                    return h;
                }
            }
        }

        function fullyDecodeURI(uri) {
            var x = 0;
            while (uri !== decodeURIComponent(uri) && x < 5) {
                uri = decodeURIComponent(uri);
                x = x + 1;
            }
            return uri;
        }

        //cookie helper function
        jQuery.saCookie = function (options) {
            var settings = jQuery.extend({
                name: "",
                value: "",
                expiry: "",
                path: "",
                domain: ""
            }, options);

            if (settings.name == "") {
                return "error, no name specified";
            }

            if (settings.value == "") {
                //get cookie
                if (document.cookie.length > 0) {
                    c_start = document.cookie.indexOf(settings.name + "=");
                    if (c_start != -1) {
                        c_start = c_start + settings.name.length + 1;
                        c_end = document.cookie.indexOf(";", c_start);
                        if (c_end == -1) c_end = document.cookie.length;
                        return fullyDecodeURI(document.cookie.substring(c_start, c_end));
                    }
                    return "";
                }
                return "";
            } else {
                //set cookie
                var exdate = new Date();
                exdate.setTime(exdate.getTime() + parseInt(settings.expiry));
                document.cookie = settings.name + "=" + encodeURIComponent(settings.value) +
                    ((settings.expiry == "") ? "" : ";expires=" + exdate.toUTCString()) +
                    ";domain=" + ((settings.domain == "") ? "" : settings.domain) +
                    ";path=" + ((settings.path == "") ? "/" : settings.path);
                return settings.value;
            }
        }

        //get the top level domain
        var topDomain = '.' + get_top_domain();

        //set the query string params
        var fullQueryString = location.search.substring(1);
        var splitQueryString = fullQueryString.split('&');

        //set cookie names
        var utmCampaignCName = '_mkto_adv1';
        var utmContentCName = '_mkto_adv2';
        var utmMediumCName = '_mkto_adv3';
        var utmTermCName = '_mkto_adv4';
        var utmSourceCName = '_mkto_adv5';

        //dictionary key: parameter, value: field name
        var dict = {
            "utm_campaign__c": utmCampaignCName,
            "utm_content__c": utmContentCName,
            "utm_medium__c": utmMediumCName,
            "utm_source__c": utmSourceCName,
            "utm_term__c": utmTermCName
        };

        for (var x = 0; x < splitQueryString.length; x++) {
            if (!splitQueryString[x]) continue;
            var parts = splitQueryString[x].split('=');
            if (parts.length < 2) continue;

            var paramName = parts[0];
            var paramValue = parts[1];
            var mktoName = dict[paramName];

            if (mktoName != null && !jQuery.saCookie({ name: mktoName + 'orig' })) {
                jQuery.saCookie({ name: mktoName + 'orig', value: paramValue, domain: topDomain, expiry: 1209600000 });
            }

            if (mktoName != null) {
                jQuery.saCookie({ name: mktoName + 'mr', value: paramValue, domain: topDomain, expiry: 1209600000 });
            }
        }

        // Extract UTM params from GA4
        var gaUTMProcessingTimer = setTimeout(function () {
            // Clear the timer reference to allow garbage collection
            gaUTMProcessingTimer = null;

            // GA4 uses _ga_* cookies instead of __utmz
            // We'll extract UTM parameters from URL or dataLayer
            var GATrafficSource = (function () {
                // For GA4, we need to extract from gtag parameters or URL
                if (window.dataLayer) {
                    // Look for the most recent config or event with campaign parameters
                    for (var i = window.dataLayer.length - 1; i >= 0; i--) {
                        var item = window.dataLayer[i];
                        if (item && (item.event === 'gtm.js' || item.event === 'config')) {
                            // Check if this dataLayer push has campaign parameters
                            if (item.utm_source || item.utm_medium || item.utm_campaign ||
                                item.utm_content || item.utm_term) {
                                return {
                                    'utm_source__c': item.utm_source,
                                    'utm_medium__c': item.utm_medium,
                                    'utm_campaign__c': item.utm_campaign,
                                    'utm_content__c': item.utm_content,
                                    'utm_term__c': item.utm_term
                                };
                            }
                        }
                    }
                }

                // Fallback: extract from URL parameters
                var params = {};
                var queryString = window.location.search.substring(1);
                var pairs = queryString.split('&');

                for (var i = 0; i < pairs.length; i++) {
                    if (!pairs[i]) continue;

                    var pair = pairs[i].split('=');
                    var key = decodeURIComponent(pair[0]);
                    var value = pair.length > 1 ? decodeURIComponent(pair[1]) : '';

                    // Check if key is a UTM parameter
                    if (key.indexOf('utm_') === 0) {
                        var utmKey = key + '__c';
                        params[utmKey] = value;
                    }
                }

                // If we have at least one parameter, return the params object
                return Object.keys(params).length > 0 ? params : null;
            })();

            // assuming GATrafficSource isn't null...
            if (GATrafficSource) {
                var existingURL_UTMparams = [];
                for (var y = 0; y < splitQueryString.length; y++) {
                    if (!splitQueryString[y]) continue;
                    var parts = splitQueryString[y].split('=');
                    if (parts.length > 0) {
                        existingURL_UTMparams.push(parts[0]);
                    }
                }

                // Set GA4's UTM values as cookies
                for (var key in GATrafficSource) {
                    // Skip undefined values
                    if (GATrafficSource[key] === undefined) continue;
                    var mktoName = dict[key];

                    // Skip if no matching Marketo field
                    if (!mktoName) continue;

                    // assuming utm original value cookie hasn't been set
                    if (!jQuery.saCookie({ name: mktoName + 'orig' })) {
                        jQuery.saCookie({ name: mktoName + 'orig', value: GATrafficSource[key], domain: topDomain, expiry: 1209600000 });
                    }

                    // assuming utm most recent value cookie hasn't been set
                    if (existingURL_UTMparams.indexOf(key) === -1) {
                        jQuery.saCookie({ name: mktoName + 'mr', value: GATrafficSource[key], domain: topDomain, expiry: 1209600000 });
                    }
                }

                // Attempt to populate forms with new data
                populateFormsWithUTMData();
            }
        }, 2000);

        // Form population function - fixed the default parameter issue for GTM compatibility
        function populateForm(form) {
            if (form === undefined || form === null) {
                form = null;
            }

            if (jQuery.saCookie({ name: utmCampaignCName + 'orig' })) {
                if (jQuery("input[name=utm_campaign__c]").length > 0) {
                    jQuery("input[name=utm_campaign__c]").val(jQuery.saCookie({ name: utmCampaignCName + 'orig' }));
                } else if (form) {
                    form.addHiddenFields({ "utm_campaign__c": jQuery.saCookie({ name: utmCampaignCName + 'orig' }) });
                }
            }

            if (jQuery.saCookie({ name: utmCampaignCName + 'mr' })) {
                if (jQuery("input[name=mktoUTMCampaign]").length > 0) {
                    jQuery("input[name=mktoUTMCampaign]").val(jQuery.saCookie({ name: utmCampaignCName + 'mr' }));
                } else if (form) {
                    form.addHiddenFields({ "mktoUTMCampaign": jQuery.saCookie({ name: utmCampaignCName + 'mr' }) });
                }
            }

            if (jQuery.saCookie({ name: utmContentCName + 'orig' })) {
                if (jQuery("input[name=utm_content__c]").length > 0) {
                    jQuery("input[name=utm_content__c]").val(jQuery.saCookie({ name: utmContentCName + 'orig' }));
                } else if (form) {
                    form.addHiddenFields({ "utm_content__c": jQuery.saCookie({ name: utmContentCName + 'orig' }) });
                }
            }

            if (jQuery.saCookie({ name: utmContentCName + 'mr' })) {
                if (jQuery("input[name=mkto_UTM_Content]").length > 0) {
                    jQuery("input[name=mkto_UTM_Content]").val(jQuery.saCookie({ name: utmContentCName + 'mr' }));
                } else if (form) {
                    form.addHiddenFields({ "mkto_UTM_Content": jQuery.saCookie({ name: utmContentCName + 'mr' }) });
                }
            }

            if (jQuery.saCookie({ name: utmMediumCName + 'orig' })) {
                if (jQuery("input[name=utm_medium__c]").length > 0) {
                    jQuery("input[name=utm_medium__c]").val(jQuery.saCookie({ name: utmMediumCName + 'orig' }));
                } else if (form) {
                    form.addHiddenFields({ "utm_medium__c": jQuery.saCookie({ name: utmMediumCName + 'orig' }) });
                }
            }

            if (jQuery.saCookie({ name: utmMediumCName + 'mr' })) {
                if (jQuery("input[name=mktoUTMMedium]").length > 0) {
                    jQuery("input[name=mktoUTMMedium]").val(jQuery.saCookie({ name: utmMediumCName + 'mr' }));
                } else if (form) {
                    form.addHiddenFields({ "mktoUTMMedium": jQuery.saCookie({ name: utmMediumCName + 'mr' }) });
                }
            }

            if (jQuery.saCookie({ name: utmTermCName + 'orig' })) {
                if (jQuery("input[name=utm_term__c]").length > 0) {
                    jQuery("input[name=utm_term__c]").val(jQuery.saCookie({ name: utmTermCName + 'orig' }));
                } else if (form) {
                    form.addHiddenFields({ "utm_term__c": jQuery.saCookie({ name: utmTermCName + 'orig' }) });
                }
            }

            if (jQuery.saCookie({ name: utmTermCName + 'mr' })) {
                if (jQuery("input[name=mktoUTMTemp]").length > 0) {
                    jQuery("input[name=mktoUTMTemp]").val(jQuery.saCookie({ name: utmTermCName + 'mr' }));
                } else if (form) {
                    form.addHiddenFields({ "mktoUTMTemp": jQuery.saCookie({ name: utmTermCName + 'mr' }) });
                }
            }

            if (jQuery.saCookie({ name: utmSourceCName + 'orig' })) {
                if (jQuery("input[name=utm_source__c]").length > 0) {
                    jQuery("input[name=utm_source__c]").val(jQuery.saCookie({ name: utmSourceCName + 'orig' }));
                } else if (form) {
                    form.addHiddenFields({ "utm_source__c": jQuery.saCookie({ name: utmSourceCName + 'orig' }) });
                }
            }

            if (jQuery.saCookie({ name: utmSourceCName + 'mr' })) {
                if (jQuery("input[name=mktoUTMSource]").length > 0) {
                    jQuery("input[name=mktoUTMSource]").val(jQuery.saCookie({ name: utmSourceCName + 'mr' }));
                } else if (form) {
                    form.addHiddenFields({ "mktoUTMSource": jQuery.saCookie({ name: utmSourceCName + 'mr' }) });
                }
            }
        }

        // Function to handle form population
        function populateFormsWithUTMData() {
            // For non-Marketo forms
            if (jQuery("form").length > 0) {
                populateForm();
            }

            // For Marketo forms
            if (typeof (MktoForms2) != 'undefined') {
                // Use the global whenReady instead of binding to each form
                // This reduces the number of listeners
                MktoForms2.whenReady(function (form) {
                    populateForm(form);
                });
            }
        }

        // Initialize form population once
        populateFormsWithUTMData();
    }

    // Start the initialization process
    initializeTracking();
})();
</script>