{"id":1720,"date":"2025-10-08T10:31:37","date_gmt":"2025-10-08T10:31:37","guid":{"rendered":"https:\/\/www.fabdigital.io\/marketing\/?page_id=1720"},"modified":"2025-10-14T14:34:39","modified_gmt":"2025-10-14T14:34:39","slug":"roas-forge-scan-free","status":"publish","type":"page","link":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/","title":{"rendered":"Free E-commerce Store Audit &#8211; ROASForge\u2122 Scan"},"content":{"rendered":"\n<!-- ===== Block 4: ROASForge\u2122 Audit Widget (Agency-Positioned + UTM + Store URL to HubSpot) ===== -->\n<section id=\"audit-widget\" class=\"lp-section rf-audit\">\n  <div class=\"lp-card\">\n    <header class=\"lp-head\">\n      <div class=\"lp-kicker\">\n        <span class=\"dot\"><\/span> ROASForge\u2122 \u2014 AI ROAS Engine <span class=\"sep\">\u2022<\/span> <b>FREE<\/b> Surface Scan\n      <\/div>\n      <h2 class=\"lp-title\">Unlock hidden revenue in 60 seconds \u2014 paste your store URL to run our AI scan <b>(FREE)<\/b><\/h2>\n      <p class=\"lp-sub\">\n        ROASForge pinpoints the biggest purchase blockers fast. <b>Our team implements these fixes with AI, algorithms, and code<\/b> to lift ROAS for e-commerce brands.\n      <\/p>\n    <\/header>\n\n    <!-- URL form -->\n    <form id=\"auditForm\" class=\"lp-form\" novalidate>\n      <label class=\"input-shell\" for=\"storeUrl\">\n        <span class=\"input-label\">Store URL<\/span>\n        <div class=\"input-wrap\">\n          <input id=\"storeUrl\" class=\"lp-input\" type=\"url\" inputmode=\"url\" placeholder=\"https:\/\/yourstore.ae\" required>\n        <\/div>\n        <p id=\"auditError\" class=\"lp-error\" role=\"alert\" hidden>Please enter a valid URL (e.g., https:\/\/brand.ae)<\/p>\n      <\/label>\n      <button id=\"auditStart\" class=\"rf-btn-primary\" type=\"submit\"><b>Run ROASForge Scan \u2014 FREE<\/b><\/button>\n      <p class=\"lp-micro\"><b>100% FREE<\/b>. Read-only scan of public pages. No login.<\/p>\n    <\/form>\n\n    <!-- Scan UI -->\n    <div id=\"scanArea\" class=\"scan-area\" aria-live=\"polite\" hidden>\n      <div class=\"progress\">\n        <div class=\"bar\" id=\"progressBar\"><span id=\"progressVal\">0%<\/span><\/div>\n      <\/div>\n\n      <div class=\"meta-row\">\n        <div class=\"meta-chip\">Signals<\/div>\n        <div class=\"meta-chip\">PDP proof<\/div>\n        <div class=\"meta-chip\">Checkout<\/div>\n        <div class=\"meta-chip\">Quick wins<\/div>\n      <\/div>\n\n      <div class=\"console\" id=\"scanConsole\" role=\"log\" aria-live=\"polite\"><\/div>\n\n      <!-- Findings -->\n      <div id=\"scanResults\" class=\"findings\" hidden>\n        <div class=\"findings-head\">\n          <h3 class=\"findings-title\">Preliminary findings (14 visible)<\/h3>\n          <span class=\"badge\">Full engineering report: <b id=\"totalChecksTop\">182<\/b> checks \u2014 <b>FREE<\/b><\/span>\n        <\/div>\n\n        <!-- Agency positioning at the \u201cresults moment\u201d -->\n        <p id=\"summaryLine\" class=\"summary\">\n          This preview shows high-leverage fixes. <b>Our performance engineers apply these insights (AI + coding)<\/b> to repair signals,\n          strengthen PDP proof, and reduce checkout friction \u2014 so your ad spend converts faster.\n        <\/p>\n\n        <!-- 1) 14 visible findings -->\n        <ul id=\"resultsVisible\" class=\"results-grid\"><\/ul>\n\n        <!-- 2) Locked teaser with readable faded items + CTA -->\n        <div class=\"locked-panel\">\n          <ul id=\"lockedList\" class=\"locked-grid\" aria-hidden=\"true\"><\/ul>\n\n          <!-- overlay sits only on this panel -->\n          <div class=\"lock-curtain\">\n            <div class=\"lock-title\">\n              <span class=\"lock-icon\" aria-hidden=\"true\">\ud83d\udd12<\/span>\n              <span>Unlock <b id=\"lockCount\">168<\/b> more ROI-critical checks (FREE)<\/span>\n            <\/div>\n            <p class=\"lock-sub\">\n              The full report powers our <b>done-for-you implementation<\/b>: signal repairs, PDP upgrades, and algorithm tweaks that raise ROAS.\n            <\/p>\n            <button id=\"openLeadFormBtn\" class=\"rf-btn-primary glow-btn\" type=\"button\"><b>Download full report \u2014 FREE<\/b><\/button>\n            <p class=\"lp-micro\">No cost. Actionable. Prioritized by revenue impact.<\/p>\n          <\/div>\n        <\/div>\n\n        <!-- 3) HubSpot Lead Form (reveals on CTA) -->\n        <div id=\"hsLeadWrap\" class=\"hs-lead-wrap\" hidden>\n          <h4 class=\"lead-title\">Get your full ROASForge report (FREE)<\/h4>\n          <p class=\"lead-sub\">\n            Receive the complete findings plus a <b>1-page action plan<\/b> our team uses to implement fixes and scale purchases.\n          <\/p>\n\n          <div class=\"hs-form-slot\">\n            <!-- Explicit HS target (we mount with UTMs + store_url) -->\n            <div id=\"hsFormContainer\"><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Mini agency closer -->\n    <div class=\"agency-closer\">\n      <div class=\"closer-bullet\"><span class=\"dot ok\"><\/span>Engine: ROASForge\u2122 (AI + algorithmic framework)<\/div>\n      <div class=\"closer-bullet\"><span class=\"dot ok\"><\/span>Experts: We implement fixes with code + creative + media<\/div>\n      <div class=\"closer-bullet\"><span class=\"dot ok\"><\/span>Outcome: Higher purchases and scalable ROAS<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<style>\n\/* Base from previous blocks *\/\n.lp-section{background:#f6f8fb;padding:40px 16px}\n.lp-card{max-width:980px;margin:0 auto;background:#fff;border:1px solid #e7ecf3;border-radius:16px;box-shadow:0 10px 30px rgba(2,6,23,.06),0 2px 8px rgba(2,6,23,.05);padding:24px}\n.lp-head{margin-bottom:10px}\n.lp-kicker{display:inline-flex;align-items:center;gap:10px;font-weight:700;color:#1f2a44}\n.lp-kicker .dot{width:8px;height:8px;border-radius:50%;background:#22d3ee;box-shadow:0 0 10px rgba(34,211,238,.6)}\n.lp-kicker .sep{opacity:.45}\n.lp-title{font-size:28px;line-height:1.2;margin:6px 0 8px;color:#0f172a}\n.lp-sub{color:#475569;margin:0 0 8px}\n\n\/* Form *\/\n.lp-form{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:end;margin:16px 0 8px}\n@media (max-width:720px){ .lp-form{grid-template-columns:1fr} }\n.input-shell{display:block}\n.input-label{display:block;font-size:13px;font-weight:700;color:#1f2937;margin:0 0 6px}\n.input-wrap{position:relative}\n.lp-input{width:100%;background:#fff;border:1px solid #e7ecf3;border-radius:12px;padding:14px 14px;font-size:16px;outline:none;transition:.2s border-color,.2s box-shadow}\n.lp-input:focus{border-color:#b6ccff;box-shadow:0 0 0 4px rgba(37,99,235,.15)}\n.lp-error{color:#b91c1c;margin-top:6px}\n.lp-micro{color:#64748b;margin-top:6px;font-size:12px}\n\n\/* Progress + console *\/\n.scan-area{margin-top:14px}\n.progress{height:14px;background:#eef2f7;border:1px solid #e7ecf3;border-radius:999px;overflow:hidden}\n.bar{height:100%;width:0;background:linear-gradient(90deg,#9bb8ff,#5c87f5,#2563eb);display:flex;align-items:center;justify-content:flex-end;border-radius:999px;transition:width .25s ease}\n.bar span{font-size:11px;color:#fff;padding-right:8px;font-weight:800;text-shadow:0 1px 0 rgba(0,0,0,.25)}\n.meta-row{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 12px}\n.meta-chip{background:#f1f5ff;border:1px solid #dbe6ff;color:#28457a;border-radius:999px;padding:6px 10px;font-size:12px}\n.console{background:#0b1220;color:#e5e7eb;border:1px solid #1e293b;border-radius:12px;padding:12px;min-height:160px;max-height:280px;overflow:auto;font-family:ui-monospace,Menlo,Consolas,monospace}\n.log{display:flex;gap:10px;align-items:flex-start;padding:6px 4px;border-bottom:1px dashed #1f2c42}\n.log:last-child{border-bottom:none}\n.log .dot{width:8px;height:8px;border-radius:50%;background:#60a5fa;box-shadow:0 0 10px rgba(59,130,246,.6);margin-top:6px}\n\n\/* Findings *\/\n.findings{margin-top:16px;border-top:1px solid #e7ecf3;padding-top:14px}\n.findings-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n.findings-title{margin:0;font-size:20px;color:#0f172a}\n.badge{background:#f7fafc;border:1px solid #e7ecf3;color:#475569;border-radius:999px;padding:6px 10px;font-size:12px}\n.summary{color:#334155;margin:6px 0 12px}\n\n\/* Result pills *\/\n.results-grid{list-style:none;margin:0 0 12px;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}\n@media (max-width:640px){ .results-grid{grid-template-columns:1fr} }\n.result{display:flex;gap:10px;align-items:center;border:1px solid #e7ecf3;border-left-width:4px;border-radius:10px;padding:10px;background:#fff}\n.result .b{width:10px;height:10px;border-radius:50%}\n.result span{font-size:14px;color:#0f172a}\n.result.pass{border-left-color:#16a34a} .result.pass .b{background:#16a34a}\n.result.warn{border-left-color:#d97706} .result.warn .b{background:#d97706}\n.result.fail{border-left-color:#ef4444} .result.fail .b{background:#ef4444}\n\n\/* Locked teaser *\/\n.locked-panel{position:relative;border:1px dashed #d9e3f2;border-radius:12px;padding:12px;background:#fbfdff;overflow:hidden}\n.locked-grid{\n  list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;\n  filter: blur(.6px) grayscale(.45) contrast(.95); opacity:.65; pointer-events:none;\n}\n@media (max-width:640px){ .locked-grid{grid-template-columns:1fr} }\n.locked-item{\n  border:1px solid #e3e9f5;border-radius:10px;padding:10px;background:#fff;color:#0f172a;font-weight:700;font-size:14px;display:flex;gap:8px;align-items:center\n}\n.locked-item .dot{width:8px;height:8px;border-radius:50%;background:#ef4444;box-shadow:0 0 6px rgba(239,68,68,.4)}\n.lock-curtain{\n  position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;\n  padding:22px; gap:10px;\n  background:linear-gradient(180deg,rgba(255,255,255,.70),rgba(246,248,251,.80));\n  backdrop-filter: blur(1.5px);\n  border-radius:12px;\n}\n.lock-title{display:flex;align-items:center;gap:8px; font-weight:900; font-size:18px; color:#0f172a}\n.lock-icon{font-size:18px}\n.lock-sub{margin:0;color:#334155}\n\n\/* Lead form block *\/\n.hs-lead-wrap{margin-top:16px;background:#ffffff;border:1px solid #e7ecf3;border-radius:12px;box-shadow:0 10px 30px rgba(2,6,23,.06),0 2px 8px rgba(2,6,23,.05);padding:16px}\n.lead-title{margin:0 0 6px;font-size:20px;color:#0f172a}\n.lead-sub{margin:0 0 12px;color:#334155}\n.hs-form-slot{background:#fbfdff;border:1px dashed #d9e3f2;border-radius:10px;padding:12px}\n\n\/* Agency closer *\/\n.agency-closer{display:flex;gap:12px;flex-wrap:wrap;margin-top:18px}\n.closer-bullet{display:flex;align-items:center;gap:8px;background:#f7faff;border:1px solid #e6edf7;border-radius:999px;padding:8px 12px;color:#1f2a44;font-weight:700;font-size:13px}\n.closer-bullet .dot{width:9px;height:9px;border-radius:50%}\n.closer-bullet .dot.ok{background:#16a34a;box-shadow:0 0 10px rgba(22,163,74,.35)}\n\n\/* ===== Unified Primary CTA (bold) ===== *\/\n.rf-btn-primary{\n  display:inline-block;background:#0047A5;color:#ffffff !important;\n  font-weight:900;font-size:18px;letter-spacing:.3px;\n  padding:16px 28px;border-radius:14px;text-decoration:none !important;border:none;\n  box-shadow:0 8px 24px rgba(0,71,165,.28), 0 2px 6px rgba(0,0,0,.12);\n  transition:transform .18s ease, box-shadow .18s ease, background .18s ease;\n}\n.rf-btn-primary:hover{\n  background:#003C8F;color:#ffffff !important;transform:translateY(-1px);\n  box-shadow:0 10px 28px rgba(0,71,165,.34), 0 4px 10px rgba(0,0,0,.16);\n}\n.rf-btn-primary:active{ transform:translateY(0); }\n.glow-btn{ animation: glowPulse 1.4s ease-in-out infinite alternate; }\n@keyframes glowPulse{\n  0% { box-shadow:0 0 0 0 rgba(37,99,235,.45), 0 12px 32px rgba(37,99,235,.18); transform:translateY(0) }\n  100%{ box-shadow:0 0 0 10px rgba(37,99,235,0), 0 16px 36px rgba(37,99,235,.24); transform:translateY(-1px) }\n}\n<\/style>\n\n<!-- MOBILE FIT OVERRIDES for Block 4: paste AFTER the existing <style> -->\n<style id=\"audit-widget-mobile-tune\">\n  \/* Global text wrapping on small screens *\/\n  @media (max-width: 740px){\n    .lp-card{ padding:18px; border-radius:14px }\n    .lp-title{ font-size:clamp(18px, 5.3vw, 22px); line-height:1.25; margin-bottom:6px }\n    .lp-sub{ font-size:14px; line-height:1.45 }\n    .rf-btn-primary{ width:100%; text-align:center; padding:14px 16px; font-size:16px; border-radius:12px }\n  }\n\n  \/* Form: stack, no overflow, iOS-friendly font-size to avoid zoom *\/\n  @media (max-width: 740px){\n    .lp-form{ grid-template-columns:1fr; gap:10px; margin-top:12px }\n    .input-label{ font-size:12px; margin-bottom:4px }\n    .lp-input{\n      font-size:16px; \/* prevents iOS zoom *\/\n      padding:12px 12px;\n      border-radius:10px;\n    }\n    #auditStart{ margin-top:2px }\n    #auditError{ font-size:12px }\n  }\n\n  \/* Progress + meta chips + console *\/\n  @media (max-width: 740px){\n    .progress{ height:10px; border-radius:999px }\n    .bar span{ font-size:10px; padding-right:6px }\n    .meta-row{ gap:6px; margin:8px 0 10px }\n    .meta-chip{ font-size:11px; padding:5px 8px }\n    .console{\n      min-height:120px; max-height:180px; padding:10px; font-size:12px; border-radius:10px\n    }\n    .log{ gap:8px; padding:6px 2px }\n  }\n\n  \/* Findings grid \u2192 single column; safe wrapping for long text *\/\n  @media (max-width: 740px){\n    .findings{ padding-top:12px }\n    .findings-head{ gap:8px }\n    .findings-title{ font-size:18px }\n    .badge{ font-size:11px; padding:5px 8px }\n    .results-grid{ grid-template-columns:1fr; gap:8px }\n    .result{ padding:10px; border-radius:10px }\n    .result span{ font-size:13px; line-height:1.45; word-break:break-word; overflow-wrap:anywhere }\n  }\n\n  \/* Locked panel: single column, lighter overlay padding *\/\n  @media (max-width: 740px){\n    .locked-panel{ padding:10px; border-radius:10px }\n    .locked-grid{ grid-template-columns:1fr; gap:8px }\n    .locked-item{ padding:10px; font-size:13px }\n    .lock-curtain{ padding:16px }\n    .lock-title{ font-size:16px }\n    .lock-sub{ font-size:13px }\n    .glow-btn{ width:100% }\n  }\n\n  \/* Lead form container *\/\n  @media (max-width: 740px){\n    .hs-lead-wrap{ padding:12px; border-radius:10px }\n    .lead-title{ font-size:18px }\n    .lead-sub{ font-size:13px }\n    .hs-form-slot{ padding:10px }\n  }\n\n  \/* Agency closer *\/\n  @media (max-width: 740px){\n    .agency-closer{ gap:8px; margin-top:14px }\n    .closer-bullet{ font-size:12px; padding:7px 10px }\n  }\n\n  \/* Extra small screens *\/\n  @media (max-width: 360px){\n    .lp-card{ padding:14px }\n    .lp-title{ font-size:17px }\n    .rf-btn-primary{ padding:12px 14px; font-size:15px }\n  }\n<\/style>\n\n<script>\n(() => {\n  \/* Elements *\/\n  const form = document.getElementById('auditForm');\n  const input = document.getElementById('storeUrl');\n  const error = document.getElementById('auditError');\n  const scanArea = document.getElementById('scanArea');\n  const progressBar = document.getElementById('progressBar');\n  const progressVal = document.getElementById('progressVal');\n  const consoleEl = document.getElementById('scanConsole');\n  const results = document.getElementById('scanResults');\n  const summaryLine = document.getElementById('summaryLine');\n  const visibleList = document.getElementById('resultsVisible');\n  const lockedList = document.getElementById('lockedList');\n  const lockCountEl = document.getElementById('lockCount');\n  const totalChecksTop = document.getElementById('totalChecksTop');\n  const openLeadFormBtn = document.getElementById('openLeadFormBtn');\n  const hsLeadWrap = document.getElementById('hsLeadWrap');\n\n  \/* Config *\/\n  const TOTAL_CHECKS = 182;\n  const PREVIEW_COUNT = 14;\n\n  \/* Scan steps *\/\n  const steps = [\n    \"Mapping traffic \u2192 purchase journey (Home \u2192 PLP \u2192 PDP \u2192 Cart \u2192 Checkout)\",\n    \"Spotting \u2018ad promise \u2192 PDP proof\u2019 mismatches that stall buyers\",\n    \"Estimating monthly loss from slow mobile LCP on key pages\",\n    \"Validating GA4 purchase value & event order (no ghost revenue)\",\n    \"Checking server-side event deduplication risk\",\n    \"Testing pixel events (view_content, add_to_cart, purchase) across PDPs\",\n    \"Auditing product feed: titles, images, availability, AED pricing\",\n    \"Detecting catalog blind spots that throttle PMAX\/DPA\",\n    \"Scanning PDP conversion drivers: stars, benefits, urgency, clear CTA\",\n    \"Evaluating checkout friction: guest, wallets, BNPL, steps\",\n    \"Reading exits & dead clicks on high-intent screens\",\n    \"Scoring signal richness to \u2018teach\u2019 algorithms who buys\",\n    \"Prioritizing fixes for fastest lift this month\",\n    \"Compiling surface summary\"\n  ];\n\n  \/* Visible findings (slice to 14) *\/\n  const visibleFindings = [\n    {text:\"Purchase value present in GA4 events\", cls:\"pass\"},\n    {text:\"Server-side events may not be fully deduped\", cls:\"warn\"},\n    {text:\"PDP above-the-fold shows stars & concrete benefits\", cls:\"pass\"},\n    {text:\"Checkout options could surface wallets\/BNPL earlier\", cls:\"warn\"},\n    {text:\"Feed titles likely under-optimized for Shopping\/PMAX\", cls:\"warn\"},\n    {text:\"Mobile LCP above target \u2014 buyers are bouncing\", cls:\"fail\"},\n    {text:\"Ad promise \u2194 PDP headline misaligned on top product\", cls:\"warn\"},\n    {text:\"Key PDPs lack review volume\/recency signals\", cls:\"warn\"},\n    {text:\"Cart page hides total cost clarity until late\", cls:\"warn\"},\n    {text:\"Variant thumbnails don\u2019t update main image reliably\", cls:\"fail\"},\n    {text:\"No guest checkout prominent on mobile\", cls:\"warn\"},\n    {text:\"Feed images cropped poorly for square\/vertical slots\", cls:\"warn\"},\n    {text:\"Catalog availability not syncing within 24h\", cls:\"warn\"},\n    {text:\"PMAX not learning due to thin signals\", cls:\"warn\"}\n  ];\n\n  \/* Teaser headings behind overlay *\/\n  const lockedHeadings = [\n    \"Signal dedup conflicts (Purchase vs. Server)\",\n    \"Low-signal audiences starving algorithm learning\",\n    \"Checkout wallet placement below fold\",\n    \"ATC \u2192 Checkout drop from surprise fees\",\n    \"Feed title entropy hurting Shopping\/PMAX\",\n    \"Catalog freshness (price\/availability drift)\",\n    \"Cross-domain handoff breaking attribution\",\n    \"Missing schema on PDP (Product\/Offer\/Review)\",\n    \"Cookie consent blocks GA4 firing\",\n    \"CAPI test IDs leaking to prod events\",\n    \"BNPL logos not visible on PDP\",\n    \"No sticky ATC on mobile PDP\"\n  ];\n\n  \/* Helpers *\/\n  const validUrl = (str) => { try{ const u=new URL(str.trim()); return \/^https?:$\/.test(u.protocol);}catch{ return false; } };\n  const addLog = (msg) => {\n    const row = document.createElement('div');\n    row.className = 'log';\n    row.innerHTML = `<span class=\"dot\"><\/span><div class=\"text\"><b>${new Date().toLocaleTimeString()}<\/b> \u2014 ${msg}<\/div>`;\n    consoleEl.appendChild(row);\n    consoleEl.scrollTop = consoleEl.scrollHeight;\n  };\n  const setProgress = (n) => {\n    const pct = Math.min(100, Math.max(0, n));\n    progressBar.style.width = pct + '%';\n    progressVal.textContent = pct + '%';\n  };\n\n  \/* Renderers *\/\n  function renderVisible() {\n    visibleList.innerHTML = '';\n    visibleFindings.slice(0, PREVIEW_COUNT).forEach(b => {\n      const li = document.createElement('li');\n      li.className = `result ${b.cls}`;\n      const label = b.cls==='pass' ? 'Pass' : (b.cls==='warn' ? 'Warning' : 'Attention');\n      li.innerHTML = `<span class=\"b\"><\/span><span><b>${label}:<\/b> ${b.text}<\/span>`;\n      visibleList.appendChild(li);\n    });\n    totalChecksTop.textContent = TOTAL_CHECKS.toString();\n    lockCountEl.textContent = (TOTAL_CHECKS - PREVIEW_COUNT).toString(); \/\/ 182 - 14 = 168\n  }\n\n  function renderLocked() {\n    lockedList.innerHTML = '';\n    lockedHeadings.forEach(t => {\n      const li = document.createElement('li');\n      li.className = 'locked-item';\n      li.innerHTML = `<span class=\"dot\"><\/span><span>${t}<\/span>`;\n      lockedList.appendChild(li);\n    });\n  }\n\n  \/* Flow: submit \u2192 simulate scan \u2192 show 14 + teaser + CTA *\/\n  form.addEventListener('submit', (e) => {\n    e.preventDefault();\n    const url = input.value;\n    if (!validUrl(url)) { error.hidden = false; return; }\n    error.hidden = true;\n\n    \/\/ Save store URL globally for HubSpot injection\n    window.__storeUrl = url.trim();\n\n    scanArea.hidden = false; results.hidden = true; hsLeadWrap.hidden = true;\n    consoleEl.innerHTML = ''; setProgress(0);\n\n    input.disabled = true;\n    const btn = document.getElementById('auditStart');\n    btn.disabled = true; btn.innerHTML = '<b>Scanning (FREE)\u2026<\/b>';\n\n    \/\/ Simulated scan\n    let i = 0, prog = 0;\n    addLog(`Starting ROASForge surface scan for <b>${url}<\/b> (FREE)`);\n    const timer = setInterval(() => {\n      const inc = 2 + Math.random()*4;\n      prog = Math.min(99, prog + inc);\n      setProgress(Math.round(prog));\n      if (i < steps.length) { addLog(steps[i]); i++; }\n      if (prog >= 99 && i >= steps.length) {\n        clearInterval(timer);\n        setTimeout(() => {\n          setProgress(100);\n          addLog(\"Compile complete. Surface summary ready.\");\n          renderVisible();\n          renderLocked();\n          results.hidden = false;\n          input.disabled = false;\n          btn.disabled = false; btn.innerHTML = '<b>Run ROASForge Scan \u2014 FREE<\/b>';\n        }, 500);\n      }\n    }, 300 + Math.random()*250);\n  });\n\n  \/\/ CTA \u2192 reveal HubSpot lead form and mount with UTMs + store_url\n  openLeadFormBtn.addEventListener('click', function(){\n    hsLeadWrap.hidden = false;\n    hsLeadWrap.scrollIntoView({behavior:'smooth', block:'start'});\n    if (window.__openHubspotLeadForm) window.__openHubspotLeadForm();\n  });\n})();\n<\/script>\n\n<!-- ===== UTM + Store URL \u2192 HubSpot form injector (load once, then create) ===== -->\n<script>\n(function(){\n  const PORTAL_ID = \"147005214\";\n  const FORM_ID   = \"d5b93832-336d-4cf5-b596-69cc47884155\";\n  const REGION    = \"eu1\";\n  const HS_SRC    = \"https:\/\/js-eu1.hsforms.net\/forms\/embed\/v2.js\";\n\n  \/\/ Ensure global holder for store URL (from the scan form)\n  window.__storeUrl = window.__storeUrl || \"\";\n\n  function getParams(){\n    const sp = new URLSearchParams(location.search);\n    const grab = k => sp.get(k) || \"\";\n    return {\n      utm_source:   grab(\"utm_source\"),\n      utm_medium:   grab(\"utm_medium\"),\n      utm_campaign: grab(\"utm_campaign\"),\n      utm_content:  grab(\"utm_content\"),\n      utm_term:     grab(\"utm_term\"),\n      gclid:        grab(\"gclid\"),\n      fbclid:       grab(\"fbclid\"),\n      landing_page: location.href.split('#')[0],\n      referrer:     document.referrer || \"\"\n    };\n  }\n\n  \/\/ Load HS script once\n  let hsLoaded = false, hsLoading = false, hsQueue = [];\n  function loadHS(cb){\n    if (hsLoaded) return cb();\n    hsQueue.push(cb);\n    if (hsLoading) return;\n    hsLoading = true;\n    const s = document.createElement(\"script\");\n    s.src = HS_SRC; s.async = true;\n    s.onload = function(){\n      hsLoaded = true; hsLoading = false;\n      hsQueue.forEach(fn => fn()); hsQueue = [];\n    };\n    document.body.appendChild(s);\n  }\n\n  function mountHubspotForm(){\n    const target = document.getElementById(\"hsFormContainer\");\n    if (!target) return;\n    const params = getParams();\n\n    window.hbspt.forms.create({\n      region: REGION,\n      portalId: PORTAL_ID,\n      formId: FORM_ID,\n      target: \"#hsFormContainer\",\n      onFormReady: function($form){\n        try{\n          const setHidden = (name, value) => {\n            if (!value) return;\n            let el = $form.find(`[name=\"${name}\"]`);\n            if (el.length === 0) {\n              const input = document.createElement(\"input\");\n              input.type = \"hidden\";\n              input.name = name;\n              input.value = value;\n              $form[0].appendChild(input);\n            } else {\n              el.val(value);\n            }\n          };\n\n          \/\/ UTMs + click IDs + helpful context\n          setHidden(\"utm_source\",   params.utm_source);\n          setHidden(\"utm_medium\",   params.utm_medium);\n          setHidden(\"utm_campaign\", params.utm_campaign);\n          setHidden(\"utm_content\",  params.utm_content);\n          setHidden(\"utm_term\",     params.utm_term);\n          setHidden(\"gclid\",        params.gclid);\n          setHidden(\"fbclid\",       params.fbclid);\n          setHidden(\"landing_page\", params.landing_page);\n          setHidden(\"referrer\",     params.referrer);\n\n          \/\/ \ud83d\ude80 Store URL captured from the scan form\n          if (window.__storeUrl) setHidden(\"store_url\", window.__storeUrl);\n        }catch(e){ console.warn(\"UTM + store URL injection warning:\", e); }\n      }\n    });\n  }\n\n  \/\/ Public function called when user clicks \u201cDownload full report \u2014 FREE\u201d\n  window.__openHubspotLeadForm = function(){\n    loadHS(mountHubspotForm);\n  };\n})();\n<\/script>\n\n\n\n<!-- ===== Block 1: UTM-aware Premium Hero (Agency-Positioned) ===== -->\n<section class=\"hero-utm v2\">\n  <div class=\"hero-wrap\">\n    <!-- Left: Messaging -->\n    <div class=\"hero-copy\">\n      <p class=\"hero-kicker\">\n        <span class=\"k-dot\"><\/span> ROASForge\u2122 \u2014 AI ROAS Engine\n      <\/p>\n      <h1 id=\"heroTitle\" class=\"hero-title\">\n        Engineer higher ROAS with AI\n      <\/h1>\n      <p id=\"heroSub\" class=\"hero-sub\">\n        We\u2019ll find your biggest money leaks in ~60 seconds. Paste your store URL below to start a FREE surface scan.\n      <\/p>\n\n      <!-- NEW: Agency positioning line -->\n      <p class=\"hero-agency\">\n        We\u2019re not just marketers \u2014 we <b>engineer<\/b> marketing performance. <b>ROASForge\u2122<\/b> is our in-house AI engine that powers every campaign we run for e-commerce clients.\n      <\/p>\n\n      <div class=\"hero-cta-row\">\n        <a href=\"#auditForm\" id=\"heroCta\" class=\"rf-btn-primary\"><b>Run ROASForge Scan \u2014 FREE<\/b><\/a>\n        <div class=\"hero-ticks\">\n          <span class=\"tick\">Free<\/span>\n          <span class=\"tick\">Read-only<\/span>\n          <span class=\"tick\">Owner-friendly<\/span>\n        <\/div>\n      <\/div>\n\n      <p class=\"hero-proof\">Discover what\u2019s secretly blocking your purchases \u2014 free AI-powered scan, reviewed by our performance team<\/p>\n    <\/div>\n\n    <!-- Right: Visual \u201cLive Scan\u201d mock -->\n    <aside class=\"hero-visual\" aria-hidden=\"true\">\n      <div class=\"hv-card\">\n        <div class=\"hv-head\">\n          <span class=\"hv-chip\">Surface Scan<\/span>\n          <span class=\"hv-dot\"><\/span>\n        <\/div>\n\n        <div class=\"hv-progress\" aria-label=\"Preview progress\">\n          <div class=\"hv-bar\"><span id=\"hvPct\">0%<\/span><\/div>\n        <\/div>\n\n        <ul class=\"hv-list\">\n          <li class=\"ok\"><span class=\"b\"><\/span>GA4 purchase value detected<\/li>\n          <li class=\"warn\"><span class=\"b\"><\/span>Server-side event dedupe risk<\/li>\n          <li class=\"ok\"><span class=\"b\"><\/span>PDP shows stars &#038; concrete benefits<\/li>\n          <li class=\"warn\"><span class=\"b\"><\/span>Wallets\/BNPL not visible above fold<\/li>\n          <li class=\"fail\"><span class=\"b\"><\/span>Mobile LCP above target on PDP<\/li>\n          <li class=\"warn\"><span class=\"b\"><\/span>Feed titles thin for Shopping\/PMAX<\/li>\n        <\/ul>\n      <\/div>\n      <div class=\"hv-glow\" aria-hidden=\"true\"><\/div>\n    <\/aside>\n  <\/div>\n<\/section>\n\n<style>\n\/* ===== Layout & Background ===== *\/\n.hero-utm.v2{\n  position:relative;\n  background:\n    radial-gradient(1200px 600px at 10% -10%, rgba(14,165,233,.22), transparent 55%),\n    radial-gradient(900px 500px at 85% 10%, rgba(37,99,235,.25), transparent 60%),\n    linear-gradient(135deg,#0b1022 0%, #0d1e4a 60%, #0e2b66 100%);\n  color:#fff;\n  overflow:hidden;\n}\n.hero-wrap{\n  max-width:1200px;\n  margin:0 auto;\n  padding:56px 18px 36px;\n  display:grid;\n  grid-template-columns:1.05fr .95fr;\n  gap:28px;\n  align-items:center;\n}\n@media (max-width:980px){\n  .hero-wrap{grid-template-columns:1fr; padding-bottom:24px}\n}\n\n\/* ===== Left: Copy ===== *\/\n.hero-kicker{\n  display:flex; align-items:center; gap:10px;\n  margin:0 0 8px; font-weight:700; letter-spacing:.02em; color:#CFE8FF;\n}\n.k-dot{width:8px;height:8px;border-radius:50%;background:#22d3ee;box-shadow:0 0 12px rgba(34,211,238,.9);display:inline-block}\n.hero-title{font-size:40px;line-height:1.15;margin:6px 0 10px}\n.hero-sub{max-width:700px;opacity:.95;margin:0 0 10px;color:#EAF2FF}\n.hero-agency{max-width:720px;margin:0 0 16px;color:#DCE9FF;opacity:.95}\n@media (max-width:640px){ .hero-title{font-size:30px} }\n\n.hero-cta-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-top:8px}\n.hero-ticks{display:flex;gap:8px;flex-wrap:wrap}\n.tick{\n  font-size:12px;color:#0a2142;background:#EAF2FF;border:1px solid rgba(255,255,255,.4);\n  border-radius:999px;padding:6px 10px;font-weight:800\n}\n.hero-proof{opacity:.9;font-size:13px;margin:10px 0 0}\n\n\/* ===== Reusable Primary CTA (bold & unified) ===== *\/\n.rf-btn-primary{\n  display:inline-block; background:#0047A5; color:#ffffff !important;\n  font-weight:900; font-size:18px; letter-spacing:.3px;\n  padding:16px 30px; border-radius:14px; text-decoration:none !important; border:none;\n  box-shadow:0 8px 24px rgba(0,71,165,.28), 0 2px 6px rgba(0,0,0,.12);\n  transition:transform .18s ease, box-shadow .18s ease, background .18s ease;\n}\n.rf-btn-primary:hover{\n  background:#003C8F; color:#ffffff !important; transform:translateY(-1px);\n  box-shadow:0 10px 28px rgba(0,71,165,.34), 0 4px 10px rgba(0,0,0,.16);\n}\n.rf-btn-primary:active{ transform:translateY(0); }\n\n\/* ===== Right: Visual Card ===== *\/\n.hero-visual{position:relative}\n.hv-card{\n  background:linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.04));\n  border:1px solid rgba(255,255,255,.18);\n  border-radius:18px; padding:16px;\n  box-shadow:0 30px 70px rgba(3,9,30,.45);\n  backdrop-filter:saturate(140%) blur(10px);\n}\n.hv-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}\n.hv-chip{\n  background:rgba(34,211,238,.15); color:#CFF6FF; border:1px solid rgba(34,211,238,.4);\n  font-size:12px; padding:6px 10px; border-radius:999px\n}\n.hv-dot{width:9px;height:9px;border-radius:50%;background:#22d3ee;box-shadow:0 0 12px rgba(34,211,238,.9)}\n.hv-progress{height:14px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.18);border-radius:999px;overflow:hidden}\n.hv-bar{\n  height:100%; width:0%;\n  background:linear-gradient(90deg,#9ac7ff,#5b8cf9,#2563eb);\n  display:flex; justify-content:flex-end; align-items:center; border-radius:999px;\n  transition:width .35s ease;\n}\n.hv-bar span{font-size:10px;color:#fff;padding-right:8px;font-weight:800;text-shadow:0 1px 0 rgba(0,0,0,.35)}\n\n.hv-list{list-style:none;margin:12px 0 0;padding:0;display:grid;gap:8px}\n.hv-list li{\n  display:flex;gap:10px;align-items:center;\n  background:rgba(8,20,45,.55); border:1px solid rgba(255,255,255,.12);\n  border-left-width:4px; border-radius:12px; padding:10px 12px; font-size:13px;\n}\n.hv-list li .b{width:10px;height:10px;border-radius:50%}\n.hv-list li.ok{border-left-color:#16a34a} .hv-list li.ok .b{background:#16a34a}\n.hv-list li.warn{border-left-color:#d97706} .hv-list li.warn .b{background:#d97706}\n.hv-list li.fail{border-left-color:#ef4444} .hv-list li.fail .b{background:#ef4444}\n\n.hv-glow{\n  position:absolute; inset:auto -40px -30px auto; width:220px;height:220px; border-radius:50%;\n  background:radial-gradient(closest-side, rgba(34,211,238,.35), rgba(34,211,238,0));\n  filter:blur(18px); opacity:.8;\n}\n<\/style>\n\n<script>\n\/* ===== UTM Personalization + Visual Anim ===== *\/\n(function(){\n  function getParam(k){ return new URLSearchParams(location.search).get(k) || \"\"; }\n\n  const map = {\n    stopwatch20:{title:\"Your 14-day ROAS plan \u2014 ready in 30 minutes\",sub:\"We\u2019ll find 3 money leaks for free. Start your scan below.\"},\n    redpen:{title:\"Your PDP, corrected\",sub:\"See what we\u2019d circle in red\u2014then what we\u2019d ship. Start with a free scan.\"},\n    leaks3:{title:\"3 fixes e-commerce stores miss (and what it costs)\",sub:\"Find your leaks in 60 seconds with ROASForge.\"},\n    portaltax:{title:\"Stop paying the portal tax\",sub:\"Teach the algorithm who buys on your site. Start with a free signal scan.\"},\n    confession:{title:\"Your CTR is fine. Your funnel isn\u2019t.\",sub:\"We\u2019ll prove it. Free ROASForge surface scan below.\"},\n    ugc:{title:\"Fewer discounts. More purchases.\",sub:\"Check if your PDP + signals can support creator traffic. Free scan.\"},\n    checklist:{title:\"7-step E-com Lift \u2014 free scan\",sub:\"We\u2019ll score your funnel against the checklist right now.\"},\n    calc:{title:\"Stop wasting AED on untrained algorithms\",sub:\"Run the quick math and see where the signal breaks.\"},\n    onetap:{title:\"One-tap audit \u2014 right here\",sub:\"No chat needed. Paste your URL and we\u2019ll do the surface scan.\"},\n    bonus48:{title:\"48-hour bonus: creative fixes pack (FREE)\",sub:\"Unlock the full report to claim it \u2014 start with a quick scan.\"}\n  };\n\n  const campaign = (getParam(\"utm_campaign\") || \"\").toLowerCase();\n  const variant = map[campaign] || null;\n\n  const titleEl = document.getElementById(\"heroTitle\");\n  const subEl = document.getElementById(\"heroSub\");\n\n  if (variant) { titleEl.textContent = variant.title; subEl.textContent = variant.sub; }\n\n  \/\/ Smooth scroll with offset so input is clearly visible\n  const ctaEl = document.getElementById(\"heroCta\");\n  ctaEl.addEventListener(\"click\",function(e){\n    const tgt=document.querySelector(this.getAttribute(\"href\"));\n    if(!tgt) return;\n    e.preventDefault();\n    const rect=tgt.getBoundingClientRect();\n    const y=window.pageYOffset+rect.top - (window.innerHeight\/2) + rect.height\/2 - 40;\n    window.scrollTo({top:Math.max(0,y),behavior:\"smooth\"});\n  });\n\n  \/\/ Ambient animation for the visual card\n  const bar = document.querySelector('.hv-bar');\n  const pct = document.getElementById('hvPct');\n  let p=0;\n  function tick(){\n    p = Math.min(96, p + (2 + Math.random()*6|0));\n    bar.style.width = p + '%';\n    pct.textContent = p + '%';\n    if (p < 96) setTimeout(tick, 360 + Math.random()*240);\n    else setTimeout(()=>{ p=0; bar.style.width='0%'; pct.textContent='0%'; setTimeout(tick, 800); }, 1600);\n  }\n  setTimeout(tick, 500);\n})();\n<\/script>\n\n\n\n<!-- ===== Block 2: Ad Promise \u2192 Page Proof (Agency-Positioned, Fixed CTA) ===== -->\n<section class=\"ad-proof v2\">\n  <div class=\"ad-proof__inner\">\n    <header class=\"ad-proof__head\">\n      <h2 id=\"proofTitle\" class=\"ad-proof__title\">What you saw in the ad \u2192 What you\u2019ll get here<\/h2>\n      <p id=\"proofSub\" class=\"ad-proof__sub\">\n        We\u2019ll run focused checks that match the promise you clicked. No fluff\u2014just the fastest wins.\n      <\/p>\n    <\/header>\n\n    <div class=\"ad-proof__grid\">\n      <!-- Left: \u201cFrom the ad\u201d -->\n      <div class=\"ad-proof__col\">\n        <div class=\"ad-proof__kicker\">From the ad<\/div>\n        <ul id=\"adBullets\" class=\"ad-proof__list\"><\/ul>\n      <\/div>\n\n      <!-- Right: \u201cWe\u2019ll check now\u201d -->\n      <div class=\"ad-proof__col\">\n        <div class=\"ad-proof__kicker\">We\u2019ll check now<\/div>\n        <ul id=\"checkBullets\" class=\"ad-proof__list\"><\/ul>\n      <\/div>\n    <\/div>\n\n    <div class=\"ad-proof__cta\">\n      <a href=\"#auditForm\" class=\"rf-btn-primary\"><b>Run ROASForge Scan \u2014 FREE<\/b><\/a>\n      <span class=\"ad-proof__note\">60-second surface scan \u2022 Read-only \u2022 FREE<\/span>\n    <\/div>\n\n    <!-- NEW: Agency credibility footer -->\n    <div class=\"ad-proof__footer\">\n      <p class=\"proof-note\">\n        ROASForge\u2122 is <b>our in-house AI engine<\/b>. Our performance team uses these insights to implement fixes and AI-driven optimizations that lift ROAS for e-commerce brands.\n      <\/p>\n    <\/div>\n  <\/div>\n<\/section>\n\n<style>\n.ad-proof.v2{\n  background:\n    radial-gradient(900px 500px at -10% -10%, rgba(37,99,235,.08), transparent 60%),\n    radial-gradient(700px 420px at 110% 10%, rgba(14,165,233,.08), transparent 60%),\n    #ffffff;\n  border-top:1px solid #e7ecf3;\n}\n.ad-proof__inner{max-width:1100px;margin:0 auto;padding:32px 16px}\n.ad-proof__head{margin-bottom:14px}\n.ad-proof__title{margin:0 0 6px;font-size:26px;color:#0f172a;letter-spacing:.1px}\n.ad-proof__sub{margin:0;color:#475569;max-width:860px}\n\n.ad-proof__grid{\n  display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:18px\n}\n@media (max-width:900px){.ad-proof__grid{grid-template-columns:1fr}}\n.ad-proof__col{\n  background:linear-gradient(180deg,#fafcff,#f8fbff);\n  border:1px solid #e6edf7;border-radius:16px;padding:16px;\n  box-shadow:0 8px 24px rgba(15,23,42,.04);\n}\n.ad-proof__kicker{\n  font-size:12px;font-weight:800;letter-spacing:.04em;\n  color:#1f2a44;margin-bottom:10px;text-transform:uppercase;\n}\n\n.ad-proof__list{list-style:none;margin:0;padding:0;display:grid;gap:12px}\n.ad-proof__list li{\n  display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:flex-start;\n  background:#fff;border:1px solid #e7ecf3;border-left:4px solid #2563eb;\n  border-radius:12px;padding:12px;box-shadow:0 2px 10px rgba(2,6,23,.04);\n}\n.badge{\n  display:inline-flex;align-items:center;justify-content:center;\n  width:26px;height:26px;border-radius:50%;\n  font-size:12px;font-weight:900;color:#fff;background:#2563eb;\n  box-shadow:0 2px 8px rgba(37,99,235,.20);\n}\n.li-title{font-weight:800;color:#0f172a;letter-spacing:.1px}\n.li-sub{color:#475569;font-size:13px;margin-top:2px}\n\n\/* CTA Row *\/\n.ad-proof__cta{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:20px}\n.ad-proof__note{font-size:12px;color:#64748b}\n\n\/* Agency footer *\/\n.ad-proof__footer{margin-top:14px}\n.proof-note{\n  margin:0;color:#334155;background:#f7faff;border:1px solid #e6edf7;\n  border-radius:12px;padding:12px 14px\n}\n\n\/* ===== Unified Primary Button (bold, matches hero) ===== *\/\n.rf-btn-primary{\n  display:inline-block;background:#0047A5;color:#ffffff!important;\n  font-weight:900;font-size:18px;letter-spacing:.3px;\n  padding:16px 28px;border-radius:14px;text-decoration:none!important;border:none;\n  box-shadow:0 8px 24px rgba(0,71,165,.28),0 2px 6px rgba(0,0,0,.12);\n  transition:transform .18s ease,box-shadow .18s ease,background .18s ease;\n}\n.rf-btn-primary:hover{\n  background:#003C8F;color:#ffffff!important;transform:translateY(-1px);\n  box-shadow:0 10px 28px rgba(0,71,165,.34),0 4px 10px rgba(0,0,0,.16);\n}\n.rf-btn-primary:active{transform:translateY(0);}\n<\/style>\n\n<script>\n\/* Block 2 logic: utm_campaign \u2192 bullets; CTA stays fixed *\/\n(function(){\n  const $ = (sel)=>document.querySelector(sel);\n\n  const MAP = {\n    \/\/ 1) Stopwatch \u201c30-Minute Plan\u201d\n    stopwatch20: {\n      title: \"30-minute plan \u2192 Fastest wins on your store\",\n      sub: \"We\u2019ll confirm the 3 leaks you saw\u2014then show how to fix them first.\",\n      ad: [\n        {t:\"Find 3 money leaks in 30 minutes\", s:\"Exactly what we\u2019ll surface in your scan.\"},\n        {t:\"Free audit \u2192 Full ROAS plan\", s:\"You\u2019ll get a prioritized action list.\"},\n        {t:\"Real numbers, not theory\", s:\"We point to pages and events, not opinions.\"}\n      ],\n      checks: [\n        {t:\"Tracking health (GA4 + CAPI)\", s:\"Purchase value, event order, dedupe risk.\"},\n        {t:\"PDP proof alignment\", s:\"Ad promise matches headline, social proof, CTA.\"},\n        {t:\"Checkout friction\", s:\"Guest, wallets\/BNPL visibility, steps, surprises.\"}\n      ]\n    },\n\n    \/\/ 2) Red-Pen Audit (Before\/After)\n    redpen: {\n      title: \"Your PDP, corrected\",\n      sub: \"We\u2019ll turn red circles into green ticks\u2014starting today.\",\n      ad: [\n        {t:\"Before\/After clarity\", s:\"You saw issues circled\u2014let\u2019s find yours quickly.\"},\n        {t:\"Proof over polish\", s:\"Stars, benefits, UGC\u2014above the fold.\"},\n        {t:\"From click to cart\", s:\"Keep the promise buyers clicked.\"}\n      ],\n      checks: [\n        {t:\"Above-the-fold proof\", s:\"Stars, benefits, hero image\/variant fit.\"},\n        {t:\"Cost clarity early\", s:\"Shipping\/VAT expectations, no surprises.\"},\n        {t:\"Sticky action\", s:\"Add-to-cart visibility on mobile.\"}\n      ]\n    },\n\n    \/\/ 3) \u201c3 Money Leaks\u201d\n    leaks3: {\n      title: \"3 money leaks \u2192 quick fixes\",\n      sub: \"We\u2019ll validate the three that cost you most this month.\",\n      ad: [\n        {t:\"Tracking leak\", s:\"Signals starving algorithms.\"},\n        {t:\"Creative\/hook leak\", s:\"Traffic won\u2019t save weak offers.\"},\n        {t:\"Handoff leak\", s:\"Lost at PDP or checkout.\"}\n      ],\n      checks: [\n        {t:\"Signal depth\", s:\"Server-side events, dedupe, event value.\"},\n        {t:\"Promise \u2192 PDP\", s:\"Headline, proof, benefits align.\"},\n        {t:\"Cart\/checkout exits\", s:\"Where buyers stall and why.\"}\n      ]\n    },\n\n    \/\/ 4) Portal Tax\n    portaltax: {\n      title: \"Own your pipeline (stop paying portal tax)\",\n      sub: \"Feed PMAX\/Search with higher-quality signals and PDPs that convert.\",\n      ad: [\n        {t:\"Marketplace dependency\", s:\"Great for reach, bad for margin.\"},\n        {t:\"Own the data\", s:\"Train algorithms on your real buyers.\"},\n        {t:\"Scale safely\", s:\"Signal-led growth beats discounts.\"}\n      ],\n      checks: [\n        {t:\"Product feed quality\", s:\"Titles, images, price\/availability freshness.\"},\n        {t:\"PMAX readiness\", s:\"Catalog coverage, signal richness.\"},\n        {t:\"PDP conversion score\", s:\"Proof, urgency, CTA clarity.\"}\n      ]\n    },\n\n    \/\/ 5) Founder Confession\n    confession: {\n      title: \"Your CTR is fine. Your funnel isn\u2019t.\",\n      sub: \"If ads are working but sales are flat, it\u2019s the handoff\u2014let\u2019s prove it.\",\n      ad: [\n        {t:\"Not a targeting issue\", s:\"It\u2019s offer, proof, and friction.\"},\n        {t:\"Quick validation\", s:\"You\u2019ll see it in the scan output.\"},\n        {t:\"Action today\", s:\"Fastest wins first.\"}\n      ],\n      checks: [\n        {t:\"Promise \u2192 PDP continuity\", s:\"No disconnect after the click.\"},\n        {t:\"Social proof density\", s:\"Volume\/recency of reviews.\"},\n        {t:\"Friction audit\", s:\"Wallets, guest, steps, extra fees.\"}\n      ]\n    },\n\n    \/\/ 6) UGC\n    ugc: {\n      title: \"Fewer discounts. More purchases.\",\n      sub: \"UGC traffic needs PDP proof and fast paths to purchase.\",\n      ad: [\n        {t:\"Creator hooks worked\", s:\"But did the PDP back them up?\"},\n        {t:\"Stop coupon addiction\", s:\"Fix proof and friction instead.\"},\n        {t:\"Native feel\", s:\"Keep momentum post-click.\"}\n      ],\n      checks: [\n        {t:\"Hook \u2192 headline continuity\", s:\"Match the claim users just saw.\"},\n        {t:\"UGC placement\", s:\"Above-the-fold signals on mobile.\"},\n        {t:\"Speed & media\", s:\"LCP and video impact.\"}\n      ]\n    },\n\n    \/\/ 7) Checklist\n    checklist: {\n      title: \"7-step E-com Lift\u2014validated\",\n      sub: \"We\u2019ll score your store against the same checklist.\",\n      ad: [\n        {t:\"Simple steps\", s:\"Clear, owner-friendly changes.\"},\n        {t:\"Signal-first\", s:\"Train the algorithm properly.\"},\n        {t:\"Repeatable\", s:\"Scale without guesswork.\"}\n      ],\n      checks: [\n        {t:\"Signals & events\", s:\"GA4, CAPI, dedupe, value.\"},\n        {t:\"PDP essentials\", s:\"Proof, benefits, sticky ATC.\"},\n        {t:\"Checkout readiness\", s:\"Wallets\/BNPL, form friction.\"}\n      ]\n    },\n\n    \/\/ 8) Calculator\n    calc: {\n      title: \"Stop wasting AED on untrained algorithms\",\n      sub: \"See the math\u2014then fix the signal.\",\n      ad: [\n        {t:\"Real AED impact\", s:\"Not vanity metrics.\"},\n        {t:\"Fixable today\", s:\"Signals and PDP alignment.\"},\n        {t:\"Safer scaling\", s:\"Spend behind certainty.\"}\n      ],\n      checks: [\n        {t:\"Signal sufficiency\", s:\"Purchase value + dedupe.\"},\n        {t:\"PDP promise match\", s:\"No cognitive dissonance.\"},\n        {t:\"Exit patterns\", s:\"Where money leaks.\"}\n      ]\n    },\n\n    \/\/ 9) One-tap\n    onetap: {\n      title: \"One-tap audit\u2014right here\",\n      sub: \"No chat needed. Paste URL and run the scan.\",\n      ad: [\n        {t:\"Zero hassle\", s:\"Paste URL, hit scan.\"},\n        {t:\"Immediate output\", s:\"Visible findings in 60s.\"},\n        {t:\"Engineering report\", s:\"Full depth after unlock.\"}\n      ],\n      checks: [\n        {t:\"Signals\", s:\"GA4+CAPI purchase sanity.\"},\n        {t:\"PDP proof\", s:\"Reviews, benefits, CTA.\"},\n        {t:\"Checkout\", s:\"Wallets, steps, surprises.\"}\n      ]\n    },\n\n    \/\/ 10) 48-hour bonus\n    bonus48: {\n      title: \"48-hour bonus: creative fixes pack (FREE)\",\n      sub: \"Unlock your report to claim it\u2014start with a quick scan.\",\n      ad: [\n        {t:\"Limited window\", s:\"Priority reviews this week.\"},\n        {t:\"Action pack\", s:\"Hooks, angles, PDP copy.\"},\n        {t:\"Faster lift\", s:\"Fix what matters first.\"}\n      ],\n      checks: [\n        {t:\"Quick wins\", s:\"What to fix in 48 hours.\"},\n        {t:\"Signal gaps\", s:\"Teach the algo who buys.\"},\n        {t:\"PDP priorities\", s:\"Proof, benefits, clarity.\"}\n      ]\n    }\n  };\n\n  const DEFAULT = MAP.stopwatch20;\n  const key = (new URLSearchParams(location.search).get(\"utm_campaign\") || \"\").toLowerCase();\n  const v = MAP[key] || DEFAULT;\n\n  \/\/ Render title\/sub and lists\n  $(\"#proofTitle\").textContent = v.title;\n  $(\"#proofSub\").textContent = v.sub;\n\n  function renderList(el, items){\n    el.innerHTML = \"\";\n    items.forEach((it, i)=>{\n      const li = document.createElement(\"li\");\n      li.innerHTML = `\n        <span class=\"badge\">${i+1}<\/span>\n        <div>\n          <div class=\"li-title\">${it.t}<\/div>\n          <div class=\"li-sub\">${it.s}<\/div>\n        <\/div>`;\n      el.appendChild(li);\n    });\n  }\n  renderList(document.getElementById(\"adBullets\"), v.ad);\n  renderList(document.getElementById(\"checkBullets\"), v.checks);\n\n  \/\/ CTA smooth scroll with slight offset\n  document.querySelector('.ad-proof__cta .rf-btn-primary').addEventListener('click', function(e){\n    const tgt = document.querySelector(this.getAttribute('href'));\n    if(!tgt) return;\n    e.preventDefault();\n    const rect = tgt.getBoundingClientRect();\n    const y = window.pageYOffset + rect.top - 100;\n    window.scrollTo({ top: Math.max(0, y), behavior: 'smooth' });\n  });\n})();\n<\/script>\n\n\n\n\n<!-- ===== Block 3: Scan Preview Strip (compact, agency-positioned) ===== -->\n<section class=\"scan-strip v2\">\n  <div class=\"scan-strip__inner\">\n    <div class=\"scan-strip__left\">\n      <h3 class=\"scan-strip__title\">ROASForge is ready to scan your store<\/h3>\n      <p class=\"scan-strip__sub\">Real-time checks for signals, PDP proof, and checkout friction \u2014 free AI scan.<\/p>\n\n      <div class=\"scan-strip__progress\" aria-label=\"Preview progress\">\n        <div class=\"scan-strip__bar\"><span id=\"ssPct\">0%<\/span><\/div>\n      <\/div>\n\n      <!-- Unified bold CTA -->\n      <a href=\"#auditForm\" class=\"scan-strip__cta rf-btn-primary\"><b>Run ROASForge Scan \u2014 FREE<\/b><\/a>\n\n      <!-- NEW: Agency note under CTA -->\n      <p class=\"scan-strip__credit\">\n        This scan powers our <b>performance marketing work<\/b>. Our team uses these findings to implement\n        <b>AI-driven fixes<\/b> and <b>algorithmic optimizations<\/b> that lift ROAS for e-commerce brands.\n      <\/p>\n    <\/div>\n\n    <div class=\"scan-strip__console\" aria-hidden=\"true\" role=\"log\">\n      <div class=\"ss-line\"><span class=\"dot\"><\/span><b>Signals<\/b> \u2022 GA4 purchase value detected<\/div>\n      <div class=\"ss-line\"><span class=\"dot\"><\/span><b>Server-side<\/b> \u2022 Deduplication check queued<\/div>\n      <div class=\"ss-line\"><span class=\"dot\"><\/span><b>PDP<\/b> \u2022 Above-the-fold proof scan<\/div>\n      <div class=\"ss-line\"><span class=\"dot\"><\/span><b>Checkout<\/b> \u2022 Wallets &#038; guest options<\/div>\n      <div class=\"ss-line\"><span class=\"dot\"><\/span><b>Feed<\/b> \u2022 Titles \/ availability freshness<\/div>\n      <div class=\"ss-line hide-mobile\"><span class=\"dot\"><\/span><b>PMAX<\/b> \u2022 Catalog coverage &#038; signals<\/div>\n      <div class=\"ss-line hide-mobile\"><span class=\"dot\"><\/span><b>Speed<\/b> \u2022 Mobile LCP estimate<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<style>\n.scan-strip.v2{\n  background:linear-gradient(180deg,#0f172a 0%,#0b1e3f 100%);\n  color:#eaf2ff; border-top:1px solid rgba(255,255,255,.06)\n}\n.scan-strip__inner{\n  max-width:1100px; margin:0 auto; padding:18px 16px;\n  display:grid; grid-template-columns:1.15fr .85fr; gap:18px; align-items:center\n}\n@media (max-width:900px){ .scan-strip__inner{grid-template-columns:1fr} }\n.scan-strip__title{margin:0 0 6px; font-size:20px}\n.scan-strip__sub{margin:0 0 12px; color:#b8c7e6}\n\n.scan-strip__progress{\n  height:12px; background:#0a1630; border:1px solid rgba(255,255,255,.10);\n  border-radius:999px; overflow:hidden\n}\n.scan-strip__bar{\n  height:100%; width:0;\n  background:linear-gradient(90deg,#8ab4ff,#5d8aff,#2563eb);\n  display:flex; justify-content:flex-end; align-items:center; border-radius:999px;\n  transition:width .3s ease\n}\n.scan-strip__bar span{\n  font-size:10px; color:#fff; padding-right:8px; font-weight:800;\n  text-shadow:0 1px 0 rgba(0,0,0,.35)\n}\n\n\/* CTA (use shared button style; keep margin only here) *\/\n.scan-strip__cta{ margin-top:12px; }\n\n\/* Agency credit under CTA *\/\n.scan-strip__credit{\n  margin:10px 0 0; font-size:13px; color:#cfe1ff; max-width:620px;\n  opacity:.95;\n}\n\n.scan-strip__console{\n  background:#0b142b; border:1px solid rgba(255,255,255,.08);\n  border-radius:12px; padding:10px; min-height:120px; max-height:160px; overflow:hidden;\n  font-family:ui-monospace,Menlo,Consolas,monospace\n}\n.ss-line{\n  display:flex; gap:8px; align-items:center; color:#dbe8ff;\n  font-size:13px; padding:6px 4px; border-bottom:1px dashed rgba(255,255,255,.08);\n  opacity:.0; transform:translateY(6px)\n}\n.ss-line:last-child{ border-bottom:none }\n.ss-line .dot{ width:8px; height:8px; border-radius:50%; background:#60a5fa; box-shadow:0 0 10px rgba(96,165,250,.5) }\n.hide-mobile{ display:block }\n@media (max-width:640px){ .hide-mobile{ display:none } }\n\n\/* entrance animation *\/\n.ss-line.show{ animation:ssFade .35s ease forwards }\n@keyframes ssFade{ to{ opacity:1; transform:translateY(0) } }\n\n\/* ===== Shared Primary CTA (same as other blocks) ===== *\/\n.rf-btn-primary{\n  display:inline-block; background:#0047A5; color:#ffffff !important;\n  font-weight:900; font-size:18px; letter-spacing:.3px;\n  padding:16px 28px; border-radius:14px; text-decoration:none !important; border:none;\n  box-shadow:0 8px 24px rgba(0,71,165,.28), 0 2px 6px rgba(0,0,0,.12);\n  transition:transform .18s ease, box-shadow .18s ease, background .18s ease;\n}\n.rf-btn-primary:hover{\n  background:#003C8F; color:#ffffff !important; transform:translateY(-1px);\n  box-shadow:0 10px 28px rgba(0,71,165,.34), 0 4px 10px rgba(0,0,0,.16);\n}\n.rf-btn-primary:active{ transform:translateY(0); }\n<\/style>\n\n<script>\n\/* Tiny animation for the preview strip + smooth scroll *\/\n(function(){\n  const bar = document.querySelector('.scan-strip__bar');\n  const pct = document.getElementById('ssPct');\n  const lines = Array.from(document.querySelectorAll('.scan-strip__console .ss-line'));\n  let p = 0, i = 0;\n\n  function tick(){\n    p = Math.min(96, p + (2 + Math.random()*6)|0);\n    bar.style.width = p + '%';\n    pct.textContent = p + '%';\n\n    let reveal = Math.random() > .6 ? 2 : 1;\n    while (reveal-- && i < lines.length){\n      lines[i].classList.add('show');\n      i++;\n    }\n    if (p < 96 || i < lines.length) {\n      setTimeout(tick, 420 + Math.random()*260);\n    } else {\n      setTimeout(()=>{\n        p = 0; i = 0;\n        bar.style.width = '0%'; pct.textContent = '0%';\n        lines.forEach(el=>el.classList.remove('show'));\n        setTimeout(tick, 600);\n      }, 2400);\n    }\n  }\n  setTimeout(tick, 400);\n\n  \/\/ smooth scroll for CTA with slight offset\n  document.querySelector('.scan-strip__cta').addEventListener('click', function(e){\n    const tgt = document.querySelector(this.getAttribute('href'));\n    if(!tgt) return;\n    e.preventDefault();\n    const rect = tgt.getBoundingClientRect();\n    const y = window.pageYOffset + rect.top - 100;\n    window.scrollTo({ top: Math.max(0, y), behavior: 'smooth' });\n  });\n})();\n<\/script>\n\n\n\n\n\n<!-- ===== Block 5: Trust \/ Authority Strip ===== -->\n<section class=\"trust-strip\" aria-label=\"Trust &#038; authority\">\n  <div class=\"trust-inner\">\n    <div class=\"trust-left\">\n      <h3 class=\"trust-title\">Trusted by e-commerce founders<\/h3>\n      <ul class=\"trust-bullets\">\n        <li>Free, read-only scan \u2014 no site access needed<\/li>\n        <li>AI-driven findings you can fix this week<\/li>\n        <li>NDA available on request<\/li>\n      <\/ul>\n    <\/div>\n\n    <!-- Lightweight logo row (replace placeholders or hide if none) -->\n    <div class=\"trust-logos\" aria-hidden=\"true\">\n      <span class=\"logo-pill\">Beauty<\/span>\n      <span class=\"logo-pill\">Home<\/span>\n      <span class=\"logo-pill\">Fashion<\/span>\n      <span class=\"logo-pill\">Electronics<\/span>\n      <span class=\"logo-pill\">F&#038;B<\/span>\n    <\/div>\n  <\/div>\n<\/section>\n\n<style>\n.trust-strip{background:#ffffff;border-top:1px solid #e7ecf3}\n.trust-inner{max-width:1100px;margin:0 auto;padding:22px 16px;display:grid;grid-template-columns:1.1fr .9fr;gap:16px;align-items:center}\n@media (max-width:900px){ .trust-inner{grid-template-columns:1fr} }\n.trust-title{margin:0 0 8px;font-size:20px;color:#0f172a}\n.trust-bullets{margin:0;padding-left:18px;color:#334155}\n.trust-bullets li{margin:4px 0}\n.trust-logos{display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end}\n@media (max-width:900px){ .trust-logos{justify-content:flex-start} }\n.logo-pill{display:inline-flex;align-items:center;justify-content:center;padding:8px 12px;border:1px solid #e7ecf3;border-radius:999px;background:#f8fbff;color:#274277;font-weight:700;font-size:12px}\n<\/style>\n\n\n\n\n\n<!-- ===== Block 6: How We Work \u2014 Playful Animated Flowchart (v2) ===== -->\n<section class=\"rf-flow rf-flow--v2\" id=\"roasforge-flow\">\n  <div class=\"rfv2__inner\">\n    <header class=\"rfv2__head\">\n      <h2 class=\"rfv2__title\">\n        How we turn your scan into <span class=\"rfv2__spark\">ROAS<\/span>\n      <\/h2>\n      <p class=\"rfv2__sub\">A fast, repeatable path:\n        <b>ROASForge\u2122 scan \u2192 engineering \u2192 code implementation \u2192 scale<\/b>.\n      <\/p>\n    <\/header>\n\n    <!-- Decorative Background Orbs -->\n    <div class=\"rfv2__orbs\" aria-hidden=\"true\">\n      <span class=\"orb orb-a\"><\/span>\n      <span class=\"orb orb-b\"><\/span>\n      <span class=\"orb orb-c\"><\/span>\n    <\/div>\n\n    <!-- Canvas for path + connectors -->\n    <div class=\"rfv2__stage\">\n      <svg class=\"rfv2__svg\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" preserveAspectRatio=\"none\">\n        <!-- central animated metro line -->\n        <defs>\n          <linearGradient id=\"rfv2-g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n            <stop offset=\"0%\" stop-color=\"#22d3ee\"\/>\n            <stop offset=\"55%\" stop-color=\"#2563eb\"\/>\n            <stop offset=\"100%\" stop-color=\"#9bb8ff\"\/>\n          <\/linearGradient>\n          <filter id=\"rfv2-glow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n            <feGaussianBlur stdDeviation=\"6\" result=\"glow\"\/>\n            <feMerge><feMergeNode in=\"glow\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge>\n          <\/filter>\n        <\/defs>\n        <path class=\"rfv2__rail\" d=\"\" stroke=\"url(#rfv2-g)\" stroke-width=\"6\" fill=\"none\" filter=\"url(#rfv2-glow)\"><\/path>\n        <circle class=\"rfv2__runner\" r=\"6\" fill=\"#ffffff\" stroke=\"#2563eb\" stroke-width=\"3\"><\/circle>\n\n        <!-- connector group (auto-drawn via JS) -->\n        <g class=\"rfv2__connectors\" stroke=\"url(#rfv2-g)\" stroke-width=\"2\" fill=\"none\"><\/g>\n      <\/svg>\n\n      <!-- Steps (alternating sides) -->\n      <ol class=\"rfv2__steps\">\n        <li class=\"rfv2-step side-left\" data-step=\"1\" data-emoji=\"\ud83e\udd16\">\n          <div class=\"badge\">1<\/div>\n          <h3>Free AI Scan (ROASForge)<\/h3>\n          <p>Map funnel &#038; signal health. Baseline in ~60s.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-right\" data-step=\"2\" data-emoji=\"\ud83e\uddee\">\n          <div class=\"badge\">2<\/div>\n          <h3>Engineer Findings<\/h3>\n          <p>Quantify impact of leaks. Prioritize by revenue.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-left\" data-step=\"3\" data-emoji=\"\ud83d\uddfa\ufe0f\">\n          <div class=\"badge\">3<\/div>\n          <h3>1-Page Action Plan (24h)<\/h3>\n          <p>Owners, metrics, timeline. No fluff\u2014just fixes.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-right\" data-step=\"4\" data-emoji=\"\ud83e\udde9\">\n          <div class=\"badge\">4<\/div>\n          <h3>Signal Repair (Coding)<\/h3>\n          <p>GA4\/CAPI value &#038; dedupe, schema, clean events.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-left\" data-step=\"5\" data-emoji=\"\ud83d\udee1\ufe0f\">\n          <div class=\"badge\">5<\/div>\n          <h3>PDP Proof Upgrade<\/h3>\n          <p>Headline\/benefits\/reviews; speed &#038; clarity on mobile.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-right\" data-step=\"6\" data-emoji=\"\ud83e\uddea\">\n          <div class=\"badge\">6<\/div>\n          <h3>Experiment Sprint (2 weeks)<\/h3>\n          <p>Meta + Google tests: hooks, audiences, landing continuity.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-left\" data-step=\"7\" data-emoji=\"\ud83d\ude80\">\n          <div class=\"badge\">7<\/div>\n          <h3>Scale &#038; Optimize<\/h3>\n          <p>Reallocate budgets; PMAX learning; CPA guardrails.<\/p>\n        <\/li>\n\n        <li class=\"rfv2-step side-right\" data-step=\"8\" data-emoji=\"\ud83d\udd01\">\n          <div class=\"badge\">8<\/div>\n          <h3>Review &#038; Iterate<\/h3>\n          <p>Dashboards, learnings, next sprint. Compounding ROAS.<\/p>\n        <\/li>\n      <\/ol>\n    <\/div>\n\n    <!-- CTA -->\n    <div class=\"rfv2__cta\">\n      <a href=\"#auditForm\" class=\"rf-btn-primary rfv2__cta-btn\">\n        <span class=\"btn-emoji\">\u26a1<\/span> <b>Run ROASForge Scan \u2014 FREE<\/b>\n        <span class=\"btn-wave\" aria-hidden=\"true\"><\/span>\n      <\/a>\n      <span class=\"rfv2__note\">Your scan powers our <b>done-for-you<\/b> engineering &#038; media work.<\/span>\n    <\/div>\n  <\/div>\n<\/section>\n\n<style>\n\/* Container *\/\n.rf-flow--v2{\n  position:relative; overflow:hidden;\n  background:\n    radial-gradient(900px 520px at -10% -10%, rgba(37,99,235,.08), transparent 60%),\n    radial-gradient(700px 460px at 110% 10%, rgba(14,165,233,.08), transparent 60%),\n    linear-gradient(180deg,#ffffff 0%,#fbfdff 100%);\n  border-top:1px solid #e7ecf3;\n}\n.rfv2__inner{ max-width:1100px; margin:0 auto; padding:40px 16px 36px }\n\n\/* Heading *\/\n.rfv2__head{ text-align:center; margin-bottom:10px }\n.rfv2__title{\n  margin:0 0 8px; font-size:28px; color:#0f172a; letter-spacing:.2px; font-weight:900;\n}\n.rfv2__spark{\n  background:linear-gradient(90deg,#22d3ee,#2563eb,#9bb8ff);\n  -webkit-background-clip:text; background-clip:text; color:transparent;\n  position:relative;\n}\n.rfv2__spark::after{\n  content:\"\"; position:absolute; left:0; right:0; bottom:-6px; height:3px; border-radius:999px;\n  background:linear-gradient(90deg,#22d3ee,#2563eb,#9bb8ff);\n  opacity:.25; filter:blur(0.5px);\n}\n.rfv2__sub{ margin:0; color:#475569; max-width:820px; margin-inline:auto }\n\n\/* Orbs *\/\n.rfv2__orbs{ position:absolute; inset:0; pointer-events:none }\n.orb{ position:absolute; width:260px; height:260px; border-radius:50%;\n  background:radial-gradient(circle at 30% 30%, rgba(34,211,238,.30), transparent 60%),\n             radial-gradient(circle at 70% 70%, rgba(37,99,235,.25), transparent 70%);\n  filter:blur(18px); opacity:.5; animation:float 14s ease-in-out infinite;\n}\n.orb-a{ top:-80px; left:-60px }\n.orb-b{ bottom:-60px; right:-80px; animation-delay:3s }\n.orb-c{ top:40%; left:50%; width:200px; height:200px; transform:translateX(-50%); animation-delay:6s }\n@keyframes float{\n  0%,100%{ transform:translateY(0) }\n  50%{ transform:translateY(18px) }\n}\n\n\/* Stage *\/\n.rfv2__stage{ position:relative; margin-top:22px }\n.rfv2__svg{\n  position:absolute; inset:0 0 0 0; width:100%; height:100%;\n  display:block; overflow:visible;\n}\n.rfv2__rail{\n  stroke-linecap:round; stroke-linejoin:round;\n  stroke-dasharray:12 10; animation:dashshift 10s linear infinite;\n  opacity:.9;\n}\n@keyframes dashshift{\n  to { stroke-dashoffset:-600 }\n}\n.rfv2__runner{ animation:runner 8s ease-in-out infinite }\n@keyframes runner{\n  0%{ opacity:0 }\n  5%{ opacity:1 }\n  50%{ opacity:1 }\n  95%{ opacity:1 }\n  100%{ opacity:0 }\n}\n\n\/* Steps *\/\n.rfv2__steps{\n  list-style:none; margin:0; padding:0;\n  display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:28px 24px;\n}\n@media (max-width:900px){ .rfv2__steps{ grid-template-columns:1fr } }\n\n.rfv2-step{\n  position:relative; background:linear-gradient(180deg,#fbfdff,#f7faff);\n  border:1px solid #e6edf7; border-radius:18px; padding:16px 16px 16px 18px;\n  box-shadow:0 10px 26px rgba(15,23,42,.06);\n  transform:translateY(12px) scale(.98); opacity:0;\n  transition:transform .45s cubic-bezier(.2,.8,.2,1), opacity .45s ease, box-shadow .2s ease;\n  will-change:transform, opacity;\n}\n.rfv2-step:hover{\n  transform:translateY(2px) scale(1);\n  box-shadow:0 18px 38px rgba(15,23,42,.08), 0 3px 10px rgba(0,0,0,.06);\n}\n.rfv2-step.show{ opacity:1; transform:translateY(0) scale(1) }\n.rfv2-step.side-left{ margin-right:48px }\n.rfv2-step.side-right{ margin-left:48px }\n@media (max-width:900px){ .rfv2-step.side-left, .rfv2-step.side-right{ margin:0 } }\n\n.rfv2-step::before{\n  \/* playful emoji coin *\/\n  content:attr(data-emoji);\n  position:absolute; right:14px; top:-14px;\n  font-size:20px; line-height:1; transform:rotate(-6deg);\n  filter:drop-shadow(0 6px 10px rgba(0,0,0,.12));\n}\n.rfv2-step::after{\n  \/* connector nub (target for SVG) *\/\n  content:\"\"; position:absolute; top:24px; width:14px; height:14px;\n  border-radius:50%; background:#fff; border:3px solid #2563eb; box-shadow:0 0 16px rgba(37,99,235,.35);\n}\n.rfv2-step.side-left::after{ right:-56px }\n.rfv2-step.side-right::after{ left:-56px }\n@media (max-width:900px){ .rfv2-step::after{ display:none } }\n\n.rfv2-step .badge{\n  display:inline-grid; place-items:center;\n  width:30px; height:30px; border-radius:50%;\n  background:#0047A5; color:#fff; font-weight:900; font-size:14px;\n  box-shadow:0 8px 18px rgba(0,71,165,.28), inset 0 0 0 3px rgba(255,255,255,.18);\n  margin-bottom:8px;\n}\n.rfv2-step h3{ margin:0; font-size:17px; color:#0f172a; letter-spacing:.2px }\n.rfv2-step p{ margin:6px 0 0; color:#475569; font-size:14px }\n\n\/* CTA *\/\n.rfv2__cta{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-top:26px }\n.rfv2__note{ font-size:12px; color:#64748b }\n.rfv2__cta-btn{\n  position:relative; overflow:hidden;\n}\n.rfv2__cta-btn .btn-emoji{ margin-right:6px }\n.rfv2__cta-btn .btn-wave{\n  position:absolute; inset:auto -40% -60% -40%; height:120%;\n  transform:skewY(-8deg);\n  background:linear-gradient(90deg, rgba(255,255,255,.16), rgba(255,255,255,0) 60%);\n  animation:btnwave 2.4s ease-in-out infinite;\n}\n@keyframes btnwave{\n  0%{ transform:translateX(-120%) skewY(-8deg) }\n  55%{ transform:translateX(40%) skewY(-8deg) }\n  100%{ transform:translateX(120%) skewY(-8deg) }\n}\n\n\/* Reuse your primary CTA styling *\/\n.rf-btn-primary{\n  display:inline-block;background:#0047A5;color:#ffffff !important;\n  font-weight:900;font-size:18px;letter-spacing:.3px;\n  padding:16px 28px;border-radius:14px;text-decoration:none !important;border:none;\n  box-shadow:0 8px 24px rgba(0,71,165,.28), 0 2px 6px rgba(0,0,0,.12);\n  transition:transform .18s ease, box-shadow .18s ease, background .18s ease;\n}\n.rf-btn-primary:hover{\n  background:#003C8F;color:#ffffff !important;transform:translateY(-1px);\n  box-shadow:0 10px 28px rgba(0,71,165,.34), 0 4px 10px rgba(0,0,0,.16);\n}\n.rf-btn-primary:active{ transform:translateY(0); }\n<\/style>\n\n<script>\n\/* ROASForge Flow v2 \u2014 animated metro rail + elastic connectors + reveal *\/\n(function(){\n  const section = document.getElementById('roasforge-flow');\n  const svg = section.querySelector('.rfv2__svg');\n  const rail = svg.querySelector('.rfv2__rail');\n  const connectors = svg.querySelector('.rfv2__connectors');\n  const runner = svg.querySelector('.rfv2__runner');\n  const steps = Array.from(section.querySelectorAll('.rfv2-step'));\n\n  \/\/ Build a smooth central \"S\" rail based on container size\n  function getRailPath(){\n    const r = svg.getBoundingClientRect();\n    const w = r.width, h = r.height || section.querySelector('.rfv2__stage').offsetHeight;\n\n    const x1 = w*0.50, y1 = 24;\n    const x2 = w*0.50, y2 = h - 24;\n    \/\/ Bezier wiggle left-right for playfulness\n    const c1x = w*0.15, c1y = h*0.25;\n    const c2x = w*0.85, c2y = h*0.50;\n    const c3x = w*0.20, c3y = h*0.75;\n\n    \/\/ Two cubic segments for a soft serpentine\n    const d = [\n      `M ${x1} ${y1}`,\n      `C ${x1} ${h*0.12}, ${c1x} ${c1y}, ${w*0.50} ${h*0.38}`,\n      `S ${c2x} ${c2y}, ${w*0.50} ${h*0.66}`,\n      `S ${c3x} ${c3y}, ${x2} ${y2}`\n    ].join(' ');\n    return d;\n  }\n\n  \/\/ Utility: get absolute position of the step's nub for connector\n  function nubPointFor(step){\n    const nub = window.getComputedStyle(step, '::after');\n    \/\/ Compute nub center by reading the card rect + offset of pseudo\n    const rect = step.getBoundingClientRect();\n    const svgRect = svg.getBoundingClientRect();\n\n    const sideRight = step.classList.contains('side-right');\n    const nubTop = rect.top + 24; \/\/ from CSS top:24px\n    const nubLeft = sideRight ? (rect.left - 56 + 7) : (rect.right + 56 - 7); \/\/ 14px nub, center offset ~7\n\n    return { x: nubLeft - svgRect.left, y: nubTop - svgRect.top };\n  }\n\n  \/\/ Draw connectors from rail to each step nub (curved, animated stroke)\n  function drawConnectors(){\n    connectors.innerHTML = '';\n    const railPath = rail.getAttribute('d');\n    if (!railPath) return;\n    const railLen = rail.getTotalLength ? rail.getTotalLength() : 0;\n\n    steps.forEach((step, i)=>{\n      const p = nubPointFor(step);\n\n      \/\/ pick a point on the rail nearby (distribute along length)\n      const t = railLen ? ( (i+1) \/ (steps.length+1) ) * railLen : 0;\n      const railPoint = rail.getPointAtLength ? rail.getPointAtLength(t) : {x: svg.clientWidth\/2, y: (i+1)*80};\n\n      \/\/ control point for curve (midpoint pulled slightly)\n      const midx = (railPoint.x + p.x)\/2;\n      const midy = (railPoint.y + p.y)\/2 + (step.classList.contains('side-right') ? -24 : 24);\n\n      const path = document.createElementNS('http:\/\/www.w3.org\/2000\/svg','path');\n      path.setAttribute('d', `M ${railPoint.x} ${railPoint.y} Q ${midx} ${midy} ${p.x} ${p.y}`);\n      path.style.opacity = '0';\n      path.style.strokeDasharray = '6 10';\n      path.style.animation = `dashshift 10s linear infinite, fadein .6s ease forwards`;\n      path.style.animationDelay = `${i*90}ms`;\n      connectors.appendChild(path);\n\n      \/\/ small glowing node on rail\n      const node = document.createElementNS('http:\/\/www.w3.org\/2000\/svg','circle');\n      node.setAttribute('cx', railPoint.x);\n      node.setAttribute('cy', railPoint.y);\n      node.setAttribute('r', '4');\n      node.setAttribute('fill', '#ffffff');\n      node.setAttribute('stroke', '#2563eb');\n      node.setAttribute('stroke-width', '3');\n      node.style.filter = 'url(#rfv2-glow)';\n      node.style.opacity = '0';\n      node.style.animation = `pop .45s ease forwards`;\n      node.style.animationDelay = `${i*90+150}ms`;\n      connectors.appendChild(node);\n    });\n  }\n\n  \/\/ Runner moves along the rail for a \"packet\" vibe\n  function animateRunner(){\n    if (!rail.getTotalLength) return;\n    const L = rail.getTotalLength();\n    let start;\n    function frame(t){\n      if (start===undefined) start = t;\n      const prog = ((t - start) % 8000)\/8000; \/\/ 8s\n      const pt = rail.getPointAtLength(L*prog);\n      runner.setAttribute('cx', pt.x);\n      runner.setAttribute('cy', pt.y);\n      requestAnimationFrame(frame);\n    }\n    requestAnimationFrame(frame);\n  }\n\n  \/\/ Reveal steps on view (staggered)\n  function reveal(){\n    if (!('IntersectionObserver' in window)){\n      steps.forEach(s=>s.classList.add('show')); return;\n    }\n    const io = new IntersectionObserver((entries)=>{\n      entries.forEach(entry=>{\n        if(entry.isIntersecting){\n          const i = steps.indexOf(entry.target);\n          entry.target.style.transitionDelay = (i*90) + 'ms';\n          entry.target.classList.add('show');\n          io.unobserve(entry.target);\n        }\n      });\n    }, { threshold:.15 });\n    steps.forEach(s=>io.observe(s));\n  }\n\n  \/\/ Resize\/reflow\n  function layout(){\n    rail.setAttribute('d', getRailPath());\n    drawConnectors();\n  }\n\n  \/\/ Smooth scroll CTA\n  const cta = section.querySelector('.rfv2__cta .rf-btn-primary');\n  if (cta){\n    cta.addEventListener('click', function(e){\n      const tgt = document.querySelector(this.getAttribute('href'));\n      if(!tgt) return;\n      e.preventDefault();\n      const rect = tgt.getBoundingClientRect();\n      const y = window.pageYOffset + rect.top - 100;\n      window.scrollTo({ top: Math.max(0,y), behavior:'smooth' });\n    });\n  }\n\n  \/\/ Anim helpers\n  const style = document.createElement('style');\n  style.textContent = `\n    @keyframes fadein{ to{ opacity:1 } }\n    @keyframes pop{ 0%{ transform:scale(.6); opacity:0 } 100%{ transform:scale(1); opacity:1 } }\n  `;\n  document.head.appendChild(style);\n\n  \/\/ Init\n  reveal();\n  layout();\n  animateRunner();\n\n  \/\/ Reflow on resize\/orientation\/content changes\n  let ro;\n  if ('ResizeObserver' in window){\n    ro = new ResizeObserver(()=>layout());\n    ro.observe(section.querySelector('.rfv2__stage'));\n    steps.forEach(s=>ro.observe(s));\n  } else {\n    window.addEventListener('resize', ()=>layout());\n  }\n\n  \/\/ Tiny parallax on mouse move (subtle, playful)\n  section.addEventListener('mousemove', (e)=>{\n    const rect = section.getBoundingClientRect();\n    const dx = (e.clientX - rect.left)\/rect.width - .5;\n    const dy = (e.clientY - rect.top)\/rect.height - .5;\n    section.style.setProperty('--parx', (dx*6).toFixed(2)+'px');\n    section.style.setProperty('--pary', (dy*6).toFixed(2)+'px');\n    svg.style.transform = `translate(var(--parx,0), var(--pary,0))`;\n  });\n})();\n<\/script>\n\n\n","protected":false},"excerpt":{"rendered":"<p>ROASForge\u2122 \u2014 AI ROAS Engine \u2022 FREE Surface Scan Unlock hidden revenue in 60 seconds \u2014 paste your store URL to run our AI scan (FREE) ROASForge pinpoints the biggest purchase blockers fast. Our team implements these fixes with AI, algorithms, and code to lift ROAS for e-commerce brands. Store URL Please enter a valid [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"class_list":["post-1720","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Free E-commerce Store Audit - ROASForge\u2122 Scan - Fab Digital<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Free E-commerce Store Audit - ROASForge\u2122 Scan - Fab Digital\" \/>\n<meta property=\"og:description\" content=\"ROASForge\u2122 \u2014 AI ROAS Engine \u2022 FREE Surface Scan Unlock hidden revenue in 60 seconds \u2014 paste your store URL to run our AI scan (FREE) ROASForge pinpoints the biggest purchase blockers fast. Our team implements these fixes with AI, algorithms, and code to lift ROAS for e-commerce brands. Store URL Please enter a valid [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/\" \/>\n<meta property=\"og:site_name\" content=\"Fab Digital\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-14T14:34:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/\",\"url\":\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/\",\"name\":\"Free E-commerce Store Audit - ROASForge\u2122 Scan - Fab Digital\",\"isPartOf\":{\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/#website\"},\"datePublished\":\"2025-10-08T10:31:37+00:00\",\"dateModified\":\"2025-10-14T14:34:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.fabdigital.io\/marketing\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free E-commerce Store Audit &#8211; ROASForge\u2122 Scan\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/#website\",\"url\":\"https:\/\/www.fabdigital.io\/marketing\/\",\"name\":\"Fab Digital\",\"description\":\"Marketing Agency\",\"publisher\":{\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.fabdigital.io\/marketing\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/#organization\",\"name\":\"Fab Digital\",\"url\":\"https:\/\/www.fabdigital.io\/marketing\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.fabdigital.io\/marketing\/wp-content\/uploads\/2024\/01\/Logo.png\",\"contentUrl\":\"https:\/\/www.fabdigital.io\/marketing\/wp-content\/uploads\/2024\/01\/Logo.png\",\"width\":524,\"height\":389,\"caption\":\"Fab Digital\"},\"image\":{\"@id\":\"https:\/\/www.fabdigital.io\/marketing\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Free E-commerce Store Audit - ROASForge\u2122 Scan - Fab Digital","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/","og_locale":"en_US","og_type":"article","og_title":"Free E-commerce Store Audit - ROASForge\u2122 Scan - Fab Digital","og_description":"ROASForge\u2122 \u2014 AI ROAS Engine \u2022 FREE Surface Scan Unlock hidden revenue in 60 seconds \u2014 paste your store URL to run our AI scan (FREE) ROASForge pinpoints the biggest purchase blockers fast. Our team implements these fixes with AI, algorithms, and code to lift ROAS for e-commerce brands. Store URL Please enter a valid [&hellip;]","og_url":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/","og_site_name":"Fab Digital","article_modified_time":"2025-10-14T14:34:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/","url":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/","name":"Free E-commerce Store Audit - ROASForge\u2122 Scan - Fab Digital","isPartOf":{"@id":"https:\/\/www.fabdigital.io\/marketing\/#website"},"datePublished":"2025-10-08T10:31:37+00:00","dateModified":"2025-10-14T14:34:39+00:00","breadcrumb":{"@id":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.fabdigital.io\/marketing\/roas-forge-scan-free\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fabdigital.io\/marketing\/"},{"@type":"ListItem","position":2,"name":"Free E-commerce Store Audit &#8211; ROASForge\u2122 Scan"}]},{"@type":"WebSite","@id":"https:\/\/www.fabdigital.io\/marketing\/#website","url":"https:\/\/www.fabdigital.io\/marketing\/","name":"Fab Digital","description":"Marketing Agency","publisher":{"@id":"https:\/\/www.fabdigital.io\/marketing\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fabdigital.io\/marketing\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.fabdigital.io\/marketing\/#organization","name":"Fab Digital","url":"https:\/\/www.fabdigital.io\/marketing\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fabdigital.io\/marketing\/#\/schema\/logo\/image\/","url":"https:\/\/www.fabdigital.io\/marketing\/wp-content\/uploads\/2024\/01\/Logo.png","contentUrl":"https:\/\/www.fabdigital.io\/marketing\/wp-content\/uploads\/2024\/01\/Logo.png","width":524,"height":389,"caption":"Fab Digital"},"image":{"@id":"https:\/\/www.fabdigital.io\/marketing\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/pages\/1720","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/comments?post=1720"}],"version-history":[{"count":63,"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/pages\/1720\/revisions"}],"predecessor-version":[{"id":1911,"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/pages\/1720\/revisions\/1911"}],"wp:attachment":[{"href":"https:\/\/www.fabdigital.io\/marketing\/wp-json\/wp\/v2\/media?parent=1720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}