Skip to content
Home
120V Power
120V Power
Power Stations 120V
Pro Plugs 120V
Compact Power Conditioner 120V
🚀 New - Merit Z Series 120V
Merit Series 120V
Classic Series 120V
Prestige Series 120V
Contractor Series 120V
Battery Backups 120V
Home Theater Power 120V
Home Theater Power 120V
Elite Series
Reference Series
Accessories
220-240V Power
220-240V Power
Compact Power Conditioner 220-240V
🚀 New - Merit Z Series 220-240V
Merit Series 220-240V
Classic Series 220-240V
Contractor Series 220-240V
Battery Backups 220-240V
Home Theater Power 220-240V
For You
For You
Artists and Performers
Studio Engineers
System Contractors
Residential Integrators
Audiophiles and Enthusiasts
Technologies
Technologies
Series Multi-Stage Protection
Extreme Voltage Shutdown
Linear Filtration Technology
Discrete Symmetrically Balanced Power
Power Factor Technology
BlueBOLT Remote Power Management
Connect
Connect
The Furman Brand
Technical Information
Technical Information
Product Manuals
Product Warranty
Help Center
Safety Certification for Power Management Products
SMP Tech Note
Legacy Product Documents
Blog
Product Catalog
Help Center
Contact Us
Dealers
Dealers
Where to Buy
US Dealer Store
Become a Partner
Log in
X (Twitter)
Facebook
Instagram
Home
120V Power
Power Stations 120V
Pro Plugs 120V
Compact Power Conditioner 120V
🚀 New - Merit Z Series 120V
Merit Series 120V
Classic Series 120V
Prestige Series 120V
Contractor Series 120V
Battery Backups 120V
Home Theater Power 120V
Elite Series
Reference Series
Accessories
220-240V Power
Compact Power Conditioner 220-240V
🚀 New - Merit Z Series 220-240V
Merit Series 220-240V
Classic Series 220-240V
Contractor Series 220-240V
Battery Backups 220-240V
Home Theater Power 220-240V
For You
Artists and Performers
Studio Engineers
System Contractors
Residential Integrators
Audiophiles and Enthusiasts
Technologies
Series Multi-Stage Protection
Extreme Voltage Shutdown
Linear Filtration Technology
Discrete Symmetrically Balanced Power
Power Factor Technology
BlueBOLT Remote Power Management
Connect
The Furman Brand
Technical Information
Product Manuals
Product Warranty
Help Center
Safety Certification for Power Management Products
SMP Tech Note
Legacy Product Documents
Blog
Product Catalog
Help Center
Contact Us
Dealers
Where to Buy
US Dealer Store
Become a Partner
Search
Log in
Cart
Item added to your cart
View cart
Check out
Continue shopping
Become a Partner
Become a Nice Partner
analytics_storage * marketingAllowed -> ad_storage, ad_user_data, ad_personalization * -------------------------------------------------------------------------- */ window.WixpaGA4 = window.WixpaGA4 || {}; window.WixpaGA4.version = '1.3.0'; window.WixpaGA4.consent = { analytics: false, marketing: false, known: false }; window.WixpaGA4.strict = false; window.WixpaGA4.loaded = false; // Resolves once the visitor's choice has been applied, so that anything firing // on page load can wait for it instead of guessing. window.WixpaGA4.consentReady = new Promise(function (resolve) { window.WixpaGA4.markConsentReady = resolve; }); // Loads Shopify's consent-tracking API once and resolves to whether it is // usable. The promise is cached so repeated calls never load it twice. function wixpaLoadPrivacyApi() { if (window.WixpaGA4.privacyApi) { return window.WixpaGA4.privacyApi; } window.WixpaGA4.privacyApi = new Promise(function (resolve) { if (window.Shopify && window.Shopify.customerPrivacy) { resolve(true); return; } if (!window.Shopify || !window.Shopify.loadFeatures) { console.warn('Wixpa GA4: Shopify.loadFeatures is not available.'); resolve(false); return; } window.Shopify.loadFeatures([{ name: 'consent-tracking-api', version: '0.1', }], function (error) { if (error) { console.warn('Wixpa GA4: consent tracking API failed to load.', error); resolve(false); return; } resolve(!!(window.Shopify && window.Shopify.customerPrivacy)); }); }); return window.WixpaGA4.privacyApi; } // Reads the visitor's persisted choice. Returns null when there is no choice // to read, which is not the same as a choice of "no". function wixpaReadConsent() { var cp = window.Shopify && window.Shopify.customerPrivacy; if (!cp) { return null; } try { var marketing = cp.marketingAllowed() === true; // Older storefronts expose only marketingAllowed. Falling back to it keeps // those stores working rather than reading analytics as a denial. var analytics = typeof cp.analyticsProcessingAllowed === 'function' ? cp.analyticsProcessingAllowed() === true : marketing; return { analytics: analytics, marketing: marketing, known: true }; } catch (e) { console.error('Wixpa GA4: could not read Shopify consent.', e); return null; } } function wixpaConsentSignals(consent) { var marketing = consent.marketing ? 'granted' : 'denied'; return { 'ad_storage': marketing, 'ad_user_data': marketing, 'ad_personalization': marketing, 'analytics_storage': consent.analytics ? 'granted' : 'denied' }; } // Gate used by every event sender. While the choice is still unknown we allow // in permissive mode - matching a store that never asked - and block in strict // mode, where the merchant asked us to wait for an explicit opt-in. window.WixpaGA4.canSend = function (kind) { var consent = window.WixpaGA4.consent; if (!consent || !consent.known) { return !window.WixpaGA4.strict; } return kind === 'marketing' ? consent.marketing : consent.analytics; }; function wixpaInjectGtag(measurementId) { if (window.WixpaGA4.loaded) { return; } window.WixpaGA4.loaded = true; console.log('Wixpa GA4: loading gtag for ' + measurementId + ' (v' + window.WixpaGA4.version + ')'); var script = document.createElement('script'); script.src = 'https://www.googletagmanager.com/gtag/js?id=' + encodeURIComponent(measurementId); script.async = true; script.onload = function () { gtag('js', new Date()); gtag('config', measurementId); }; document.head.appendChild(script); } // A visitor who accepts after the page has loaded has to be picked up too, // otherwise they keep the page-load defaults for the rest of the visit. function wixpaWatchConsentChanges(measurementId) { if (window.WixpaGA4.watching) { return; } window.WixpaGA4.watching = true; document.addEventListener('visitorConsentCollected', function (event) { var detail = (event && event.detail) || {}; var consent = { analytics: detail.analyticsAllowed === true, marketing: detail.marketingAllowed === true, known: true }; window.WixpaGA4.consent = consent; gtag('consent', 'update', wixpaConsentSignals(consent)); console.log('Wixpa GA4: consent updated.', consent); if (consent.analytics || consent.marketing) { wixpaInjectGtag(measurementId); } }); } async function loadGTagScript(measurementId, consentMode) { if (!measurementId) { console.warn('Wixpa GA4: no measurement ID configured.'); window.WixpaGA4.markConsentReady(); return; } var strict = Number(consentMode) === 1; window.WixpaGA4.strict = strict; // Defaults have to be queued before gtag.js runs, and the visitor's choice // is not known yet, so start denied and lift it with the update below. gtag('consent', 'default', { 'ad_storage': 'denied', 'ad_user_data': 'denied', 'ad_personalization': 'denied', 'analytics_storage': 'denied', 'wait_for_update': 500 }); var apiAvailable = await wixpaLoadPrivacyApi(); var consent = apiAvailable ? wixpaReadConsent() : null; if (!consent) { // No stored choice is readable. Strict mode keeps everything off; other // stores keep tracking as they did before consent mode was introduced. console.warn('Wixpa GA4: Shopify Customer Privacy API unavailable.'); if (strict) { window.WixpaGA4.markConsentReady(); return; } consent = { analytics: true, marketing: true, known: false }; } window.WixpaGA4.consent = consent; window.WixpaGA4.markConsentReady(); if (strict && !consent.analytics && !consent.marketing) { console.log('Wixpa GA4: tracking consent not granted - tag not loaded.'); wixpaWatchConsentChanges(measurementId); return; } console.log('Wixpa GA4: consent applied', wixpaConsentSignals(consent)); gtag('consent', 'update', wixpaConsentSignals(consent)); wixpaInjectGtag(measurementId); wixpaWatchConsentChanges(measurementId); } // Kept so older cached copies of the block script keep working. async function getTrackingConsent() { var apiAvailable = await wixpaLoadPrivacyApi(); var consent = apiAvailable ? wixpaReadConsent() : null; if (consent) { window.WixpaGA4.consent = consent; } return consent ? (consent.analytics || consent.marketing) : false; } function sendRequest(shop) { var requestData = { shop: shop, }; var oReq5 = new XMLHttpRequest(); oReq5.open("POST", "https://app.easygoogleanalytics4.com/getData"); oReq5.setRequestHeader("Content-Type", "application/json"); oReq5.onreadystatechange = function () { if (this.readyState == 4) { if (this.status == 200) { try { var responseJSON = JSON.parse(oReq5.responseText); if (responseJSON) { // Events are read first so the consent mode the merchant // saved is known before the tag is loaded. var eventsData = responseJSON.events || null; if (eventsData) { console.log("Received Events:", eventsData); sessionStorage.setItem('GA4_Events', JSON.stringify(eventsData)); } if (responseJSON.measurement_id) { var measurementId = responseJSON.measurement_id; console.log("Received Measurement ID:", measurementId); sessionStorage.setItem('GA4_mId', JSON.stringify(measurementId)); loadGTagScript(measurementId, eventsData ? eventsData.consent_mode : 0); } } } catch (e) { console.error("Error parsing response JSON:", e); } } else { console.error("Error: Request failed with status", this.status); // Handle error appropriately } } }; // Send the POST request with the shop parameter oReq5.send(JSON.stringify(requestData)); }