Methodology
How BAZY scores your website
No black box. Every point a BAZY scan awards (or deducts) is traceable to a specific check in open code. Here's the whole system.
The pipeline
When you submit a URL, BAZY does four things in order:
- Crawl. We fetch your homepage, then discover more pages via your sitemap and internal links. We cap at ~20 pages on the free tier.
- Scan, in parallel. Nine specialized scanners run against the crawled pages at the same time. Each scanner is a separate module focused on one dimension (SEO, performance, security, etc.).
- Score each scanner. Every scanner awards points for checks that pass, with a known maximum per check. The scanner's final score is
round((points earned ÷ total possible) × 100). - Weighted-average the overall. Scanner scores are combined using the published weights below — no magic, just arithmetic.
Category weights
The overall score is a weighted average of nine scanner scores. Weights sum to 100. These are fixed and published — no A/B testing your grade.
| Scanner | Weight | |
|---|---|---|
| SEO | 15 | |
| Performance | 12 | |
| Security | 12 | |
| Design System | 12 | |
| Accessibility | 12 | |
| Content Quality | 10 | |
| AI Readiness | 8 | |
| Mobile Experience | 10 | |
| Brand Consistency | 9 | |
| Total | 100 |
Where this lives in code
These weights are defined in src/lib/scoring.ts in the SCANNER_METADATA map. Changing the file changes this page — there's no separate doc to drift.
How a single scanner scores
Every scanner uses the same pattern. It walks every crawled page, runs a fixed set of checks, and adds the points that passed over the points that could possibly be earned.
for each crawled page:
for each check:
maxPoints += check.weight
totalPoints += points earned on that page
scannerScore = round(totalPoints / maxPoints * 100)Example — the Performance scanner awards up to 65 points per page across these checks:
- Load time (15 pts): <1.5s = 15, <3s = 10, <5s = 5, else 0
- Page size (10 pts): <200KB = 10, <500KB = 5, else 0
- Compression (10 pts): gzip or brotli enabled
- Cache-Control (10 pts): correctly configured
- Image optimization (10 pts): dimensions set, modern formats
- No render-blocking resources (5 pts)
- HTTP/2 or HTTP/3 (5 pts)
Score → grade thresholds
The same grade scale applies to the overall score and every individual scanner.
Why BAZY's score differs from Semrush, Ahrefs, or Moz
We get asked this a lot. The short answer: we're measuring different things.
| BAZY | Semrush / Ahrefs | |
|---|---|---|
| Input | Live crawl of your site (HTML + headers) | Their own backlink / keyword index + crawl |
| Domains scored | 9 — SEO, Perf, Sec, A11y, Design, Content, Mobile, Brand, LLMO | Mostly SEO-centric |
| Weights | Published in code, evenly spread | Proprietary, SEO-heavy |
| Backlinks / DA | Not measured today | Central to their score |
| Transparency | Every point traceable to a rule in source | Black box |
Semrush and Ahrefs answer: how well will this rank in Google based on our backlink graph?
BAZY answers: how good is the actual website — across everything a lazy owner should care about outside their login wall?
Want to verify any of this?
Each scanner is a single file in src/lib/scanners/ on the BAZY codebase. Open any one and you can read — line by line — which checks are run, how many points each is worth, and what triggers a pass or a fail. If you think a check is wrong or missing, tell us and we'll look at it.