.bcs{width:100%;background:#ffffff;overflow:hidden;font-family:'DM Sans',system-ui,sans-serif;color:#1B1B2F;-webkit-font-smoothing:antialiased} .bcs,.bcs *{box-sizing:border-box} .bcs a{color:inherit;text-decoration:none} .bcs ::selection{background:#FFC4DA;color:#1B1B2F} .bcs [hidden]{display:none!important} .bcs section h1,.bcs section h2,.bcs section h3{color:inherit} .bcs button{text-transform:none;letter-spacing:normal} .bcs .btn{display:inline-flex;align-items:center;gap:10px;min-height:52px;padding:0 28px;border:3px solid #1B1B2F;border-radius:999px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;box-shadow:4px 4px 0 #1B1B2F;cursor:pointer;transition:transform .15s ease,box-shadow .15s ease} .bcs .btn:hover{transform:translate(-2px,-2px);box-shadow:6px 6px 0 #1B1B2F} .bcs .btn:active{transform:translate(3px,3px);box-shadow:1px 1px 0 #1B1B2F} .bcs .tile{transition:transform .2s ease} .bcs .tile:hover{transform:rotate(0deg) translateY(-6px)!important} .bcs .sticker{position:absolute;border:3px solid #1B1B2F;box-shadow:4px 4px 0 #1B1B2F;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;white-space:nowrap} .bcs .field{width:100%;min-height:52px;padding:12px 16px;border:3px solid #1B1B2F;border-radius:14px;background:#fff;font:500 17px 'DM Sans',sans-serif;color:#1B1B2F} .bcs .field:focus{outline:4px solid #B8EBD0;outline-offset:0} .bcs .chip{min-height:44px;padding:0 18px;border:3px solid #1B1B2F;border-radius:999px;background:#3432c7;color:#ffffff;font:700 16px 'DM Sans',sans-serif;cursor:pointer;transition:transform .15s ease} .bcs .chip:hover{transform:translateY(-2px)} .bcs .chip[aria-pressed="true"]{background:#B8EBD0;color:#1B1B2F} .bcs .marquee{display:flex;width:max-content;animation:bcs-slide 60s linear infinite} @keyframes bcs-slide{from{transform:translateX(0)}to{transform:translateX(-50%)}} .bcs .bus{position:absolute;bottom:20px;left:-220px;animation:bcs-drive 16s linear infinite} @keyframes bcs-drive{from{left:-220px}to{left:100%}} @media (prefers-reduced-motion:reduce){.bcs .marquee{animation:none}.bcs .bus{animation:none;left:8%}.bcs .tile,.bcs .btn,.bcs .chip{transition:none}} .bcs .ar-wrap{max-width:1180px;margin:0 auto} .bcs .ar-hero{background:#B8EBD0;padding:clamp(40px,6vw,88px) clamp(20px,5vw,80px) clamp(56px,7vw,96px);border-bottom:3px solid #1B1B2F} .bcs .ar-herogrid{display:flex;flex-wrap:wrap;gap:48px;align-items:center} .bcs .ar-herotext{flex:1 1 460px;min-width:0} .bcs .ar-pill{display:inline-block;padding:8px 18px;border:3px solid #1B1B2F;border-radius:999px;background:#fff;font-weight:700;font-size:15px;transform:rotate(-2deg)} .bcs .ar-hero h1{margin:26px 0 0;font:800 clamp(40px,6vw,76px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.035em;color:#1B1B2F} .bcs .ar-und{background:linear-gradient(transparent 62%,#FF7A3D 62%,#FF7A3D 90%,transparent 90%)} .bcs .ar-lead{margin:26px 0 0;max-width:560px;font-size:clamp(18px,2vw,21px);line-height:1.5;font-weight:500} .bcs .ar-bullets{margin:24px 0 0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:10px} .bcs .ar-bullets li{padding:7px 14px;border:3px solid #1B1B2F;border-radius:999px;background:#fff;font-weight:700;font-size:15px} .bcs .ar-card{flex:1 1 400px;min-width:0;max-width:520px;background:#fff;border:3px solid #1B1B2F;border-radius:24px;box-shadow:8px 8px 0 #1B1B2F;padding:clamp(20px,3.5vw,32px);transform:rotate(1deg)} .bcs .ar-field{margin-bottom:16px} .bcs .ar-field label{display:block;margin-bottom:7px;font-weight:700;font-size:16px} .bcs .ar-go{width:100%;justify-content:center;margin-top:4px;background:#FF7A3D;color:#1B1B2F} .bcs .ar-err{margin:0 0 14px;padding:12px 16px;background:#FFC4DA;border:3px solid #1B1B2F;border-radius:14px;font-weight:600;font-size:15px;line-height:1.45} .bcs .ar-ph{font-size:18px;margin-bottom:14px} .bcs .ar-steps{margin:0;padding:0;list-style:none} .bcs .ar-steps li{display:flex;align-items:center;gap:12px;padding:9px 0;font-weight:500;font-size:17px;color:#7b7b8e;transition:color .2s} .bcs .ar-steps li i{flex:none;width:28px;height:28px;border:3px solid #1B1B2F;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;font:800 14px 'Bricolage Grotesque',sans-serif;font-style:normal;color:#1B1B2F} .bcs .ar-steps li.on{color:#1B1B2F;font-weight:700} .bcs .ar-steps li.on i{border-top-color:#2A3BDB;animation:ar-spin .8s linear infinite} .bcs .ar-steps li.done{color:#1B1B2F} .bcs .ar-steps li.done i{background:#B8EBD0} .bcs .ar-bar{margin-top:14px;height:16px;border:3px solid #1B1B2F;border-radius:999px;background:#fff;overflow:hidden} .bcs .ar-bar i{display:block;height:100%;width:4%;background:#2A3BDB;transition:width .6s ease} @keyframes ar-spin{to{transform:rotate(360deg)}} .bcs .ar-res{background:#fff;padding:clamp(56px,7vw,96px) clamp(20px,5vw,80px);border-bottom:3px solid #1B1B2F} .bcs .ar-kick{display:inline-block;font:600 40px 'Caveat',cursive;color:#2A3BDB;transform:rotate(-2deg)} .bcs .ar-kickw{color:#B8EBD0} .bcs .ar-top{margin-top:8px;display:flex;flex-wrap:wrap;align-items:center;gap:36px} .bcs .ar-stamp{flex:none;width:170px;height:170px;border:5px solid #1B1B2F;border-radius:50%;box-shadow:8px 8px 0 #1B1B2F;display:flex;align-items:center;justify-content:center;background:#B8EBD0;transform:rotate(-6deg)} .bcs .ar-stamp span{font:800 110px/1 'Bricolage Grotesque',sans-serif;color:#1B1B2F} .bcs .ar-stamp.g-c{background:#DDE3FF}.bcs .ar-stamp.g-d{background:#FFA46B}.bcs .ar-stamp.g-f{background:#FFC4DA} .bcs .ar-topinfo{flex:1 1 320px;min-width:0} .bcs .ar-topinfo h2{margin:0;font:800 clamp(34px,4.6vw,56px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.03em;color:#1B1B2F} .bcs .ar-score{margin:12px 0 0;font-size:20px;line-height:1.4;word-break:break-word} .bcs .ar-score b{font:800 30px 'Bricolage Grotesque',sans-serif} .bcs .ar-counts{margin:10px 0 0;font-weight:700;font-size:16px} .bcs .ar-note{margin:14px 0 0;padding:12px 16px;background:#FFC4DA;border:3px solid #1B1B2F;border-radius:14px;font-weight:600;font-size:15px;line-height:1.45} .bcs .ar-cats{margin-top:40px;display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:22px} .bcs .ar-cat{border:3px solid #1B1B2F;border-radius:16px;box-shadow:4px 4px 0 #1B1B2F;padding:20px 14px;text-align:center} .bcs .ar-cat:nth-child(1){background:#fff;transform:rotate(-1.5deg)}.bcs .ar-cat:nth-child(2){background:#DDE3FF;transform:rotate(1.2deg)}.bcs .ar-cat:nth-child(3){background:#FFC4DA;transform:rotate(-1deg)}.bcs .ar-cat:nth-child(4){background:#B8EBD0;transform:rotate(1.4deg)} .bcs .ar-ring{position:relative;width:96px;height:96px;margin:0 auto 10px} .bcs .ar-ring svg{width:100%;height:100%;transform:rotate(-90deg)} .bcs .ar-rbg{fill:none;stroke:rgba(27,27,47,.15);stroke-width:3.5} .bcs .ar-rfill{fill:none;stroke-width:3.5;stroke-linecap:round;transition:stroke-dasharray 1s cubic-bezier(.4,0,.2,1)} .bcs .ar-rnum{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font:800 28px 'Bricolage Grotesque',sans-serif} .bcs .ar-s-g{stroke:#0cce6b}.bcs .ar-s-o{stroke:#ffa400}.bcs .ar-s-r{stroke:#ff4e42} .bcs .ar-cat h4{margin:0;font:800 19px 'Bricolage Grotesque',sans-serif;color:#1B1B2F} .bcs .ar-cat p{margin:6px 0 0;font-weight:700;font-size:14px} .bcs .ar-h3{margin:44px 0 0;font:800 clamp(26px,3vw,34px)/1.1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F} .bcs .ar-fixes{margin:18px 0 0;padding:0;list-style:none;display:grid;gap:14px} .bcs .ar-fixes li{display:flex;gap:14px;align-items:center;padding:14px 18px;background:#fff;border:3px solid #1B1B2F;border-radius:16px;box-shadow:4px 4px 0 #1B1B2F;font-weight:700;font-size:18px;line-height:1.3} .bcs .ar-n{flex:none;width:38px;height:38px;border-radius:50%;background:#1B1B2F;color:#fff;display:flex;align-items:center;justify-content:center;font:800 20px 'Bricolage Grotesque',sans-serif} .bcs .ar-imp{margin-left:auto;flex:none;padding:3px 12px;border:2px solid #1B1B2F;border-radius:999px;font-size:13px;background:#FFC4DA} .bcs .ar-imp.High{background:#FF7A3D}.bcs .ar-imp.Low{background:#B8EBD0} .bcs .ar-gate{margin-top:40px;background:#DDE3FF;border:3px solid #1B1B2F;border-radius:24px;box-shadow:8px 8px 0 #1B1B2F;padding:clamp(22px,4vw,40px);text-align:center} .bcs .ar-lock{font-size:38px} .bcs .ar-gate h3{margin:6px 0 0;font:800 clamp(28px,3.4vw,40px)/1.05 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F} .bcs .ar-gate p{margin:14px auto 0;max-width:640px;font-size:18px;line-height:1.5} .bcs .ar-leadrow{margin:24px auto 0;max-width:780px;display:flex;flex-wrap:wrap;gap:12px;justify-content:center} .bcs .ar-leadrow input{flex:1 1 180px;min-width:0} .bcs .ar-leadrow input[type=email]{flex:2 1 260px} .bcs .ar-unlock{background:#FF7A3D;color:#1B1B2F;justify-content:center} .bcs .ar-gate .ar-err{max-width:780px;margin:14px auto 0;text-align:left} .bcs .ar-gate .ar-fine{margin-top:12px;font-size:14px;font-weight:500} .bcs .ar-btn:disabled,.bcs .btn:disabled{opacity:.6;cursor:wait} .bcs .ar-sumbox{margin-top:40px;padding:24px;background:#E6F6EE;border:3px solid #1B1B2F;border-radius:20px;font-size:19px;line-height:1.55} .bcs .ar-sumbox b{display:block;margin-bottom:6px;font:800 22px 'Bricolage Grotesque',sans-serif} .bcs .ar-copy{margin-top:18px;display:grid;gap:12px} .bcs .ar-copyrow{padding:14px 16px;background:#fff;border:3px solid #1B1B2F;border-radius:14px} .bcs .ar-copyrow small{display:block;font-weight:700;font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:#2A3BDB} .bcs .ar-copyrow span{display:block;margin-top:4px;font-size:17px;line-height:1.4;word-break:break-word} .bcs .ar-copyrow button{margin-top:8px;padding:5px 14px;border:2px solid #1B1B2F;border-radius:999px;background:#FFC4DA;font:700 14px 'DM Sans',sans-serif;cursor:pointer;color:#1B1B2F} .bcs .ar-grp{margin-top:36px} .bcs .ar-grp>h4{margin:0 0 14px;font:800 26px 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F} .bcs .ar-chk{margin-bottom:14px;padding:16px 18px;background:#fff;border:3px solid #1B1B2F;border-radius:16px;display:flex;gap:14px} .bcs .ar-ic{flex:none;width:34px;height:34px;border:3px solid #1B1B2F;border-radius:50%;display:flex;align-items:center;justify-content:center;font:800 17px 'Bricolage Grotesque',sans-serif;color:#1B1B2F} .bcs .ar-ic.pass{background:#B8EBD0}.bcs .ar-ic.partial{background:#FFC9A3}.bcs .ar-ic.fail{background:#FFC4DA} .bcs .ar-cb{min-width:0;flex:1} .bcs .ar-cb h5{margin:0;font:800 18px/1.25 'Bricolage Grotesque',sans-serif;color:#1B1B2F} .bcs .ar-cb .d{margin:6px 0 0;font-size:16px;line-height:1.45;word-break:break-word} .bcs .ar-cb .w{margin:8px 0 0;font-size:15px;line-height:1.45;color:#4a4a5e} .bcs .ar-cb .f{margin:10px 0 0;padding:10px 14px;background:#FFF0E8;border-left:6px solid #FF7A3D;border-radius:6px;font-size:16px;line-height:1.45} .bcs .ar-cb .f b{font-weight:800} .bcs .ar-tools{margin-top:30px;display:flex;flex-wrap:wrap;gap:14px} .bcs .ar-upsell{margin-top:44px;display:flex;flex-wrap:wrap;gap:24px;align-items:center;justify-content:space-between;background:#FFC4DA;border:3px solid #1B1B2F;border-radius:24px;box-shadow:8px 8px 0 #1B1B2F;padding:clamp(22px,4vw,36px)} .bcs .ar-upl{flex:1 1 380px;min-width:0} .bcs .ar-kick2{font:600 32px 'Caveat',cursive;color:#2A3BDB} .bcs .ar-upsell h3{margin:0;font:800 clamp(26px,3vw,36px)/1.05 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F} .bcs .ar-upsell p{margin:10px 0 0;font-size:18px;line-height:1.5;max-width:560px} .bcs .ar-upr{display:flex;flex-direction:column;gap:14px} .bcs .ar-upr .btn{justify-content:center} .bcs .ar-again{margin-top:36px;display:block;background:none;border:0;padding:0;font:700 17px 'DM Sans',sans-serif;color:#2A3BDB;text-decoration:underline;cursor:pointer} .bcs .ar-how{background:#2A3BDB;color:#fff;padding:clamp(56px,7vw,96px) clamp(20px,5vw,80px);border-bottom:3px solid #1B1B2F} .bcs .ar-how h2{margin:6px 0 0;font:800 clamp(34px,4.6vw,56px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.03em;color:#fff} .bcs .ar-sub{margin:18px 0 0;max-width:680px;font-size:19px;line-height:1.55;color:#fff} .bcs .ar-how4{margin-top:40px;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:24px} .bcs .ar-hc{position:relative;border:3px solid #1B1B2F;border-radius:20px;box-shadow:6px 6px 0 #1B1B2F;padding:28px 22px 24px;color:#1B1B2F} .bcs .ar-hc h3{margin:12px 0 0;font:800 24px/1.1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F} .bcs .ar-hc p{margin:10px 0 0;font-size:17px;line-height:1.45;font-weight:500} .bcs .ar-pts{display:inline-block;padding:3px 12px;border:2px solid #1B1B2F;border-radius:999px;background:#fff;font-weight:700;font-size:14px} .bcs .ar-h1c{background:#DDE3FF;transform:rotate(-1.2deg)}.bcs .ar-h2c{background:#FFC4DA;transform:rotate(1deg)}.bcs .ar-h3c{background:#B8EBD0;transform:rotate(-0.8deg)}.bcs .ar-h4c{background:#fff;transform:rotate(1.3deg)} .bcs .ar-cta{background:#FF7A3D;padding:clamp(56px,7vw,96px) clamp(20px,5vw,80px);text-align:center} .bcs .ar-cta h2{margin:0;font:800 clamp(34px,4.6vw,56px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.03em;color:#1B1B2F} .bcs .ar-cta p{margin:18px auto 28px;max-width:620px;font-size:20px;line-height:1.5;color:#1B1B2F} @media (max-width:600px){.bcs .ar-card{transform:none}.bcs .ar-stamp{width:140px;height:140px}.bcs .ar-stamp span{font-size:88px}.bcs .ar-fixes li{flex-wrap:wrap}.bcs .ar-imp{margin-left:52px}.bcs .ar-leadrow .btn{width:100%}} @media (prefers-reduced-motion:reduce){.bcs .ar-steps li.on i{animation:none}.bcs .ar-rfill,.bcs .ar-bar i{transition:none}} .bcs .ar-hero ::selection,.bcs .ar-res ::selection,.bcs .ar-how ::selection,.bcs .ar-cta ::selection{background:#FFC4DA;color:#1B1B2F} .bcs .ar-hero .field:focus,.bcs .ar-gate .field:focus{outline:4px solid #2A3BDB;outline-offset:0}
Free AI Readiness Check

Can AI find and recommend your business?

These days, people ask ChatGPT, Gemini, Claude, and the others who to do business with. Enter your website and see if AI can find and understand you.

  • Takes about a minute
  • See your grade with no sign-up
  • Plain-English fixes, not jargon
how we grade

20 checks across 4 areas

Every check is pass, partly there or missing. Each carries points that add up to 100. A is 90+, B is 80+, C is 70+, D is 60+.

30 pts

Discoverability

Page title, meta description, main headline, your city and whether AI crawlers are allowed in.

25 pts

Clarity

Are your services, promise and service area stated plainly? An AI model reads your page the way a stranger would.

25 pts

Machine readability

Structured data (schema), sitemap, social tags and clean page foundations.

20 pts

Trust

Visible name, address and phone, contact options, reviews, credentials and a secure site.

Not sure what your score means?

I help entrepreneurs and local businesses turn a scan like this into a simple marketing plan that people and AI can both act on.

Come say hi
(function () { /* ====== SETTINGS: edit only this block ====== */ var API_BASE = ''; // Your deployed scanner, no trailing slash. Example: 'https://ai-readiness-api.vercel.app' var PAYMENT_URL = ''; // Stripe Payment Link for the Roadmap. Leave '' to send people to email instead. var CONTACT_EMAIL = 'Edgar@conex360.com'; var HOME_CONTACT_URL = '/#hello'; // Where "Come say hi" goes /* ============================================ */ var $ = function (id) { return document.getElementById(id); }; var root = document.querySelector('.bcs'); if (!$('air-form')) return; function h(tag, cls, text) { var e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; } function safeText(v) { return String(v == null ? '' : v); } var STEPS = ['Reading your homepage', 'Checking if AI crawlers can get in', 'Looking for structured data (schema)', 'Asking AI how clearly you explain yourself', 'Checking trust signals', 'Working out your grade']; var timer = null, lastScan = null; function showErr(el, msg) { el.textContent = msg; el.hidden = false; } $('air-cta').href = HOME_CONTACT_URL; $('air-call').href = 'mailto:' + CONTACT_EMAIL + '?subject=' + encodeURIComponent('AI Readiness help'); $('air-pay').href = PAYMENT_URL || ('mailto:' + CONTACT_EMAIL + '?subject=' + encodeURIComponent('30-Day AI Readiness Roadmap')); function startProgress(site) { $('air-scanning').textContent = site; var ol = $('air-steps'); ol.textContent = ''; STEPS.forEach(function (s) { var li = h('li'); li.appendChild(h('i', '', '')); li.appendChild(h('span', '', s)); ol.appendChild(li); }); $('air-form').hidden = true; $('air-progress').hidden = false; var i = 0, items = ol.children; function tick() { for (var k = 0; k < items.length; k++) { items[k].className = k < i ? 'done' : k === i ? 'on' : ''; items[k].firstChild.textContent = k < i ? '✓' : ''; } $('air-barfill').style.width = Math.min(94, 6 + i * 16) + '%'; if (i = 90 ? 'ar-s-g' : s >= 70 ? 'ar-s-o' : s >= 50 ? 'ar-s-o' : 'ar-s-r'; } function ringEl(score) { var d = 'M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831', ns = 'http://www.w3.org/2000/svg'; var wrap = h('div', 'ar-ring'), svg = document.createElementNS(ns, 'svg'); svg.setAttribute('viewBox', '0 0 36 36'); svg.setAttribute('aria-hidden', 'true'); var a = document.createElementNS(ns, 'path'); a.setAttribute('class', 'ar-rbg'); a.setAttribute('d', d); var b = document.createElementNS(ns, 'path'); b.setAttribute('class', 'ar-rfill ' + ringColor(score)); b.setAttribute('d', d); b.setAttribute('stroke-dasharray', '0, 100'); svg.appendChild(a); svg.appendChild(b); wrap.appendChild(svg); wrap.appendChild(h('span', 'ar-rnum', score)); setTimeout(function () { b.setAttribute('stroke-dasharray', score + ', 100'); }, 60); return wrap; } function renderResults(d) { lastScan = d; var g = d.overall.grade; $('air-grade').textContent = g; $('air-stamp').className = 'ar-stamp g-' + g.toLowerCase(); $('air-label').textContent = d.overall.label; $('air-score').textContent = d.overall.score; $('air-site').textContent = safeText(d.business.name || d.url); $('air-counts').textContent = d.counts.pass + ' passed, ' + d.counts.partial + ' partly there, ' + d.counts.fail + ' missing'; $('air-capnote').hidden = !d.overall.capped; var cats = $('air-cats'); cats.textContent = ''; d.categories.forEach(function (c) { var card = h('div', 'ar-cat tile'); card.appendChild(ringEl(c.score)); card.appendChild(h('h4', '', c.name)); card.appendChild(h('p', '', c.pass + ' of ' + c.total + ' passed')); cats.appendChild(card); }); var fx = $('air-fixes'); fx.textContent = ''; d.topFixes.forEach(function (f, i) { var li = h('li'); li.appendChild(h('span', 'ar-n', i + 1)); li.appendChild(h('span', '', f.title)); li.appendChild(h('span', 'ar-imp ' + f.impact, f.impact + ' impact')); fx.appendChild(li); }); if (!d.topFixes.length) fx.appendChild(h('li', '', 'Nothing urgent. Nice work!')); $('air-gate').hidden = false; $('air-full').hidden = true; $('air-full').textContent = ''; $('air-upsell').hidden = true; $('air-results').hidden = false; $('air-results').scrollIntoView({ behavior: 'smooth', block: 'start' }); } var ICON = { pass: '✓', partial: '~', fail: '✕' }; function renderFull(full) { var box = $('air-full'); box.textContent = ''; if (full.summary) { var s = h('div', 'ar-sumbox'); s.appendChild(h('b', '', 'How AI would describe you today')); s.appendChild(h('span', '', full.summary)); box.appendChild(s); } if (full.suggestedCopy) { box.appendChild(h('h3', 'ar-h3', 'Copy you can paste in')); var wrap = h('div', 'ar-copy'); [['Page title', full.suggestedCopy.title], ['Meta description', full.suggestedCopy.metaDescription], ['Main headline (H1)', full.suggestedCopy.h1]].forEach(function (r) { if (!r[1]) return; var row = h('div', 'ar-copyrow'); row.appendChild(h('small', '', r[0])); row.appendChild(h('span', '', r[1])); var b = h('button', '', 'Copy'); b.type = 'button'; b.addEventListener('click', function () { try { navigator.clipboard.writeText(r[1]); b.textContent = 'Copied!'; setTimeout(function () { b.textContent = 'Copy'; }, 1500); } catch (e) { b.textContent = 'Select and copy'; } }); row.appendChild(b); wrap.appendChild(row); }); box.appendChild(wrap); } box.appendChild(h('h3', 'ar-h3', 'All 20 checks')); lastScan.categories.forEach(function (c) { var grp = h('div', 'ar-grp'); grp.appendChild(h('h4', '', c.name + ' · ' + c.score + '/100')); full.checks.filter(function (k) { return k.category === c.id; }).forEach(function (k) { var row = h('div', 'ar-chk'), cb = h('div', 'ar-cb'); row.appendChild(h('span', 'ar-ic ' + k.status, ICON[k.status])); cb.appendChild(h('h5', '', k.label)); cb.appendChild(h('p', 'd', k.detail)); if (k.status !== 'pass') { cb.appendChild(h('p', 'w', 'Why it matters: ' + k.why)); var f = h('p', 'f'); f.appendChild(h('b', '', 'How to fix: ')); f.appendChild(document.createTextNode(k.fix)); cb.appendChild(f); } row.appendChild(cb); grp.appendChild(row); }); box.appendChild(grp); }); var tools = h('div', 'ar-tools'); var pb = h('button', 'btn', 'Download as PDF'); pb.type = 'button'; pb.style.cssText = 'background:#1B1B2F;color:#fff;box-shadow:4px 4px 0 #FF7A3D'; pb.addEventListener('click', function () { printReport(full); }); tools.appendChild(pb); box.appendChild(tools); box.hidden = false; $('air-upsell').hidden = false; } function esc(s) { return safeText(s).replace(/[&"]/g, function (c) { return { '&': '&', '': '>', '"': '"' }[c]; }); } function printReport(full) { var d = lastScan, w = window.open('', '_blank'); if (!w) { alert('Please allow pop-ups to download the PDF.'); return; } var out = 'AI Readiness Reportbody{font:15px/1.5 system-ui,sans-serif;color:#1B1B2F;max-width:780px;margin:30px auto;padding:0 20px}h1{margin:0;font-size:30px}h2{margin:28px 0 8px;font-size:20px;border-bottom:3px solid #1B1B2F}.g{display:inline-block;width:90px;height:90px;border:4px solid #1B1B2F;border-radius:50%;text-align:center;font:800 60px/84px system-ui;background:#B8EBD0}.c{margin:10px 0;padding:10px 12px;border:2px solid #1B1B2F;border-radius:10px;page-break-inside:avoid}.s{font-weight:800}.pass{color:#067a40}.partial{color:#b36b00}.fail{color:#c0281a}@media print{a{display:none}}'; out += '

AI Readiness Report

' + esc(d.business.name || d.url) + ' · ' + esc(d.url) + '
' + esc(d.business.category) + ' in ' + esc(d.business.location) + ' · ' + esc(new Date(d.scannedAt).toLocaleDateString()) + '

'; out += '

' + esc(d.overall.grade) + '   ' + d.overall.score + ' / 100 · ' + esc(d.overall.label) + '

'; if (full.summary) out += '

' + esc(full.summary) + '

'; out += '

Category scores

' + d.categories.map(function (c) { return '

' + esc(c.name) + ': ' + c.score + '/100

'; }).join(''); if (full.suggestedCopy) out += '

Suggested copy

Title: ' + esc(full.suggestedCopy.title) + '

Meta description: ' + esc(full.suggestedCopy.metaDescription) + '

H1: ' + esc(full.suggestedCopy.h1) + '

'; d.categories.forEach(function (c) { out += '

' + esc(c.name) + '

'; full.checks.filter(function (k) { return k.category === c.id; }).forEach(function (k) { out += '
' + ICON[k.status] + ' ' + esc(k.label) + '
' + esc(k.detail) + (k.status !== 'pass' ? '
Why: ' + esc(k.why) + '
Fix: ' + esc(k.fix) : '') + '
'; }); }); out += '

Prepared by Biz Coach Studio · ' + esc(CONTACT_EMAIL) + '

Print / Save as PDFsetTimeout(function(){print()},400)'; w.document.open(); w.document.write(out); w.document.close(); } $('air-form').addEventListener('submit', function (e) { e.preventDefault(); var err = $('air-formerr'); err.hidden = true; var url = $('air-url').value.trim(), name = $('air-name').value.trim(), cat = $('air-cat').value.trim(), loc = $('air-loc').value.trim(); if (!url) return showErr(err, 'Please enter your website address.'); var rawUrl = url; // sent as typed; the server tries https first, then http if (!/^https?:\/\//i.test(url)) url = 'https://' + url; try { var u = new URL(url); if (u.hostname.indexOf('.') < 1) throw 0; } catch (x) { return showErr(err, 'That does not look like a website address. Try something like yourwebsite.com'); } if (!cat) return showErr(err, 'Tell us what kind of business it is, like "plumber" or "family dentist".'); if (!loc) return showErr(err, 'Enter the city you want to be found in, like "Pasadena, CA".'); if (!API_BASE) return showErr(err, 'The scanner is not connected yet. Please check back soon.'); $('air-results').hidden = true; startProgress(u.hostname.replace(/^www\./, '')); var ctl = window.AbortController ? new AbortController() : null, to = setTimeout(function () { if (ctl) ctl.abort(); }, 90000), started = Date.now(); fetch(API_BASE + '/api/scan', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: rawUrl, name: name, category: cat, location: loc }), signal: ctl ? ctl.signal : undefined }) .then(function (r) { return r.json().catch(function () { return {}; }).then(function (j) { if (!r.ok) throw new Error(j.error || 'Something went wrong. Please try again.'); return j; }); }) .then(function (j) { var wait = Math.max(0, 5000 - (Date.now() - started)); // let the progress animation breathe setTimeout(function () { $('air-barfill').style.width = '100%'; setTimeout(function () { stopProgress(); renderResults(j); }, 400); }, wait); }) .catch(function (x) { stopProgress(); showErr(err, x && x.name === 'AbortError' ? 'That took too long. Please try again.' : (x && x.message && x.message !== 'Failed to fetch' ? x.message : 'We could not reach the scanner. Please try again in a moment.')); }) .then(function () { clearTimeout(to); }); }); $('air-lead').addEventListener('submit', function (e) { e.preventDefault(); var err = $('air-lerr'); err.hidden = true; var email = $('air-lemail').value.trim(); if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email)) return showErr(err, 'Please enter a valid email address.'); var btn = $('air-lbtn'); btn.disabled = true; btn.textContent = 'Unlocking...'; fetch(API_BASE + '/api/lead', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: email, name: $('air-lname').value.trim(), token: lastScan.unlockToken, url: lastScan.url, grade: lastScan.overall.grade, score: lastScan.overall.score, business: lastScan.business }) }) .then(function (r) { return r.json().catch(function () { return {}; }).then(function (j) { if (!r.ok) throw new Error(j.error || 'Something went wrong.'); return j; }); }) .then(function (full) { $('air-gate').hidden = true; renderFull(full); $('air-full').scrollIntoView({ behavior: 'smooth', block: 'start' }); }) .catch(function (x) { showErr(err, x && x.message && x.message !== 'Failed to fetch' ? x.message : 'We could not unlock the report. Please try again.'); }) .then(function () { btn.disabled = false; btn.textContent = 'Unlock report'; }); }); $('air-again').addEventListener('click', function () { $('air-results').hidden = true; $('air-formcard').scrollIntoView({ behavior: 'smooth', block: 'center' }); $('air-url').focus(); }); })();