Knowledge Base

How to use SEO Audit

Updated August 5, 2026

Choose the active brand, confirm the Website URL, and click Run Audit. Every audit securely fetches the entered page and records measured page evidence. The optional live checkbox adds PageSpeed and DataForSEO provider measurements.

Review score bars, vitals, Page Evidence, Monitoring Coverage, health trend, and recent audits. Use failed or warning items as the fix list.

Page Evidence

Page Evidence is collected directly from the latest HTML page fetched for the active brand. It is not a projected score. The section shows the requested and final URL, redirect result, HTTP status, response time, content type and size, page title, canonical URL, declared language, visible word count, evidence provider, and collection time.

Measured findings currently check the page title, meta description, main H1, canonical URL, language declaration, robots noindex directive, image alternative text, and visible content depth. Open a finding to see the exact rule, observed value, suggested correction, and source provider. If the page cannot be fetched, the section shows the actual DNS, SSL, redirect, HTTP, content-type, response-size, or safety error instead of filling in a score.

Website Crawl

Website Crawl expands the same measured evidence across multiple pages for the active brand. Choose a page limit, link depth, and pages-per-minute rate, then click Start Website Crawl. The crawler reads sitemap locations, follows same-site links, respects robots.txt rules and crawl delays, checks redirects and canonical URLs, retries temporary failures, and never follows a URL outside the brand website.

Use Render JavaScript only when the important page content appears after scripts run. It opens pages in a real browser and uses more server time. Standard HTTP mode is faster for normal server-rendered pages.

The progress percentage and URL counts come from stored crawl events. Discovered is the number of pages accepted into the bounded queue. Visited is the number of pages successfully retrieved. Skipped is the number not analyzed because of robots rules, content type, depth, or another recorded reason. Failed means the crawler could not complete the request after its retry limit.

The URL Ledger lists visited pages and recorded skips with the HTTP status, content type, depth, result, and reason. Cancelling a crawl preserves its stored pages and queue. Click Resume Crawl to continue from the remaining URLs instead of starting over.

After the bounded page crawl, open the Links & Assets tab. Analytics & Beyond checks every discovered HTTP link, image, srcset image, script, stylesheet, download, and page anchor from the crawled pages. Each row shows the source page, target, internal or external scope, HTTP status, content type, response time, retry count, redirect evidence, page context, and a recommended correction.

Working means the target responded successfully. Redirect means it reached a working final URL after one or more redirects. Broken means a confirmed failure such as a missing target, redirect loop, missing page anchor, or wrong file type. Blocked means the destination refused or rate-limited the validator, so it is not counted as confirmed broken. Uncertain means a timeout or temporary server failure remained after retries. Use the Result and Type filters to focus the table, and use Previous or Next to review every stored result.

The validator only requests public HTTP or HTTPS resources on standard ports. It blocks private and reserved addresses, credentials in URLs, unsafe redirects, oversized bodies, and redirect loops. Missing measurements remain labeled as not measured or uncertain; they are never converted into invented scores.

Monitoring Coverage

  • Monitoring Speed uses Core Web Vitals such as LCP, TBT, and CLS to show whether the page feels fast enough for users and search engines.
  • Uptime checks whether the audited URL responds with a healthy HTTP status and how long the server took to answer.
  • Duplicate Content samples the homepage and a small set of internal pages to look for duplicate page titles and meta descriptions.
  • Schema checks whether structured data such as JSON-LD, microdata, or RDFa is present so search engines and AI systems can understand the brand.
  • Broken Links checks a bounded sample of page links and flags URLs that return errors.
  • Competition compares the brand against the saved top competitor from onboarding or brand notes. If no competitor is saved, the audit tells the user to add one.

The public lead magnet can be embedded with

.andb-public-scan{--andb-ink:#101828;--andb-muted:#52627a;--andb-line:#dfe5ee;--andb-soft:#f6f7fb;--andb-accent:#6947d2;--andb-accent-dark:#3b237d;max-width:1180px;margin:24px auto 56px;color:var(--andb-ink);font-family:inherit}.andb-public-scan *{box-sizing:border-box}.andb-public-scan button,.andb-public-scan input{font:inherit}.andb-public-scan-head{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(280px,.75fr);border:1px solid var(--andb-line);border-radius:8px;overflow:hidden;background:#fff;box-shadow:0 18px 44px rgba(32,17,59,.07)}.andb-public-scan-copy{padding:34px}.andb-public-scan-kicker{margin:0 0 8px;color:var(--andb-accent-dark);font-size:12px;font-weight:900;text-transform:uppercase}.andb-public-scan .andb-public-scan-title{margin:0 0 10px;font-size:clamp(30px,4vw,48px);line-height:1.04;color:var(--andb-ink);letter-spacing:0}.andb-public-scan-lead{max-width:66ch;margin:0 0 24px;color:var(--andb-muted);font-size:17px;line-height:1.55}.andb-public-scan-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.andb-public-field{display:grid;gap:6px}.andb-public-field.full{grid-column:1/-1}.andb-public-field label{font-size:13px;font-weight:850}.andb-public-field input{width:100%;min-height:46px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;padding:9px 11px;color:var(--andb-ink)}.andb-public-field input:focus{outline:3px solid rgba(105,71,210,.2);border-color:var(--andb-accent)}.andb-public-hp{position:absolute!important;left:-10000px!important;width:1px!important;height:1px!important;overflow:hidden!important}.andb-public-consent{display:flex;gap:9px;align-items:flex-start;color:var(--andb-muted);font-size:13px;line-height:1.45}.andb-public-consent input{width:17px;height:17px;margin:1px 0 0;flex:0 0 auto}.andb-public-submit{min-height:46px;border:0;border-radius:6px;background:var(--andb-accent);color:#fff;font-weight:900;padding:0 17px;cursor:pointer}.andb-public-submit:hover{background:#5a3bc2}.andb-public-submit:focus-visible,.andb-public-tab:focus-visible,.andb-public-pdf:focus-visible{outline:3px solid rgba(105,71,210,.28);outline-offset:2px}.andb-public-submit:active{transform:translateY(1px)}.andb-public-submit:disabled{cursor:not-allowed;opacity:.58}.andb-public-scan-scope{padding:34px;background:#151827;color:#fff}.andb-public-scan-scope h2{margin:0 0 18px;color:#fff;font-size:19px}.andb-public-scope-list{display:grid;gap:15px;margin:0;padding:0;list-style:none}.andb-public-scope-list li{display:grid;grid-template-columns:28px 1fr;gap:10px;align-items:start}.andb-public-scope-list i{display:flex;width:26px;height:26px;align-items:center;justify-content:center;border-radius:50%;background:#fff;color:var(--andb-accent-dark);font-style:normal;font-weight:900}.andb-public-scope-list strong{display:block;font-size:14px}.andb-public-scope-list span{display:block;margin-top:2px;color:#cbd5e1;font-size:12px;line-height:1.45}.andb-public-status{display:none;margin-top:18px;border:1px solid var(--andb-line);border-radius:8px;background:#fff;padding:18px}.andb-public-status.active{display:block}.andb-public-status.is-error{border-color:#fecaca;background:#fff7f7}.andb-public-status-row{display:flex;justify-content:space-between;gap:16px;align-items:center}.andb-public-status strong{display:block}.andb-public-status p{margin:3px 0 0;color:var(--andb-muted);font-size:13px}.andb-public-progress{height:8px;margin-top:13px;border-radius:999px;background:#e9edf3;overflow:hidden}.andb-public-progress i{display:block;width:0;height:100%;background:var(--andb-accent);transition:width .25s ease}.andb-public-results{display:none;margin-top:22px}.andb-public-results.active{display:block}.andb-public-result-head{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;margin-bottom:16px}.andb-public-result-head h2{margin:0;font-size:28px}.andb-public-result-meta{color:var(--andb-muted);font-size:13px}.andb-public-pdf{display:inline-flex;align-items:center;justify-content:center;min-height:42px;border:1px solid var(--andb-accent);border-radius:6px;padding:0 14px;color:var(--andb-accent-dark);font-weight:900;text-decoration:none}.andb-public-tabs{display:flex;gap:6px;overflow-x:auto;padding:3px 0 10px;scrollbar-width:thin}.andb-public-tab{flex:0 0 auto;border:1px solid var(--andb-line);border-radius:999px;background:#fff;color:#344054;min-height:38px;padding:0 13px;font-weight:850;cursor:pointer}.andb-public-tab[aria-selected="true"]{border-color:var(--andb-accent);background:var(--andb-accent);color:#fff}.andb-public-panel{display:none}.andb-public-panel.active{display:block}.andb-public-metrics{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));border:1px solid var(--andb-line);border-radius:8px;background:#fff;overflow:hidden}.andb-public-metric{min-width:0;padding:17px;border-right:1px solid var(--andb-line)}.andb-public-metric:last-child{border-right:0}.andb-public-metric span{display:block;color:var(--andb-muted);font-size:11px;font-weight:850;text-transform:uppercase}.andb-public-metric strong{display:block;margin-top:6px;font-size:25px;line-height:1}.andb-public-note{margin:14px 0 0;border-left:3px solid var(--andb-accent);background:#f7f5ff;padding:12px 14px;color:#44366c;font-size:13px;line-height:1.5}.andb-public-table-wrap{overflow:auto;border:1px solid var(--andb-line);border-radius:8px;background:#fff}.andb-public-table{width:100%;min-width:760px;border-collapse:collapse}.andb-public-table th,.andb-public-table td{padding:12px;border-bottom:1px solid var(--andb-line);text-align:left;vertical-align:top;overflow-wrap:anywhere}.andb-public-table th{background:#f8fafc;color:#52627a;font-size:11px;text-transform:uppercase}.andb-public-table td{font-size:13px;color:#344054}.andb-public-table tr:last-child td{border-bottom:0}.andb-public-empty{border:1px dashed #cbd5e1;border-radius:8px;background:#fff;padding:24px;color:var(--andb-muted);text-align:center}.andb-public-severity{font-weight:900;text-transform:capitalize}.andb-public-delivery{display:grid;gap:10px;max-width:680px}.andb-public-delivery div{border:1px solid var(--andb-line);border-radius:8px;background:#fff;padding:14px}.andb-public-delivery strong{display:block}.andb-public-delivery span{display:block;margin-top:3px;color:var(--andb-muted);font-size:13px} .seo-tpl-content-card:has(.andb-public-scan)>article>h1{display:none} @media(max-width:1024px){.seo-tpl-content-card:has(.andb-public-scan){padding:24px}.andb-public-scan-head{grid-template-columns:1fr}.andb-public-scan-scope{padding:26px}.andb-public-scope-list{grid-template-columns:repeat(2,minmax(0,1fr))}.andb-public-metrics{grid-template-columns:repeat(3,minmax(0,1fr))}.andb-public-metric:nth-child(3){border-right:0}.andb-public-metric:nth-child(-n+3){border-bottom:1px solid var(--andb-line)}} @media(max-width:680px){.seo-tpl-main:has(.andb-public-scan){padding-left:8px;padding-right:8px}.seo-tpl-content-card:has(.andb-public-scan){padding:14px 10px}.andb-public-scan{margin-top:4px}.andb-public-scan-copy,.andb-public-scan-scope{padding:20px 16px}.andb-public-scan .andb-public-scan-title{font-size:30px}.andb-public-scan-form,.andb-public-scope-list{grid-template-columns:1fr}.andb-public-result-head{display:block}.andb-public-pdf{margin-top:12px;width:100%}.andb-public-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}.andb-public-metric{border-bottom:1px solid var(--andb-line)}.andb-public-metric:nth-child(odd){border-right:1px solid var(--andb-line)}.andb-public-metric:nth-child(even){border-right:0}.andb-public-metric:nth-last-child(-n+2){border-bottom:0}.andb-public-status-row{align-items:flex-start}.andb-public-status-row span{font-size:12px}} @media(prefers-reduced-motion:reduce){.andb-public-progress i{transition:none}}

Measured website review

Find website errors before customers do

Scan a bounded sample of your public website for spelling, grammar, broken links, and core SEO issues. Every result comes from the completed crawl.

Preparing scan

0%

Website Quality Results

View and Download PDF

(function(){ const root=document.currentScript.closest('[data-public-audit]');if(!root){return;} const ajaxUrl="https:\/\/analyticsandbeyond.io\/wp-admin\/admin-ajax.php",nonce="301bb91b98"; const form=root.querySelector('[data-public-audit-form]'),submit=root.querySelector('[data-public-audit-submit]'),statusBox=root.querySelector('[data-public-audit-status]'),statusTitle=root.querySelector('[data-public-status-title]'),statusCopy=root.querySelector('[data-public-status-copy]'),statusPercent=root.querySelector('[data-public-status-percent]'),progress=root.querySelector('[data-public-progress]'),results=root.querySelector('[data-public-audit-result]'); let auditId=0,token='',pollTimer=0,pollCount=0; function text(el,value){if(el){el.textContent=value==null?'':String(value);}} function setStatus(title,copy,percent,error){statusBox.classList.add('active');statusBox.classList.toggle('is-error',!!error);text(statusTitle,title);text(statusCopy,copy);text(statusPercent,Math.max(0,Math.min(100,Number(percent)||0))+'%');progress.style.width=Math.max(0,Math.min(100,Number(percent)||0))+'%';} async function request(action,data){const body=new FormData();body.append('action',action);body.append('nonce',nonce);Object.keys(data||{}).forEach(k=>body.append(k,data[k]));const controller=new AbortController(),timer=setTimeout(()=>controller.abort(),20000);try{const response=await fetch(ajaxUrl,{method:'POST',credentials:'same-origin',body,signal:controller.signal});const json=await response.json();if(!json.success){throw new Error(json.data&&json.data.message?json.data.message:'The request failed.');}return json.data||{};}finally{clearTimeout(timer);}} function empty(message){const box=document.createElement('div');box.className='andb-public-empty';text(box,message);return box;} function makeTable(headers,rows){if(!rows.length){return empty('No measured records are available in this section.');}const wrap=document.createElement('div');wrap.className='andb-public-table-wrap';const table=document.createElement('table');table.className='andb-public-table';const thead=document.createElement('thead'),trh=document.createElement('tr');headers.forEach(h=>{const th=document.createElement('th');text(th,h.label);trh.appendChild(th);});thead.appendChild(trh);table.appendChild(thead);const tbody=document.createElement('tbody');rows.forEach(row=>{const tr=document.createElement('tr');headers.forEach(h=>{const td=document.createElement('td');if(h.className){td.className=h.className;}text(td,h.value(row));tr.appendChild(td);});tbody.appendChild(tr);});table.appendChild(tbody);wrap.appendChild(table);return wrap;} function renderResult(data){const c=data.counts||{},metrics=root.querySelector('[data-public-metrics]');metrics.replaceChildren();[['Health score',data.score_label],['Pages checked',c.pages_checked],['Issues',c.issues],['Spelling',c.spelling],['Grammar',c.grammar],['Broken links',c.broken_links]].forEach(item=>{const box=document.createElement('div');box.className='andb-public-metric';const label=document.createElement('span'),value=document.createElement('strong');text(label,item[0]);text(value,item[1]);box.append(label,value);metrics.appendChild(box);}); text(root.querySelector('[data-public-overview-note]'),'This bounded live scan checked '+(c.pages_checked||0)+' page(s) and '+(c.links_checked||0)+' link or asset target(s). A zero means the completed scan measured none in that category. Not measured is shown when no verified score is available.'); text(root.querySelector('[data-public-result-meta]'),data.website_url+' | Measured '+data.measured_at);root.querySelector('[data-public-audit-pdf]').href=data.pdf_url||'#'; const issueHost=root.querySelector('[data-public-issues]');issueHost.replaceChildren(makeTable([{label:'Severity',className:'andb-public-severity',value:r=>r.severity},{label:'Issue',value:r=>r.title},{label:'Page',value:r=>r.source_url},{label:'Found',value:r=>r.original_text||r.context_text},{label:'Suggested correction',value:r=>r.suggested_text||r.description}],data.issues||[])); const pageHost=root.querySelector('[data-public-pages]');pageHost.replaceChildren(makeTable([{label:'Page',value:r=>r.url},{label:'Title',value:r=>r.title||'Not provided'},{label:'HTTP',value:r=>r.http_status||'N/A'},{label:'Words',value:r=>r.word_count},{label:'Response',value:r=>r.response_time_ms?r.response_time_ms+' ms':'N/A'}],data.pages||[])); const linkHost=root.querySelector('[data-public-links]');linkHost.replaceChildren(makeTable([{label:'Result',value:r=>r.result_class},{label:'Source page',value:r=>r.source_url},{label:'Target',value:r=>r.target_url},{label:'HTTP',value:r=>r.http_status||'N/A'},{label:'Recommended action',value:r=>r.recommendation}],data.links||[])); const delivery=root.querySelector('[data-public-delivery]');delivery.replaceChildren();const d=data.delivery||{},box=document.createElement('div'),strong=document.createElement('strong'),span=document.createElement('span'),recipients=d.recipients||[];text(strong,d.state==='failed'?'PDF email not sent':'PDF email '+(d.state||'pending'));text(span,d.state==='failed'?'Authenticated delivery is not configured. Your measured report and PDF remain available on this page.':(recipients.length?'Queued for '+recipients.join(', '):'Delivery details are still being prepared.'));box.append(strong,span);delivery.appendChild(box);results.classList.add('active');results.scrollIntoView({behavior:matchMedia('(prefers-reduced-motion: reduce)').matches?'auto':'smooth',block:'start'});} async function poll(){if(!auditId||!token){return;}pollCount++;try{const data=await request('andb_public_audit_status',{audit_id:auditId,token});const state=data.state||'queued',pct=data.progress||0,current=data.current_url?' Checking '+data.current_url:'';if(state==='completed'&&data.result){setStatus('Scan complete','Your measured result and PDF are ready.',100,false);renderResult(data.result);submit.disabled=false;return;}if(state==='failed'){setStatus('Scan could not finish',data.message||'The website did not allow the scan to complete.',pct,true);submit.disabled=false;return;}setStatus(state==='retrying'?'Retry scheduled':state==='running'?'Scanning public pages':'Waiting for scanner',state==='retrying'?'The worker will retry automatically.':('Progress is saved while this page is open.'+current),pct,false);pollTimer=setTimeout(poll,Math.min(5000,1500+pollCount*100));}catch(error){if(pollCount{event.preventDefault();clearTimeout(pollTimer);pollCount=0;submit.disabled=true;results.classList.remove('active');setStatus('Queuing measured scan','Validating the public website and reserving a crawler job.',2,false);try{const body=new FormData(form);body.append('action','andb_public_audit_run');body.append('nonce',nonce);const controller=new AbortController(),timer=setTimeout(()=>controller.abort(),20000);const response=await fetch(ajaxUrl,{method:'POST',credentials:'same-origin',body,signal:controller.signal});clearTimeout(timer);const json=await response.json();if(!json.success){throw new Error(json.data&&json.data.message?json.data.message:'The scan could not be queued.');}auditId=Number(json.data.audit_id)||0;token=json.data.token||'';if(json.data.result_url){history.replaceState({},'',json.data.result_url);}setStatus('Scan queued','The worker is preparing your bounded live crawl.',3,false);poll();}catch(error){setStatus('Scan request failed',error.name==='AbortError'?'The request timed out before the scan was queued. Please try again.':error.message,0,true);submit.disabled=false;}}); root.querySelectorAll('[data-public-tab]').forEach(tab=>tab.addEventListener('click',()=>{root.querySelectorAll('[data-public-tab]').forEach(item=>item.setAttribute('aria-selected',item===tab?'true':'false'));root.querySelectorAll('[data-public-panel]').forEach(panel=>panel.classList.toggle('active',panel.dataset.publicPanel===tab.dataset.publicTab));})); const params=new URLSearchParams(location.search),requestedUrl=params.get('website_url')||'';auditId=Number(params.get('audit_id'))||0;token=params.get('scan_token')||'';if(requestedUrl){const urlField=form.querySelector('[name="website_url"]');if(urlField){urlField.value=requestedUrl.slice(0,255);}}if(auditId&&token){submit.disabled=true;setStatus('Loading saved scan','Checking the stored scan state.',0,false);poll();} })();
. It captures name, email, company, and website URL before showing the audit result. The result is stored in the existing leads and audits tables, and the user receives a token-protected branded PDF link. If Dompdf is installed, the system uses Dompdf for the white-label PDF. If Dompdf is not installed, a built-in PDF fallback still produces a valid branded PDF.