// ss-variant-tracking.js — variant-identity enricher + auto-tracker // Reads
attributes and: // (a) enriches every outbound POST to the Cloudflare Worker /track endpoint // with missing variant fields (bridge_variant, sales_page_variant, // checkout_provider, etc.), and // (b) on sales pages fires landing_page_view once on load (every sales page), // plus samcart_click on each checkout-alpha CTA click in 'full' mode. // Idempotent — guarded by window.__ssVariantTrackingLoaded. (function(){ if (window.__ssVariantTrackingLoaded) return; window.__ssVariantTrackingLoaded = true; var WORKER_URL = 'https://patient-paper-a666.aaronctmd.workers.dev/track'; var TRACK_RE = /patient-paper-a666[^\/]*\/track\b/i; var CHECKOUT_URL = 'https://checkout-alpha.saltstrong.com/'; // Read variant attributes lazily so the tracker works whether placed at the // top of (preferred — patches fetch before inline IIFEs fire) or in // (where document.body is null at parse time). function attrSrc(){ return document.body || document.documentElement; } function readIdent(){ var b = attrSrc(); return { role: b.getAttribute('data-variant-role') || '', mode: b.getAttribute('data-variant-mode') || 'enrich', bridge_variant: b.getAttribute('data-variant-bridge') || '', sales_page_variant: b.getAttribute('data-variant-sales') || '', sales_page_variant_type: b.getAttribute('data-variant-sales-type') || '', color_variant: b.getAttribute('data-variant-color') || '', cta_variant: b.getAttribute('data-variant-cta') || '', page_slug: b.getAttribute('data-variant-slug') || '', angle: b.getAttribute('data-angle') || '' }; } function urlParams(){ return new URLSearchParams(location.search); } function getQuizVersion(){ return urlParams().get('quiz_version') || ''; } function getUtm(){ var p = urlParams(); return { utm_source: p.get('utm_source') || '', utm_medium: p.get('utm_medium') || '', utm_campaign: p.get('utm_campaign') || '', utm_content: p.get('utm_content') || '', utm_term: p.get('utm_term') || '' }; } function getContactId(){ var c = urlParams().get('contact_id') || ''; if (!c) { try { c = localStorage.getItem('ss_contact_id') || ''; } catch(_){} } if (c) { try { localStorage.setItem('ss_contact_id', c); } catch(_){} } return c; } function getOrCreateSession(){ if (window.__ssSessionId) return window.__ssSessionId; var sid = ''; try { sid = localStorage.getItem('ss_session_id') || ''; } catch(_){} if (!sid) { sid = 'sess_' + Date.now() + '_' + Math.random().toString(36).slice(2,8); try { localStorage.setItem('ss_session_id', sid); } catch(_){} } return (window.__ssSessionId = sid); } function enrichPayload(payload){ if (!payload || typeof payload !== 'object') return payload; var ident = readIdent(); var event = payload.event; var meta = payload.metadata = payload.metadata || {}; if (event === 'bridge_page_split_test') { if (ident.bridge_variant && !meta.bridge_variant) meta.bridge_variant = ident.bridge_variant; if (!meta.quiz_version) meta.quiz_version = getQuizVersion(); var dest = urlParams().get('dest') || ''; if (dest && !meta.sales_page_variant_target) meta.sales_page_variant_target = dest; } else if (event === 'landing_page_view') { if (ident.sales_page_variant && !meta.variant_id) meta.variant_id = ident.sales_page_variant; if (ident.sales_page_variant && !meta.sales_page_variant) meta.sales_page_variant = ident.sales_page_variant; // sales_page_variant_type holds the ANGLE (system/determined). Page family lives in sales_page_family. if (ident.angle && !meta.sales_page_variant_type) meta.sales_page_variant_type = ident.angle; if (ident.sales_page_variant_type && !meta.sales_page_family) meta.sales_page_family = ident.sales_page_variant_type; if (ident.color_variant && !meta.color_variant) meta.color_variant = ident.color_variant; if (ident.cta_variant && !meta.cta_variant) meta.cta_variant = ident.cta_variant; if (ident.page_slug && !meta.page_slug) meta.page_slug = ident.page_slug; if (!meta.url) meta.url = location.href; } else if (event === 'samcart_click' || event === 'add_to_cart') { if (!meta.checkout_provider) meta.checkout_provider = 'chargebee'; if (!meta.checkout_url) meta.checkout_url = CHECKOUT_URL; if (ident.sales_page_variant && !meta.sales_page_variant) meta.sales_page_variant = ident.sales_page_variant; // sales_page_variant_type holds the ANGLE (system/determined). Page family lives in sales_page_family. if (ident.angle && !meta.sales_page_variant_type) meta.sales_page_variant_type = ident.angle; if (ident.sales_page_variant_type && !meta.sales_page_family) meta.sales_page_family = ident.sales_page_variant_type; if (ident.color_variant && !meta.color_variant) meta.color_variant = ident.color_variant; if (ident.cta_variant && !meta.cta_variant) meta.cta_variant = ident.cta_variant; if (ident.page_slug && !meta.page_slug) meta.page_slug = ident.page_slug; } return payload; } function tryParse(s){ try { return JSON.parse(s); } catch(_) { return null; } } // Patch fetch — only POSTs to the worker /track endpoint. var _fetch = window.fetch; if (typeof _fetch === 'function') { window.fetch = function(input, init){ try { var url = typeof input === 'string' ? input : (input && input.url) || ''; var method = (init && init.method) || (input && input.method) || 'GET'; if (TRACK_RE.test(url) && String(method).toUpperCase() === 'POST' && init && typeof init.body === 'string') { var p = tryParse(init.body); if (p) init = Object.assign({}, init, { body: JSON.stringify(enrichPayload(p)) }); } } catch(_){} return _fetch.apply(this, arguments); }; } // Patch sendBeacon — only string/Blob payloads where we can read synchronously. if (navigator && typeof navigator.sendBeacon === 'function') { var _sb = navigator.sendBeacon.bind(navigator); navigator.sendBeacon = function(url, data){ try { if (TRACK_RE.test(String(url)) && typeof data === 'string') { var p = tryParse(data); if (p) return _sb(url, new Blob([JSON.stringify(enrichPayload(p))], { type:'text/plain' })); } } catch(_){} return _sb(url, data); }; } function track(event, metadata){ var payload = enrichPayload({ event: event, session_id: getOrCreateSession(), contact_id: getContactId(), email: getContactId() ? '' : 'anonymous', metadata: Object.assign({ session_id: getOrCreateSession(), page_url: location.href, referrer: document.referrer || '', device: window.innerWidth <= 600 ? 'mobile' : 'desktop' }, getUtm(), metadata || {}) }); var body = JSON.stringify(payload); try { if (navigator.sendBeacon) { if (navigator.sendBeacon(WORKER_URL, new Blob([body], { type:'text/plain' }))) return; } fetch(WORKER_URL, { method:'POST', headers:{'Content-Type':'application/json'}, body: body, keepalive: true }).catch(function(){}); } catch(_){} } // Defer event-firing wiring until DOM is ready so role/mode attrs are visible. function wireEventHandlers(){ var ident = readIdent(); // ─── Sales pages: fire landing_page_view once on load ─────────────── if (ident.role === 'sales') { var fireLPV = function(){ if (window.__ssLpvFired) return; window.__ssLpvFired = true; track('landing_page_view', { page_slug: ident.page_slug || ident.sales_page_variant }); }; if (document.readyState === 'complete') fireLPV(); else window.addEventListener('load', fireLPV); } // ─── Sales pages in 'full' mode: pricing_view + CTA + scroll + sections + video ───── if (ident.role === 'sales' && ident.mode === 'full') { var pageSlug = ident.page_slug || ident.sales_page_variant; var pageLoadTime = Date.now(); var fireOnce = {}; function trackOnce(ev, meta){ if (fireOnce[ev]) return; fireOnce[ev] = true; track(ev, meta); } // pricing_view fires once on load (HubSpot scoring signal). var firePricing = function(){ trackOnce('pricing_view', { page_slug: pageSlug }); }; if (document.readyState === 'complete') firePricing(); else window.addEventListener('load', firePricing); // CTA clicks → samcart_click + add_to_cart (preserved internal event names). document.addEventListener('click', function(e){ var a = e.target && e.target.closest && e.target.closest('a[href*="checkout-alpha.saltstrong.com"]'); if (!a || a.__ssClickFired) return; a.__ssClickFired = true; var meta = { cta_text: (a.textContent || '').trim().substring(0, 80), page_slug: pageSlug, seconds_on_page: Math.round((Date.now() - pageLoadTime) / 1000) }; track('samcart_click', meta); track('add_to_cart', meta); }, true); // Scroll depth 50% / 75%. var scrollFired = { d50:false, d75:false }; window.addEventListener('scroll', function(){ var pct = (window.scrollY / Math.max(1, document.body.scrollHeight - window.innerHeight)) * 100; if (!scrollFired.d50 && pct >= 50) { scrollFired.d50 = true; track('scroll_depth_50', { page_slug: pageSlug }); } if (!scrollFired.d75 && pct >= 75) { scrollFired.d75 = true; track('scroll_depth_75', { page_slug: pageSlug }); } }, { passive: true }); // Section visibility (only fires for sections that exist on the page). if ('IntersectionObserver' in window) { var sectionMap = { 'pricing-section': 'scroll_to_pricing', 'guarantee-section': 'scroll_to_guarantee', 'testimonials-section': 'testimonials_viewed' }; var sectionObserver = new IntersectionObserver(function(entries){ entries.forEach(function(entry){ if (!entry.isIntersecting) return; var ev = sectionMap[entry.target.id]; if (ev) trackOnce(ev, { page_slug: pageSlug }); sectionObserver.unobserve(entry.target); }); }, { threshold: 0.2 }); Object.keys(sectionMap).forEach(function(id){ var el = document.getElementById(id); if (el) sectionObserver.observe(el); }); } // Video play (HTML5