// --- B2B Dynamic Product View (view_item) Tracking Engine --- (function() { window.dataLayer = window.dataLayer || []; function dispatchGA4ViewItem(sku, name, price) { var cleanPrice = parseFloat(price) || 0; // Dispatch directly to GA4 gtag('event', 'view_item', { 'currency': 'USD', 'value': cleanPrice, 'items': [{ 'item_id': sku, 'item_name': name, 'price': cleanPrice, 'quantity': 1 }] }); // Push to local dataLayer array for your verification panel window.dataLayer.push({ 'event': 'view_item', 'ecommerce': { 'items': [{ 'item_id': sku, 'item_name': name, 'price': cleanPrice }] } }); console.log("Tracking Success: Captured Product View -> " + sku); } var lastTrackedSku = null; function evaluateScreen() { // Scrape typical BigCommerce product page elements var skuEl = document.querySelector('[data-product-sku]') || document.querySelector('.sku-value') || document.querySelector('.productView-info-value'); var nameEl = document.querySelector('h1.productView-title') || document.querySelector('.product-title'); var priceEl = document.querySelector('[data-product-price-without-tax]') || document.querySelector('.price--withoutTax') || document.querySelector('.price.price--withoutTax'); if (skuEl && skuEl.innerText.trim() !== "") { var currentSku = skuEl.innerText.trim(); if (currentSku !== lastTrackedSku) { lastTrackedSku = currentSku; var currentName = nameEl ? nameEl.innerText.trim() : "B2B Product"; var currentPrice = priceEl ? priceEl.innerText.replace(/[^0-9.]/g, '').trim() : "0"; dispatchGA4ViewItem(currentSku, currentName, currentPrice); } } } // Keep watch for dynamic page updates/navigation switches var observer = new MutationObserver(evaluateScreen); observer.observe(document.body, { childList: true, subtree: true }); // Run on initial load window.addEventListener('DOMContentLoaded', evaluateScreen); evaluateScreen(); })(); // --- B2B Dynamic AJAX Search Tracking Engine --- (function() { window.dataLayer = window.dataLayer || []; function runSearchScraper() { if (window.location.href.includes('search_query=') || window.location.pathname.indexOf('/search.php') !== -1) { // Target search input element boxes or page titles var searchInput = document.querySelector('#search_query') || document.querySelector('.search-input') || document.querySelector('[name="search_query"]'); var pageHeading = document.querySelector('.page-heading') || document.querySelector('h1.category-title') || document.querySelector('h1'); var matchedTerm = ""; if (searchInput && searchInput.value.trim() !== "") { matchedTerm = searchInput.value.trim(); } else if (pageHeading && pageHeading.innerText.toLowerCase().includes('search')) { var quotesMatch = pageHeading.innerText.match(/['"](.*?)['"]/); if (quotesMatch && quotesMatch[1]) matchedTerm = quotesMatch[1]; } if (matchedTerm !== "") { var finalTerm = matchedTerm.toLowerCase(); // 1. Send direct to GA4 gtag('event', 'search', { 'search_term': finalTerm }); // 2. Log cleanly into verification dataLayer panel window.dataLayer.push({ 'event': 'search', 'search_term': finalTerm }); console.log("AJAX Search Captured: " + finalTerm); return true; } } return false; } // Run immediately on page load execution window.addEventListener('DOMContentLoaded', function() { setTimeout(runSearchScraper, 600); }); // Catch dynamic SPA push/replace events from your console screenshot logs window.addEventListener('popstate', function() { setTimeout(runSearchScraper, 600); }); var oldPush = history.pushState; history.pushState = function() { oldPush.apply(this, arguments); setTimeout(runSearchScraper, 800); // 800ms gives your AJAX time to load the search content fields completely }; })();