{
  "data": {
    "slug": "17c1a16d",
    "url": "https://www.inger.sk/",
    "domain": "inger.sk",
    "overall_score": 81,
    "scores_json": {
      "seo": {
        "score": 80,
        "checks": [
          {
            "name": "Meta Title",
            "value": "69 chars (optimal: 30-60)",
            "status": "warning",
            "howToFix": "Shorten your title to under 60 characters. Google truncates longer titles with '…' which loses your message.",
            "whyMatters": "Truncated titles reduce click-through rate by 10-20% according to Moz research."
          },
          {
            "name": "Meta Description",
            "value": "168 chars (optimal: 120-160)",
            "status": "warning",
            "howToFix": "Trim your meta description to 120-160 characters. Place the most important information and CTA in the first 120 chars.",
            "whyMatters": "Google truncates descriptions over 160 chars. Mobile shows even less (~120 chars)."
          },
          {
            "name": "H1 Heading",
            "value": "\"Software engineeringfor operations that must not fail.\"",
            "status": "pass"
          },
          {
            "name": "Content Structure (H2 Headings)",
            "value": "7 H2 subheadings found",
            "status": "pass"
          },
          {
            "name": "Open Graph Tags",
            "value": "og:title, og:description, og:image, og:type",
            "status": "pass"
          },
          {
            "name": "Twitter/X Cards",
            "value": "Card type: summary_large_image",
            "status": "pass"
          },
          {
            "name": "Canonical URL",
            "status": "fail",
            "howToFix": "Add a <link rel='canonical'> tag pointing to the preferred URL on every page. This is critical for stores with URL parameters (?sort=, ?page=, ?filter=).",
            "whyMatters": "Missing canonicals cause duplicate content issues. E-commerce stores typically have 40-60% duplicate pages from filters and pagination."
          },
          {
            "name": "Structured Data (JSON-LD)",
            "value": "1 block(s): PostalAddress, Offer, Service, WebSite",
            "status": "pass"
          },
          {
            "name": "robots.txt",
            "value": "Present, references sitemap",
            "status": "pass"
          },
          {
            "name": "XML Sitemap",
            "value": "Found with ~6+ URLs",
            "status": "pass"
          },
          {
            "name": "HTML Language Attribute",
            "value": "lang=\"en\"",
            "status": "pass"
          },
          {
            "name": "Hreflang Tags (Multilingual)",
            "value": "3 language(s): en, sk, x-default",
            "status": "pass"
          },
          {
            "name": "Image Alt Attributes",
            "value": "100% of 7 images have alt text",
            "status": "pass"
          },
          {
            "name": "Text-to-HTML Ratio",
            "value": "22% (1356 words)",
            "status": "pass"
          },
          {
            "name": "Favicon",
            "value": "Favicon detected",
            "status": "pass"
          },
          {
            "name": "Image Format Optimization",
            "value": "0% next-gen formats — 4 JPEG, 3 PNG images",
            "status": "warning",
            "howToFix": "Convert all images to WebP format. Most CMS platforms have plugins for automatic WebP conversion. Use AVIF for even better compression.",
            "whyMatters": "Your images are using legacy formats only. Switching to WebP typically reduces page weight by 30-50% — one of the highest-impact performance optimizations."
          },
          {
            "name": "Semantic HTML Structure",
            "value": "4/6 semantic elements: <article>, <nav>, <main>, <footer>",
            "status": "pass"
          },
          {
            "name": "Content Depth",
            "value": "1356 words — sufficient content",
            "status": "pass"
          },
          {
            "name": "Deep Heading Hierarchy",
            "value": "H2: 7, H3: 14 — well-structured content",
            "status": "pass"
          },
          {
            "name": "Internal Linking",
            "value": "Only 4 internal links",
            "status": "warning",
            "howToFix": "Add more internal links to related products, categories, and content. Target 10+ internal links per page for strong site crawlability.",
            "whyMatters": "Internal links help Google discover and rank your pages. Pages with more internal links receive higher PageRank and are crawled more frequently."
          },
          {
            "name": "Accessibility Fundamentals",
            "value": "3/4 a11y signals: 8 ARIA labels, skip link, lang=\"en\"",
            "status": "pass"
          }
        ]
      },
      "gdpr": {
        "score": 59,
        "checks": [
          {
            "name": "Cookie Consent Banner (CMP)",
            "status": "fail",
            "fixLink": {
              "url": "https://www.inger.sk/#contact",
              "label": "Get GDPR Compliance →"
            },
            "howToFix": "Install a certified consent management platform: Cookiebot, OneTrust, Usercentrics, or CookieYes. The CMP must block ALL non-essential cookies and scripts until explicit consent is given (opt-in, not opt-out).",
            "legalRefs": {
              "gdpr": [
                "Art. 6(1)(a)",
                "Art. 7"
              ],
              "czLaw": [
                "§ 5"
              ],
              "skLaw": [
                "§ 14"
              ]
            },
            "whyMatters": "Since 2024, EU regulators actively enforce cookie consent. CNIL fined Google €150M and Amazon €35M for non-compliant cookie banners. Fines can reach 4% of global annual revenue."
          },
          {
            "name": "Tracking Scripts & Consent",
            "value": "No tracking scripts detected",
            "status": "pass",
            "legalRefs": {
              "gdpr": [
                "Art. 6(1)(a)",
                "Art. 7",
                "EDPB Opinion 5/2019"
              ],
              "skLaw": [
                "§ 14"
              ]
            }
          },
          {
            "name": "Privacy Policy Page",
            "value": "/privacy.html",
            "status": "pass",
            "legalRefs": {
              "gdpr": [
                "Art. 12",
                "Art. 13",
                "Art. 14"
              ],
              "czLaw": [
                "§ 8",
                "§ 9"
              ],
              "skLaw": [
                "§ 19",
                "§ 20"
              ]
            }
          },
          {
            "name": "Cookie Policy",
            "status": "warning",
            "howToFix": "Create a separate cookie policy page listing every cookie by: name, provider, purpose, category (necessary/analytics/marketing), and expiration. Most CMPs auto-generate this.",
            "legalRefs": {
              "gdpr": [
                "Art. 12",
                "Art. 13(1)(c)-(e)"
              ],
              "czLaw": [
                "§ 8"
              ],
              "skLaw": [
                "§ 19"
              ]
            },
            "whyMatters": "The ePrivacy Directive requires transparent cookie disclosure. Vague statements like 'we use cookies for functionality' don't meet the specificity requirement."
          },
          {
            "name": "Legal Contact / Imprint Page",
            "status": "warning",
            "howToFix": "Add an imprint/about-us page with: company name, registered address, contact email, VAT number, and trade register info. In Germany/Austria/Switzerland this is legally required (Impressumspflicht).",
            "whyMatters": "In DACH countries, a missing Impressum can result in €50K+ fines and competitor cease-and-desist letters. For all EU stores, identifying the data controller is a GDPR Article 13 requirement."
          },
          {
            "name": "Terms & Conditions Page",
            "status": "warning",
            "howToFix": "Create Terms & Conditions (AGB) covering: ordering process, payment, delivery, returns, warranty, and dispute resolution. Link it from the footer and checkout.",
            "whyMatters": "EU Consumer Rights Directive requires clear terms before purchase. Missing T&C means customers can claim they weren't informed, giving them extended cancellation rights."
          },
          {
            "name": "Data Encryption (No Mixed Content)",
            "value": "All resources loaded over HTTPS",
            "status": "pass"
          },
          {
            "name": "Personal Data Exposure in Source",
            "value": "2 email(s) found in page source: info@inger.sk, you@company.com",
            "status": "warning",
            "howToFix": "Remove plain-text email addresses from HTML source. Use contact forms instead, or obfuscate emails with JavaScript encoding.",
            "legalRefs": {
              "gdpr": [
                "Art. 5(1)(f)",
                "Art. 32",
                "Art. 33"
              ],
              "czLaw": [
                "§ 13",
                "§ 14"
              ],
              "skLaw": [
                "§ 39",
                "§ 40"
              ]
            },
            "whyMatters": "Exposing personal email addresses in HTML violates the data minimization principle (GDPR Art. 5). It also invites spam harvesting."
          },
          {
            "name": "Right to Erasure (Data Deletion)",
            "status": "warning",
            "howToFix": "Provide a clear mechanism for users to request data deletion — either a dedicated page, a form, or explicit instructions in your privacy policy. Include a 'Delete my account' option in user settings.",
            "legalRefs": {
              "gdpr": [
                "Art. 17"
              ],
              "czLaw": [
                "§ 10"
              ],
              "skLaw": [
                "§ 23"
              ]
            },
            "whyMatters": "GDPR Article 17 gives users the 'right to be forgotten.' EU regulators expect a clear, accessible process. Italian DPA fined companies €20M+ for obstructing erasure requests."
          },
          {
            "name": "Data Protection Officer Contact",
            "value": "DPO / data protection contact found",
            "status": "pass"
          },
          {
            "name": "Withdrawal of Consent Mechanism",
            "status": "warning",
            "howToFix": "Provide a clear way to withdraw consent: an 'unsubscribe' link in emails, a 'cookie settings' button in the footer, and a 'revoke consent' section in your privacy policy.",
            "legalRefs": {
              "gdpr": [
                "Art. 7(3)"
              ],
              "skLaw": [
                "§ 14(4)"
              ]
            },
            "whyMatters": "GDPR Article 7(3): 'It shall be as easy to withdraw as to give consent.' If users can subscribe in one click, unsubscribing must be equally simple. Missing this is a common regulatory finding."
          },
          {
            "name": "Age Verification",
            "value": "Age-restricted content detected without age gate",
            "status": "warning",
            "howToFix": "Implement age verification for alcohol, tobacco, gambling, or adult content. Use a date-of-birth check or age confirmation modal before accessing the site.",
            "whyMatters": "EU member states require age verification for age-restricted products. German JuSchG (Youth Protection Act) and similar laws mandate age gates. Missing them risks regulatory action and marketplace delisting."
          }
        ]
      },
      "mobile": {
        "score": 75,
        "checks": [
          {
            "name": "Viewport Configuration",
            "value": "width=device-width, initial-scale=1",
            "status": "pass"
          },
          {
            "name": "Mobile Performance Score",
            "value": "87/100 (target: 90+)",
            "status": "warning",
            "howToFix": "Optimize for mobile: compress images to WebP, defer non-critical JS, reduce CSS file size. Mobile CPUs are 3-5x slower than desktop — what's fast on desktop is slow on mobile.",
            "whyMatters": "Over 65% of e-commerce traffic is mobile (Statista 2024). Google ranks based on mobile performance, not desktop. Mobile score <50 means you're penalized in mobile search."
          },
          {
            "name": "Touch Target Size",
            "status": "warning",
            "howToFix": "Ensure ALL interactive elements (buttons, links, form fields) are at least 48×48px with 8px minimum spacing between them. Pay special attention to: navigation menus, filter buttons, product variant selectors, and footer links.",
            "whyMatters": "Small tap targets cause 37% more mis-taps on mobile (Google UX research). In e-commerce, a mis-tap on 'Remove from cart' instead of 'Checkout' directly loses revenue."
          },
          {
            "name": "Font Size Readability",
            "status": "warning",
            "howToFix": "Set minimum 16px font size for body text. Use relative units (rem/em) instead of px for scalability. Product titles: 18px+, prices: 20px+, CTAs: 16px+ with bold.",
            "whyMatters": "Text smaller than 16px forces mobile users to pinch-zoom. This breaks the responsive layout and creates a frustrating experience. Users over 40 are especially affected — and they have the highest purchasing power."
          },
          {
            "name": "Content Fits Viewport",
            "value": "No horizontal scrolling needed",
            "status": "pass"
          },
          {
            "name": "Responsive Design Techniques",
            "status": "warning",
            "howToFix": "Implement responsive CSS with @media queries for key breakpoints: 480px (small mobile), 768px (tablet), 1024px (laptop). Use Flexbox and CSS Grid for fluid layouts.",
            "whyMatters": "Non-responsive sites are automatically penalized by Google in mobile search results. Since mobile-first indexing, this is a critical ranking factor."
          },
          {
            "name": "PWA Features",
            "value": "Has manifest, missing service worker",
            "status": "warning",
            "howToFix": "Add a service worker to enable PWA features. Register a service worker for offline caching and faster repeat visits.",
            "whyMatters": "PWA-enabled stores see 52% higher engagement and 36% higher conversion rates (Google case studies). Users can install the store as an app on their home screen."
          },
          {
            "name": "Theme Color",
            "status": "warning",
            "howToFix": "Add <meta name='theme-color' content='#your-brand-color'> to match your brand. Browsers use this to color the address bar, task switcher, and PWA chrome.",
            "whyMatters": "Theme-color creates a polished, branded mobile experience. It makes your site look native and professional — small detail, big perception impact."
          },
          {
            "name": "Mobile Navigation (Semantic)",
            "value": "<nav> element present — proper navigation landmark",
            "status": "pass"
          },
          {
            "name": "Responsive Images (srcset)",
            "value": "4 image(s) use srcset for responsive sizing",
            "status": "pass"
          },
          {
            "name": "Apple Mobile Web App",
            "value": "Missing: apple-mobile-web-app-capable, status-bar-style",
            "status": "warning",
            "howToFix": "Add: <meta name='apple-mobile-web-app-capable' content='yes'>, <meta name='apple-mobile-web-app-status-bar-style' content='default'>, <link rel='apple-touch-icon' href='/icon-180.png'>.",
            "whyMatters": "These tags enable 'Add to Home Screen' on iOS with a full-screen experience. 45% of mobile shoppers use iOS — a polished home screen presence increases return visits."
          },
          {
            "name": "Form Input Types",
            "value": "phone fields use type='text' instead of type='tel'",
            "status": "warning",
            "howToFix": "Use semantic input types: type='email' for email (shows @ keyboard), type='tel' for phone (shows number pad), type='search' for search (shows search button). These trigger optimized mobile keyboards.",
            "whyMatters": "Correct input types show specialized mobile keyboards — email keyboard with @, phone with number pad. This reduces input errors by 30% and speeds up form completion (Baymard Institute)."
          },
          {
            "name": "Text Overflow Handling",
            "value": "No word-break/overflow-wrap CSS detected",
            "status": "warning",
            "howToFix": "Add 'overflow-wrap: break-word' to your body or main content container. Without it, long URLs, product SKUs, or German compound words can break mobile layouts.",
            "whyMatters": "Long strings without word-break cause horizontal overflow on mobile — the #1 cause of 'content wider than viewport' failures. German/Finnish compound words and URLs are common culprits."
          },
          {
            "name": "Payment Methods Detected",
            "value": "Žiadna známa platobná brána nedetekovaná na homepage",
            "status": "info",
            "howToFix": "Payment gateway detection scanuje iba homepage. Ak sú platby na /checkout alebo sú načítané JS-om až po interakcii, neuvidíme ich. Zváž pridať platobné ikony do footer-u.",
            "whyMatters": "Viditeľné platobné ikony (Apple Pay, Google Pay, Klarna, Tatra Pay) v headeri/footeri zvyšujú conversion o 5-10 %. Trust signal pred checkoutom."
          },
          {
            "name": "Express Checkout (Apple Pay + Google Pay)",
            "status": "warning",
            "howToFix": "Pridaj Apple Pay + Google Pay cez Stripe/Adyen/Mollie. Biometric auth = -1 click checkout = vyšší conversion.",
            "whyMatters": "Mobile conversion pri express checkout je +15-25 % oproti klasickej karte. V SK/CZ trend roku 2025+."
          },
          {
            "name": "SK/CZ Local Payment Methods",
            "status": "fail",
            "fixLink": {
              "url": "https://www.inger.sk/#contact",
              "label": "Integrovať SK payments — Inger"
            },
            "howToFix": "Žiadna SK/CZ local payment metóda nedetekovaná. Integruj GoPay alebo ComGate — obe podporujú Tatra Pay, VÚB Pay, ČSOB Pay, Raiffeisen, QR platba v jednom API. Alternatívne Barion pre CZ trh.",
            "whyMatters": "SK/CZ shop bez bankových tlačidiel a QR platby = masívny cart abandonment. Priemerný SK e-shop má 6-8 payment metód — iba karta nestačí."
          }
        ]
      },
      "modules": [],
      "security": {
        "score": 90,
        "checks": [
          {
            "name": "SSL/TLS Certificate",
            "value": "Valid HTTPS connection established",
            "status": "pass"
          },
          {
            "name": "HTTP → HTTPS Redirect",
            "value": "HTTP properly redirects to HTTPS",
            "status": "pass"
          },
          {
            "name": "HSTS (Strict-Transport-Security)",
            "value": "max-age=31536000, preload, includeSubDomains",
            "status": "pass"
          },
          {
            "name": "Content-Security-Policy (CSP)",
            "value": "Present but uses 'unsafe-inline'",
            "status": "warning",
            "howToFix": "Remove 'unsafe-inline' by using nonces or hashes for inline scripts. Remove 'unsafe-eval' by eliminating eval() calls. These exceptions weaken CSP significantly.",
            "whyMatters": "'unsafe-inline' allows injected scripts to execute — defeating the main purpose of CSP. Major XSS protection is bypassed."
          },
          {
            "name": "Clickjacking Protection",
            "value": "X-Frame-Options: SAMEORIGIN, SAMEORIGIN",
            "status": "pass"
          },
          {
            "name": "X-Content-Type-Options",
            "value": "nosniff",
            "status": "pass"
          },
          {
            "name": "Referrer-Policy",
            "value": "strict-origin-when-cross-origin",
            "status": "pass"
          },
          {
            "name": "Permissions-Policy",
            "value": "geolocation=(), microphone=(), camera=(), payment=(), usb=(), interest-cohort=()",
            "status": "pass"
          },
          {
            "name": "Cookie Security Flags",
            "value": "No cookies set on initial response",
            "status": "pass"
          },
          {
            "name": "Technology Disclosure",
            "value": "Server: Apache (no version)",
            "status": "pass"
          },
          {
            "name": "Subresource Integrity (SRI)",
            "value": "No third-party scripts loaded",
            "status": "pass"
          },
          {
            "name": "security.txt (RFC 9116)",
            "value": "Present at /.well-known/security.txt",
            "status": "pass"
          },
          {
            "name": "Server Version Disclosure",
            "value": "Apache — version hidden",
            "status": "pass"
          },
          {
            "name": "CDN / WAF Protection",
            "status": "warning",
            "howToFix": "Add a CDN/WAF like Cloudflare (free tier), Sucuri, or Fastly. They provide DDoS protection, bot filtering, and SSL management.",
            "whyMatters": "Without a CDN/WAF, your origin server is directly exposed to DDoS attacks, bot traffic, and brute-force attempts. Cloudflare blocks 150+ billion daily threats."
          }
        ]
      },
      "tech_stack": [
        {
          "name": "Apache",
          "category": "server"
        }
      ],
      "performance": {
        "score": 100,
        "checks": [
          {
            "name": "Server Response Time (TTFB)",
            "value": "2ms",
            "status": "pass"
          },
          {
            "name": "First Contentful Paint (FCP)",
            "value": "0.57s",
            "status": "pass"
          },
          {
            "name": "Largest Contentful Paint (LCP)",
            "value": "0.69s — Core Web Vital ✓",
            "status": "pass"
          },
          {
            "name": "Total Blocking Time (TBT)",
            "value": "31ms",
            "status": "pass"
          },
          {
            "name": "Cumulative Layout Shift (CLS)",
            "value": "0.000 — Core Web Vital ✓",
            "status": "pass"
          },
          {
            "name": "Speed Index",
            "value": "0.71s",
            "status": "pass"
          },
          {
            "name": "Total Page Weight",
            "value": "424 KB (13 requests)",
            "status": "pass"
          },
          {
            "name": "Render-blocking Resources",
            "value": "No render-blocking resources found",
            "status": "pass"
          },
          {
            "name": "Unused Code (CSS + JS)",
            "value": "Only 0 KB of unused code — well optimized",
            "status": "pass"
          },
          {
            "name": "Text Compression (gzip/brotli)",
            "value": "All text resources properly compressed",
            "status": "pass"
          },
          {
            "name": "Resource Hints (Preload/Preconnect)",
            "value": "3 preload, 0 preconnect hint(s)",
            "status": "pass"
          },
          {
            "name": "Lazy Loading",
            "value": "71% of images use native lazy loading (5/7)",
            "status": "pass"
          },
          {
            "name": "Cache-Control Strategy",
            "value": "max-age=86400 + ETag",
            "status": "pass"
          },
          {
            "name": "Script Loading Strategy",
            "value": "100% of scripts use async/defer/module (0 async, 1 defer, 0 module)",
            "status": "pass"
          },
          {
            "name": "CSS File Count",
            "value": "1 CSS file(s) — well consolidated",
            "status": "pass"
          },
          {
            "name": "Font Preloading",
            "value": "2 font(s) preloaded — faster text rendering",
            "status": "pass"
          }
        ]
      },
      "ai_readiness": {
        "score": 65,
        "checks": [
          {
            "name": "AI Bot Access Policy",
            "value": "Explicitly allowed: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web",
            "status": "pass"
          },
          {
            "name": "llms.txt (AI Site Descriptor)",
            "value": "Valid llms.txt with 2481 chars — proper format with H1, links, summary",
            "status": "pass"
          },
          {
            "name": "llms-full.txt (Complete AI Content)",
            "status": "warning",
            "howToFix": "Create /llms-full.txt containing your complete site documentation in a single Markdown file — product catalog summaries, FAQs, policies, brand story. This gives AI models maximum context about your store.",
            "whyMatters": "llms-full.txt provides AI models with your entire site content in one parseable file. It's the difference between an AI having a brief overview vs. deep knowledge of your products and services."
          },
          {
            "name": "Content Accessibility for AI",
            "value": "21.7% text-to-HTML ratio — content is in HTML, not hidden in JS",
            "status": "pass"
          },
          {
            "name": "Structured Data Foundation",
            "value": "1 JSON-LD blocks with 9 schema types: PostalAddress, Offer, Service, WebSite, FAQPage, Question",
            "status": "pass"
          },
          {
            "name": "Product Schema Completeness",
            "status": "fail",
            "fixLink": {
              "url": "https://zulien.sk",
              "label": "Add Product schema →"
            },
            "howToFix": "Add complete Product JSON-LD schema: name, description, image, sku, brand, offers (price, priceCurrency, availability, seller), aggregateRating, review. This is mandatory for AI-powered commerce.",
            "whyMatters": "No Product schema = invisible to AI shopping. 58% of consumers now use AI for product discovery (Adobe 2025). Without Product schema, your products don't exist in this channel."
          },
          {
            "name": "Organization Schema + Entity Linking",
            "value": "Organization schema found but no sameAs links",
            "status": "warning",
            "howToFix": "Add sameAs array to your Organization schema linking to Wikipedia, LinkedIn, Facebook, Instagram, and other official profiles. This creates a Knowledge Graph entity for your brand.",
            "whyMatters": "sameAs links tell AI: 'This is the same entity across the web.' Sites with sameAs to Wikipedia are 3x more likely to appear in AI-generated answers. It's how Google builds Knowledge Panels."
          },
          {
            "name": "FAQ Schema (Direct AI Answers)",
            "value": "FAQPage structured data found — answers extractable by AI",
            "status": "pass"
          },
          {
            "name": "Breadcrumb Schema",
            "status": "warning",
            "howToFix": "Add BreadcrumbList schema reflecting your category hierarchy: Home → Category → Subcategory → Product. Each item needs name and URL.",
            "whyMatters": "AI assistants use breadcrumbs to understand product categorization and site structure. Without it, AI can't contextualize where products fit in your catalog — e.g., 'Running Shoes' under 'Sports > Footwear > Running'."
          },
          {
            "name": "Site Search Schema (SearchAction)",
            "status": "warning",
            "howToFix": "Add WebSite schema with potentialAction: SearchAction. Define your search URL template so AI assistants and Google can search your store programmatically.",
            "whyMatters": "SearchAction enables Google's sitelinks search box and allows AI shopping assistants to search your catalog directly. It's how AI agents find specific products in your store."
          },
          {
            "name": "Content Depth for AI",
            "value": "1356 words — rich content for AI analysis and citation",
            "status": "pass"
          },
          {
            "name": "Answer-First Content Format",
            "value": "Content doesn't start with a strong summary paragraph",
            "status": "warning",
            "howToFix": "Place your most important information in the first 100 words of the page. Use the BLUF method (Bottom Line Up Front): start with what the product IS and why it matters, then elaborate.",
            "whyMatters": "AI assistants extract content from the first 100 words to generate summaries. The LLMClicks analyzer found pages with answer-first format get 40% more AI citations. Most AI systems read top-down."
          },
          {
            "name": "Heading Hierarchy for AI",
            "value": "Proper structure: 1 H1 → 7 H2s → 14 H3s — clear content outline",
            "status": "pass"
          },
          {
            "name": "Semantic HTML Structure",
            "value": "4/6 semantic elements: <article>, <nav>, <main>, <footer>",
            "status": "pass"
          },
          {
            "name": "Structured Content (Lists & Tables)",
            "value": "8 lists found — consider adding comparison tables",
            "status": "warning",
            "howToFix": "Add comparison tables to your content. Use <ul>/<ol> for feature lists, specifications, and benefits. Use <table> for product comparisons, pricing tiers, and specifications. AI extracts structured content exponentially faster than paragraphs.",
            "whyMatters": "AI models are biased toward extracting data from HTML lists and tables. Perplexity and ChatGPT pull bullet points and table data with much higher accuracy than paragraph text. Structured content = more AI citations."
          },
          {
            "name": "Content Freshness Signals",
            "status": "fail",
            "howToFix": "Add dateModified and datePublished to your JSON-LD schema, and display a visible 'Last updated' date on the page. Update content quarterly at minimum. AI heavily favors fresh, maintained content.",
            "whyMatters": "No freshness signals = AI assumes your content is stale. ChatGPT and Perplexity both weight recency in their citation algorithms. Competitors who show recent updates will be cited instead of your static pages."
          },
          {
            "name": "Entity Clarity & Brand Signals",
            "value": "OG tags complete but no sameAs entity links",
            "status": "warning",
            "howToFix": "For full entity clarity: 1) Complete Open Graph tags (og:title, og:description, og:image, og:type), 2) Add sameAs in Organization schema linking to Wikipedia, LinkedIn, Facebook, and other profiles.",
            "whyMatters": "AI needs to confidently identify your brand entity. Open Graph + sameAs create a cross-platform identity that AI models recognize. The HubSpot AEO Grader found entity clarity is a top-3 factor for AI brand recognition."
          },
          {
            "name": "Author Expertise Signals (E-E-A-T)",
            "status": "warning",
            "howToFix": "For content pages (blog, guides, about): add Article/BlogPosting schema with author property linking to Person schema. Include the author's jobTitle, credentials, and social profiles.",
            "whyMatters": "AI models weight author expertise heavily. Pages from identified experts get cited 3x more than anonymous content. This is especially important for product guides, reviews, and advice content."
          },
          {
            "name": "Reviews & Ratings Schema",
            "status": "warning",
            "howToFix": "Add AggregateRating schema (ratingValue, reviewCount, bestRating) and individual Review schemas. AI shopping assistants prioritize products with verified reviews and ratings.",
            "whyMatters": "Products with star ratings appear in Google's rich results and get 35% more clicks. AI shopping assistants (ChatGPT, Bing Copilot) rank products with reviews significantly higher in recommendations."
          },
          {
            "name": "AI Plugin Manifest",
            "status": "warning",
            "howToFix": "Create /.well-known/ai-plugin.json if you have an API. This enables direct AI agent integration (ChatGPT Actions, custom GPTs). Include: name_for_model, description_for_model, auth config, and link to OpenAPI spec.",
            "whyMatters": "ai-plugin.json enables AI agents to interact with your store programmatically — search products, check prices, process orders. This is the bridge between AI assistants and your e-commerce functionality."
          },
          {
            "name": "Product Feed (AI Commerce)",
            "status": "warning",
            "howToFix": "Create a Google Merchant Center / product feed (XML or CSV). Expose it at a consistent URL and reference it in your sitemap. AI shopping assistants and comparison engines use product feeds for catalog discovery.",
            "whyMatters": "Product feeds power Google Shopping, Bing Shopping, and increasingly AI commerce. Without a structured product feed, AI agents can't efficiently index your full catalog for product recommendations."
          },
          {
            "name": "Speakable Content (Voice AI)",
            "status": "warning",
            "howToFix": "Add SpeakableSpecification schema to identify content sections suitable for voice assistants (Google Assistant, Alexa, Siri). Mark your product summaries and FAQs as speakable.",
            "whyMatters": "Voice AI commerce is growing rapidly. SpeakableSpecification tells voice assistants which content to read aloud. Early adoption positions your store for the voice shopping wave."
          },
          {
            "name": "Extractable Answer Blocks",
            "value": "29 paragraphs, avg 33 words — optimal for AI extraction",
            "status": "pass"
          },
          {
            "name": "Statistics & Data Presence",
            "value": "No statistical data found in content",
            "status": "warning",
            "howToFix": "Add numbers: pricing comparisons, performance metrics, customer statistics, industry benchmarks. Specific data (e.g., '99.9% uptime', '4.8/5 rating from 2,400 reviews') is what AI quotes most.",
            "whyMatters": "Content without data is 41% less likely to be cited by AI. Perplexity and ChatGPT specifically seek pages with quantified claims and verifiable statistics."
          },
          {
            "name": "Section Length Optimization",
            "value": "Avg section: 72 words — only 22% in 80-200 word optimal range",
            "status": "warning",
            "howToFix": "Restructure content into sections of 120-180 words between H2/H3 headings. Each section should cover one topic completely. Split sections over 300 words, expand sections under 80 words.",
            "whyMatters": "Pages with 120-180 word sections earn 70% more AI citations (Otterly Citation Economy 2026). For Google AI Overviews specifically, 100-150 words per section is the sweet spot."
          },
          {
            "name": "Q&A Format Headings",
            "value": "2 question heading(s) — add more",
            "status": "warning",
            "howToFix": "Phrase H2/H3 headings as questions: 'How does...?', 'What is...?', 'Why should...?' followed by a direct 1-2 sentence answer. This is the #1 format AI assistants use to generate responses.",
            "whyMatters": "AI search engines like Perplexity and ChatGPT match user questions to heading-answer pairs. Q&A format headings are directly extractable by AI and trigger FAQ-style rich results."
          },
          {
            "name": "Internal Link Density",
            "value": "3 contextual internal links per 1,000 words — strong knowledge graph signal",
            "status": "pass"
          },
          {
            "name": "Canonical Tag for AI Deduplication",
            "status": "fail",
            "howToFix": "Add <link rel='canonical' href='https://your-absolute-url'> to every page. This tells AI engines which URL is the authoritative version of this content.",
            "whyMatters": "Without a canonical tag, AI models may index multiple versions of the same page (with/without trailing slash, with parameters, etc.), diluting your AI visibility across duplicate URLs."
          },
          {
            "name": "Return Policy Schema",
            "status": "warning",
            "howToFix": "Add MerchantReturnPolicy schema with: returnPolicyCategory (e.g., MerchantReturnFiniteReturnWindow), merchantReturnDays, returnMethod, returnFees. Link it from Product/Offer via hasMerchantReturnPolicy.",
            "whyMatters": "AI shopping agents (Google Shopping, ChatGPT, Bing Copilot) filter by return flexibility. Products with return policy schema get priority placement in AI product comparisons."
          },
          {
            "name": "Shipping Details Schema",
            "status": "warning",
            "howToFix": "Add OfferShippingDetails schema with: shippingRate, shippingDestination, deliveryTime (handlingTime + transitTime). AI agents deprioritize products without shipping info.",
            "whyMatters": "Fulfillment speed now factors into AI product recommendations. Complete shipping schema means AI can show 'Free shipping, delivers in 2-3 days' — a massive conversion driver."
          },
          {
            "name": "Knowledge Graph Readiness",
            "value": "3/4 entity signals — strong Knowledge Graph presence",
            "status": "pass"
          },
          {
            "name": "Content Readability for AI",
            "value": "Grade 16 — too complex for broad AI citation",
            "status": "warning",
            "howToFix": "Simplify sentences (target 15-20 words average), use common words, break complex ideas into shorter paragraphs. AI extracts content for general audiences — if it's too academic, AI skips it.",
            "whyMatters": "Content above grade 12 readability is harder for AI to extract as clear, concise answers. Pages using clear headers and approachable language are 28% more likely to be cited by AI."
          },
          {
            "name": "Image Alt Text Quality for AI",
            "value": "57% good, 3 poor, 0 missing",
            "status": "warning",
            "howToFix": "Improve alt text: use 3-15 descriptive words per image. Include product name, key feature, and context. Bad: 'image1' or 'photo'. Good: 'Red leather wallet with RFID protection — front view'.",
            "whyMatters": "Google Lens processes 12B+ visual searches/month. AI uses alt text to understand images for visual search, product recommendations, and accessibility. Quality alt text = more discovery channels."
          },
          {
            "name": "Expert Quotations & Citations",
            "status": "warning",
            "howToFix": "Add 2-3 expert quotes or data citations per major page. Use <blockquote> for quotes and link to authoritative sources (.gov, .edu, Wikipedia, industry reports).",
            "whyMatters": "Content without citations or expert quotes appears unverified to AI. AI assistants prefer content backed by named sources, data references, and expert opinions."
          },
          {
            "name": "ai.txt (AI Permissions)",
            "status": "warning",
            "howToFix": "Create /ai.txt or /.well-known/ai.txt to declare granular AI permissions per content type: which AI actions (summarization, training, extraction) are allowed for which content sections.",
            "whyMatters": "ai.txt is an emerging standard (proposed May 2025) for fine-grained AI permissions beyond robots.txt. Early adoption signals AI-forward thinking and gives you control over how AI uses your content."
          },
          {
            "name": "WebMCP Agentic Readiness",
            "status": "warning",
            "howToFix": "WebMCP (W3C Community Group standard, Chrome 146+) lets pages declare structured tools for AI agents. Add toolname and tooldescription attributes to <form> elements, or include a <script type='application/webmcp+json'> manifest.",
            "whyMatters": "WebMCP is called 'the new Schema.org moment' — it's how AI agents will interact with your store (search products, add to cart, check availability). Google and Microsoft are co-developing this standard."
          },
          {
            "name": "Content-to-Boilerplate Ratio",
            "value": "97% of text in <main>/<article> — clean content signal",
            "status": "pass"
          },
          {
            "name": "Trust Widget",
            "value": "Žiaden trust widget (Heureka / Trustpilot / AggregateRating) nedetekovaný",
            "status": "warning",
            "howToFix": "Pre SK/CZ shopy: inštaluj Heureka Ověřeno zákazníky widget (zadarmo pre overených predajcov — https://sluzby.heureka.sk). Alternatívne: Trustpilot, Google Reviews s AggregateRating schema. Trust widget na product + kategória + footer.",
            "whyMatters": "SK/CZ kupujúci majú 2× vyššiu dôveru k Heureka Ověřeno ako k iným trust signálom (Heureka research 2024). LLM-y (ChatGPT, Perplexity) a Google SGE citujú shopy s AggregateRating schema prednostne."
          }
        ]
      },
      "vulnerability": {
        "score": 70,
        "checks": [
          {
            "name": "CMS Version Disclosure",
            "value": "No generator tag — CMS identity hidden",
            "status": "pass"
          },
          {
            "name": "Sensitive Files Exposed",
            "value": ".env, .git, composer.json — all properly blocked",
            "status": "pass"
          },
          {
            "name": "Install Script Exposed",
            "value": "No /install/ or /setup/ paths accessible",
            "status": "pass"
          },
          {
            "name": "Directory Listing",
            "value": "Disabled — file structure hidden",
            "status": "pass"
          },
          {
            "name": "Admin Panel at Default URL",
            "value": "Not found at common paths (/admin, /wp-admin, /administrator, /backoffice)",
            "status": "pass"
          },
          {
            "name": "Debug Mode / Error Exposure",
            "value": "No debug indicators found in page output",
            "status": "pass"
          },
          {
            "name": "Form CSRF Protection",
            "value": "1 form(s) without CSRF tokens",
            "status": "fail",
            "howToFix": "Add CSRF token validation to every form. Most CMS frameworks have built-in CSRF protection — make sure it's enabled on all forms, including search and newsletter signup.",
            "whyMatters": "CSRF is in the OWASP Top 10. Without tokens, attackers can craft pages that automatically submit forms on your site as the victim's browser session."
          },
          {
            "name": "SPF Record (Email Security)",
            "value": "SPF configured: v=spf1 a mx include:_spf.speedweb.sk -all",
            "status": "pass"
          },
          {
            "name": "DMARC Policy (Email Auth)",
            "status": "fail",
            "fixLink": {
              "url": "https://www.inger.sk/#contact",
              "label": "Get Email Security Setup →"
            },
            "howToFix": "Add a DMARC TXT record at _dmarc.yourdomain.com: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com — start with quarantine, then move to reject.",
            "whyMatters": "Without DMARC, attackers can send perfectly spoofed emails as your brand. Since May 2025, Google, Yahoo, and Microsoft require DMARC for bulk senders. Missing DMARC = email deliverability problems."
          },
          {
            "name": "Email Infrastructure",
            "value": "No MX records — domain does not receive email",
            "status": "info"
          },
          {
            "name": "Cross-Origin Isolation",
            "value": "COOP: same-origin, CORP: same-origin",
            "status": "pass"
          },
          {
            "name": "Server Error Leak",
            "value": "PHP/server error messages visible in page output",
            "status": "fail",
            "howToFix": "Set display_errors=Off in php.ini and log_errors=On. Configure a custom error page. Never show stack traces, SQL errors, or file paths to users.",
            "whyMatters": "Error messages reveal file paths, database structure, table names, and query logic. This is a goldmine for attackers — it turns a blind SQL injection into a targeted one, reducing attack time from days to minutes."
          }
        ]
      },
      "opendata_security": null
    },
    "created_at": "2026-04-23T17:44:12.354675+00:00",
    "status": "complete",
    "platform_detected": null,
    "company_ico": "50178831",
    "company_name": "Inger s.r.o.",
    "company_country": "SK",
    "company_nace": "7311",
    "company_size": "micro",
    "nis2_scope": "none",
    "nis2_sector": null,
    "company_risk_score": 20,
    "company_risk_level": "low"
  }
}