Website Health & AI-Readiness Report
What we found, and what it means
The short version, written for decision-makers — not developers.
We crawled all 25 pages of books.toscrape.com the way a search engine does and ran 260+ checks across 21 categories. The site scored 31/100 — grade F. That number is not a verdict on the business; it is a measurement of how much of this website search engines and browsers can actually use. Right now, roughly one check in three fails: 101 failed checks and 607 warnings, concentrated in security (34/100), core SEO (37/100) and performance (41/100).
The pattern behind the score is consistent: the store works when a human opens it in a browser, but it is nearly invisible to machines. There is no XML sitemap and no robots.txt, so Google discovers pages by luck. Twenty of twenty-five pages ship without a meta description, so Google writes its own snippets — and its versions rarely sell. Every page loads an insecure script over HTTP, which modern browsers flag as mixed content. There is no About page, no Contact page, no privacy policy — the trust signals Google's quality systems look for, and the pages customers look for before spending money.
Here is the encouraging part: almost nothing on this list is structural. A sitemap is one generated file. Descriptions are an afternoon of copywriting. The mixed-content script is one line to fix. This is the rare kind of F grade that climbs to a B in a single focused week — and the traffic difference between the two is typically the difference between a shop search engines ignore and one they send customers to.
The five issues costing you the most
Ranked by business impact — severity × category weight × pages affected.
errorMeta Description
Twenty of your twenty-five pages have no meta description, so Google invents its own snippet from whatever text it finds first — usually navigation or boilerplate. You are leaving the single cheapest conversion lever in SEO unused: pages with written descriptions earn meaningfully more clicks at the same ranking. This is an afternoon of work for a permanent lift on every search result you appear in.
errorMixed Content
Every page on the site loads at least one script over plain HTTP while the page itself is HTTPS. Modern browsers flag this as mixed content and may block the script outright — showing visitors (and Chrome's security indicators) an inconsistent, less trustworthy site. Beyond the trust cost, it can silently break page features. This is usually a one-line fix that removes a warning every visitor's browser is evaluating.
warningCanonical URL
No page declares a canonical URL. The store's URLs contain tracking and pagination parameters, so Google can index the same product under several addresses — splitting each page's ranking power across duplicates and occasionally ranking the wrong variant. Declaring canonicals tells Google which address is the real one, consolidating every signal onto a single URL per page.
warningCharset
Pages ship without a charset declaration, so browsers and crawlers guess the text encoding. Guess wrong and accented characters and symbols render as mojibake — in titles, in snippets, and in your listings on Google. It is a one-line declaration in the page head that eliminates an entire class of rendering roulette for both visitors and search engines.
<head> section. This tells browsers how to interpret the text on your page. UTF-8 is the standard encoding that supports all languages and special characters. Placing it first ensures browsers know the encoding before parsing any other content.warningOpen Graph Tags
Open Graph tags are missing, which means every link shared on social media, Slack, or Discord renders as a bare URL instead of a titled card with a product image. For a bookstore — a category where covers sell books — sharing is a genuine acquisition channel, and right now every share arrives undressed. Complete OG tags turn each share into a small advertisement.
Can AI assistants recommend you?
How ChatGPT, Perplexity, Gemini and Google AI Overviews experience your site today.
Here is the surprise in your data: the site scores 100/100 on AI-Readiness. AI crawlers are not blocked, the content parses cleanly, and assistants like ChatGPT and Perplexity can read every page you publish. Among the sites we audit, that is genuinely uncommon — most businesses discover they are invisible to AI answers; you are not.
But treat this as an asset to protect, not a finished job. Your AI-readiness matters exactly as much as your discoverability — and today the missing sitemap, descriptions and structured data mean there is less for both Google and AI assistants to work with. Keep crawler access open, and when the fix plan's structured-data items land, AI answers will have rich, citable facts about your catalog to draw on.
Every category, scored
21 categories from 0–100, weakest first, with analyst notes.
Every finding, prioritized
Hand this to any developer — each row carries its own fix guidance.
| Issue & fix | Category | Pages |
|---|---|---|
| errorMeta Description Meta descriptions should be 120-160 characters and provide a compelling summary of the page. While not a direct ranking factor, good descriptions improve click-through rates from search results. Write unique descriptions for each page that accurately preview t… | Core SEO | ~20 |
| errorMixed Content Mixed content occurs when an HTTPS page loads resources over HTTP, breaking the security chain. Browsers may block these resources. Update all resource URLs to use HTTPS or protocol-relative URLs (//example.com). Check images, scripts, stylesheets, fonts, and … | Security | ~25 |
| warningCanonical URL Canonical URLs tell search engines which version of a page is the "master" copy, preventing duplicate content issues. Every page should specify a canonical URL, typically pointing to itself. Add a <link rel="canonical" href="...&quo… | Core SEO | ~25 |
warningCharset
Add <meta charset="UTF-8"> as the first element in your <head> section. This tells browsers how to interpret the text on your page. UTF-8 is the standard encoding that supports all languages and special characters. Placing it… |
Core SEO | ~25 |
| warningOpen Graph Tags Open Graph tags control how your content appears when shared on Facebook, LinkedIn, and other platforms. Required tags: og:title, og:description, og:image, og:url, and og:type. Add OG tags in your page head. Use images at least 1200x630 pixels for best display… | Core SEO | ~25 |
| warningCSS File Size Too Large Large CSS files slow down rendering and increase bandwidth. Split large stylesheets into smaller chunks, remove unused selectors, and minify CSS. Consider critical CSS inlining for above-the-fold styles and lazy-loading non-critical CSS. | Performance | ~25 |
| warningCritical Request Chains Critical request chains are sequences of dependent network requests that must complete before the page can render. Reduce chain depth by: 1) Inlining critical CSS instead of linking external files. 2) Adding async or defer to non-critical scripts. 3) Avoiding … | Performance | ~25 |
| warningDuplicate JavaScript Remove duplicate JavaScript library loads to reduce page weight and avoid conflicts. Check for the same library loaded from different CDNs or versions. Use a single source for each dependency. Consider using a module bundler to deduplicate shared dependencies. | Performance | ~25 |
| warningJS Libraries Keep JavaScript libraries updated to their latest versions. Outdated libraries may contain security vulnerabilities that attackers can exploit. Consider replacing large libraries like jQuery with modern vanilla JavaScript or smaller alternatives. Use npm audit… | Performance | ~25 |
| warningUnminified JavaScript Minify JavaScript to reduce file size and improve load times. Use build tools like Terser, esbuild, or UglifyJS. Most bundlers (Webpack, Vite, Rollup) minify automatically in production. Minification shortens variable names, removes whitespace, and dead code. | Performance | ~25 |
| warningCache Headers Use Cache-Control headers to enable browser caching. For static assets (CSS, JS, images), set long max-age (1 year) with immutable when using hashed filenames. For HTML, use shorter max-age or no-cache with revalidation. Example: 'Cache-Control: public, ma… | Performance | ~25 |
| warningLCP Image Fetch Priority The Largest Contentful Paint image should be discovered and fetched as early as possible. When the hero image is loaded eagerly but left at default priority, the browser races it against other resources and LCP suffers. Add fetchpriority='high' to the … | Performance | ~25 |
| warningLCP Optimization Hints LCP measures when the largest content element becomes visible. Optimize by: 1) Preload your LCP image with <link rel='preload' as='image'>. 2) Don't use loading='lazy' on above-fold images as it delays loading. 3) Minimize ren… | Performance | ~24 |
| errorSitemap Exists XML sitemaps help search engines discover and index your pages. Create a sitemap.xml at your domain root listing all important pages. Reference it in robots.txt with 'Sitemap: https://yoursite.com/sitemap.xml'. Submit it to Google Search Console and Bi… | Crawlability | — |
| errorRobots.txt robots.txt tells search engines which pages to crawl. Place it at the root of your domain (example.com/robots.txt). Include your sitemap URL. Avoid blocking important resources (CSS, JS, images) that search engines need to render pages. Never use 'Disallow… | Crawlability | — |
| warningCLS Optimization Hints CLS measures visual stability - how much content shifts during load. Prevent layout shifts by: 1) Always set width and height attributes on images and iframes. 2) Reserve space for ads and embeds with CSS min-height. 3) Use CSS aspect-ratio for responsive medi… | Performance | ~20 |
| warningSubresource Integrity Cross-origin scripts and stylesheets can be tampered with in transit or at the source (a compromised CDN or third-party host), and the browser has no way to detect it without help. Add an integrity attribute with a sha256/sha384/sha512 hash of the expected fil… | Security | ~25 |
| warningMeta Title Every page needs a unique, descriptive title tag between 30-75 characters. Titles appear in browser tabs, search results, and social shares. Write titles that accurately describe the page content while including your primary keyword near the beginning. If your… | Core SEO | ~7 |
| warningTitle Uniqueness Each page should have a unique title that accurately describes its content. Duplicate titles confuse search engines and users about which page to display. Use a pattern like 'Page Topic | Brand Name' to ensure uniqueness. CMS often generate duplicate t… | Core SEO | ~3 |
| infoTwitter Cards Twitter Cards enhance how links appear in tweets. The twitter:card meta tag specifies the card type (summary, summary_large_image, player, or app). Add twitter:card, twitter:title, twitter:description, and twitter:image tags. For large images, use summary_larg… | Core SEO | ~25 |
warningOne Main Landmark
Each page should have exactly one <main> element or element with role='main'. This helps screen reader users quickly navigate to the primary content. Multiple main landmarks confuse navigation. Use <aside>, & |
Accessibility | ~25 |
warningSkip Link
Skip links allow keyboard users to bypass repetitive navigation and jump directly to main content. Add a hidden link at the very beginning of your page: <a href='#main-content' class='skip-link'>Skip to main content</a>… |
Accessibility | ~25 |
| warningKeyword Stuffing Keyword stuffing is repeating words unnaturally to manipulate rankings. Search engines penalize this practice. Write naturally for users first. Use keywords where they fit naturally. Aim for 1-2% keyword density at most. Use synonyms and related terms instead … | Content | ~15 |
| warningWeak Caching (site-wide) Set Cache-Control with an appropriate max-age on every response (short for HTML, long + immutable for hashed static assets), expose an ETag or Last-Modified for cheap revalidation, and enable gzip/Brotli for text responses. Consistent caching across the whole … | Performance | ~5 |
| warningWord Count Pages with thin content (under 300 words) often struggle to rank well and are actively deindexed by Google since the June 2025 core update. Add more valuable, relevant content to thin pages—aim for at least 500 words for standard pages and 1000+ for in-depth a… | Content | ~9 |
| infoINP Optimization Hints INP measures responsiveness to user interactions. Improve by: 1) Minimize third-party scripts that block the main thread. 2) Use async/defer for non-critical scripts. 3) Break up long JavaScript tasks into smaller chunks. 4) Use web workers for heavy computati… | Performance | ~25 |
| warningImage Dimensions Specifying width and height attributes prevents Cumulative Layout Shift (CLS) by reserving space before images load. Add width and height attributes to img tags matching the image's intrinsic dimensions. Use CSS for responsive sizing if needed. For respons… | Images | ~25 |
| warningOffscreen Image Lazy Loading Add loading='lazy' to images below the fold to defer loading until needed. This reduces initial page load time and saves bandwidth. Exception: Don't lazy-load LCP image or above-the-fold content. Use loading='eager' for critical images. | Images | ~22 |
| warningHeading Hierarchy Proper heading structure (H1 → H2 → H3) helps users and search engines understand your content organization. Skipping levels (H1 → H3) creates confusion. Use headings in sequential order without skipping levels. Each section should use the next heading level d… | Content | ~5 |
| warningContent Security Policy CSP prevents XSS attacks by restricting which resources can load. Start with a report-only policy to identify issues. Key directives: default-src 'self', script-src (avoid 'unsafe-inline'), img-src, style-src, frame-ancestors. Use nonces or has… | Security | — |
| warningHSTS Header HSTS forces browsers to only connect via HTTPS, preventing downgrade attacks. Add the header: Strict-Transport-Security: max-age=31536000; includeSubDomains. Start with a short max-age (1 day) to test, then increase to 1 year. The includeSubDomains directive p… | Security | — |
| warningX-Frame-Options X-Frame-Options prevents your site from being embedded in iframes, protecting against clickjacking attacks. Set: X-Frame-Options: DENY (no framing) or SAMEORIGIN (same origin only). For modern browsers, CSP frame-ancestors is preferred: Content-Security-Policy… | Security | — |
| warningDuplicate Title Each page should have a unique title tag that accurately describes its content. Duplicate titles confuse search engines about which page to rank and make your pages less distinguishable in search results. Use unique, descriptive titles that include relevant ke… | Content | ~3 |
| warningHeading Order Headings should follow a logical hierarchy without skipping levels. Screen reader users navigate by headings, so skipping from H1 to H3 is confusing. Correct order: H1 -> H2 -> H3 (not H1 -> H3). You can have multiple headings at the same level, and y… | Accessibility | ~5 |
| warningAbout Page An About page establishes credibility and trust. Include company history, mission, team overview, and credentials. Link from main navigation or footer. For E-E-A-T, explain your expertise and why visitors should trust you. Include contact information and physi… | E-E-A-T | — |
| warningContact Page A contact page with multiple contact methods builds trust. Include: email address or contact form, phone number (if applicable), physical address, and social media links. Make contact information easy to find from any page. For local businesses, include busine… | E-E-A-T | — |
| warningPrivacy Policy A privacy policy is required by law in many jurisdictions (GDPR, CCPA) and signals trustworthiness. Link it from your footer on every page. Cover: what data you collect, how you use it, third-party sharing, user rights, and contact for privacy concerns. Keep i… | E-E-A-T | — |
| warningLink Text Link text should describe the destination, not generic phrases like 'click here'. Screen reader users often navigate by links, hearing them out of context. Good: 'View our pricing plans'. Bad: 'Click here'. For icon-only links, add aria… | Accessibility | ~4 |
| warningURL Hyphens Use hyphens (-) to separate words in URLs, not underscores (_). Google treats hyphens as word separators but treats underscores as word joiners. 'blue-shoes' = 'blue' + 'shoes', but 'blue_shoes' = 'blueshoes'. This affec… | URL Structure | ~22 |
infoLandmark Regions
Landmark regions help screen reader users navigate page structure. Use semantic HTML5 elements: <main> for primary content, <nav> for navigation, <header> for page header, <footer> for… |
Accessibility | ~25 |
| warningPrivacy Policy A privacy policy is legally required in many jurisdictions (GDPR, CCPA). Link to your privacy policy from every page, typically in the footer. The policy should explain what data you collect, how it's used, and user rights. Consider using schema.org markup… | Legal Compliance | — |
| infollms.txt llms.txt (llmstxt.org) is a Markdown file at your domain root that points AI agents and answer engines at your most useful, clean content. Add a /llms.txt with an H1 title, a short summary, and sections of Markdown links to key pages; optionally add /llms-full… | Agent Experience | — |
| infoMarkdown Response Agents and answer engines parse Markdown more reliably than rendered HTML. Serve a Markdown representation of your key pages: honor `Accept: text/markdown` via content negotiation, and/or publish a `.md` variant (e.g. /index.md). This is a recommendation only … | Agent Experience | — |
| infoImage Optimization Optimize images to reduce file sizes without visible quality loss. Use tools like Squoosh, ImageOptim, or TinyPNG. Consider using an image CDN (Cloudinary, Imgix, Cloudflare Images) for automatic optimization and responsive delivery. Modern formats (WebP, AVIF… | Images | ~22 |
| infoSub-processor Disclosure Under GDPR Art. 28, processors must disclose the sub-processors they engage and offer a Data Processing Agreement (DPA). Publish a /subprocessors page listing each third party that handles customer personal data (purpose, location), keep it current, and link a… | Legal Compliance | — |
| infoURL Length Shorter URLs are easier to read, share, and may rank better. Keep URLs under 75 characters when possible. URLs over 100 characters can be truncated in search results and social shares. Remove unnecessary parameters, stop words, and path segments. Use descripti… | URL Structure | ~6 |
Your next 90 days
The same fixes, sequenced so the fastest wins come first.
- Meta Description
- Mixed Content
- Sitemap Exists
- Robots.txt
- Canonical URL
- Charset
- Open Graph Tags
- CSS File Size Too Large
- Critical Request Chains
- Duplicate JavaScript
- JS Libraries
Where this goes
This report tells a story that is common and very fixable: a store built for human eyes that never learned to speak to machines. The fix list is unusually favorable — no rebuild, no migration, just a disciplined week of fundamentals. Work the plan top to bottom, re-audit when you reach the end, and the delta will show up where it matters: in impressions, in clicks, and at the till.