{
  "subject": "https://field-shelters.co.uk/",
  "audit_date": "2026-11-12",
  "sampled_urls": 9,
  "unique_links_tested": 27,
  "successful_links": 27,
  "sampled_image_tags": 110,
  "missing_alt_attributes": 0,
  "lighthouse_version": "12.8.2",
  "mobile": {
    "performance": 65,
    "accessibility": 84,
    "best_practices": 96,
    "lighthouse_seo": 100,
    "fcp_s": 2.9,
    "lcp_s": 14.7,
    "speed_index_s": 6.0,
    "tti_s": 16.9,
    "tbt_ms": 60,
    "cls": 0,
    "transfer_bytes": 3314293,
    "requests_observed": 68
  },
  "desktop": {
    "performance": 52,
    "accessibility": 84,
    "best_practices": 96,
    "lighthouse_seo": 100,
    "fcp_s": 1.7,
    "lcp_s": 3.4,
    "speed_index_s": 2.6,
    "tti_s": 3.7,
    "tbt_ms": 10,
    "cls": 0.37,
    "transfer_bytes": 3326268
  },
  "findings": [
    {
      "id": "FS-01",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "critical",
      "title": "Homepage canonical points to a non-resolving domain",
      "evidence": "Both / and /index.php declare <link rel=\"canonical\" href=\"https://field-shelter.co.uk\">. The singular field-shelter.co.uk host did not resolve during testing.",
      "impact": "This gives search engines a strong consolidation signal toward a different, unavailable host. It can undermine the canonical URL signals for the real homepage.",
      "action": "Change the canonical to https://field-shelters.co.uk/ and 301 /index.php to /. Inspect the homepage in Google Search Console after deployment.",
      "phase": "0\u201372 hours",
      "effort": "Small"
    },
    {
      "id": "FS-02",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "high",
      "title": "Duplicate homepage and arbitrary query URLs return 200",
      "evidence": "/ and /index.php return the same content with HTTP 200. A spam-shaped query-string URL also returned the normal homepage with HTTP 200.",
      "impact": "Multiple crawlable URLs can dilute internal signals and waste crawl attention. This is a canonicalisation issue, not an automatic \u201cduplicate content penalty\u201d.",
      "action": "Use one clean homepage URL, redirect index.php, and define a deliberate policy for irrelevant query parameters. Do not blanket-block URLs before Search Console inspection.",
      "phase": "0\u201372 hours",
      "effort": "Small"
    },
    {
      "id": "FS-03",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "medium",
      "title": "robots.txt and sitemap.xml are absent",
      "evidence": "https://field-shelters.co.uk/robots.txt and /sitemap.xml both returned HTTP 404.",
      "impact": "A missing robots file does not itself block crawling, and a sitemap is not a ranking guarantee. However, the site loses a reliable discovery and crawl-management mechanism.",
      "action": "Publish a valid XML sitemap containing only canonical 200-status URLs and a minimal robots.txt referencing it. Submit the sitemap in Search Console and Bing Webmaster Tools.",
      "phase": "0\u20137 days",
      "effort": "Small"
    },
    {
      "id": "FS-04",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "high",
      "title": "Subpages lack canonicals; price-page titles are duplicated",
      "evidence": "Seven of nine sampled URLs have no canonical. The 16 mm and 19 mm field-shelter price pages share one title; the two stable price pages share another.",
      "impact": "Search engines and users cannot easily distinguish cladding variants, and each page must self-define its preferred URL without a canonical signal.",
      "action": "Add self-referencing canonicals and unique titles such as \u201c16 mm Shiplap Field Shelter Prices\u201d and \u201c19 mm Loglap Field Shelter Prices\u201d. Preserve existing URLs during any rebuild.",
      "phase": "0\u20137 days",
      "effort": "Small"
    },
    {
      "id": "FS-05",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "high",
      "title": "Heading hierarchy is used for styling rather than meaning",
      "evidence": "The homepage has six H1 elements, including a long paragraph. Town names are H4s, product cards use H6, and specifications.php has no H1.",
      "impact": "The page becomes harder for assistive technology and machine readers to interpret. Important product and service relationships are obscured.",
      "action": "Use one descriptive H1 per page, logical H2/H3 sections, and ordinary lists for locations. Match visual size with CSS rather than heading level.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-06",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "medium",
      "title": "Metadata is repetitive and social metadata is absent",
      "evidence": "No Open Graph or Twitter Card tags were found on the nine sampled URLs. Price-page descriptions repeat, and the homepage description contains \u201cStaic\u201d.",
      "impact": "Shared links lack controlled titles, descriptions, and imagery. Repetitive search snippets reduce differentiation between commercially important pages.",
      "action": "Write unique search and social metadata for every indexable page. Add a deliberate 1200 \u00d7 630 sharing image using a real project photograph.",
      "phase": "0\u201314 days",
      "effort": "Small"
    },
    {
      "id": "FS-07",
      "category": "seo",
      "category_label": "Technical SEO",
      "severity": "high",
      "title": "Large location lists and off-topic copy weaken page focus",
      "evidence": "The footer contains a very large A\u2013Z town list. The homepage repeats delivery notices three times; specifications.php includes extensive garden-shed sales copy.",
      "impact": "This reads as legacy keyword targeting rather than helpful location information, adds substantial page length, and dilutes the field-shelter/stable topic.",
      "action": "Replace lists with concise delivery coverage and a postcode checker. Create location content only where there is unique, useful proof. Remove copied shed copy from equestrian specifications.",
      "phase": "Rebuild",
      "effort": "Medium"
    },
    {
      "id": "FS-08",
      "category": "seo",
      "category_label": "Content & local SEO",
      "severity": "high",
      "title": "Business details and content quality need verification",
      "evidence": "Opening hours appear as 4:45 pm on some pages and 5:00 pm elsewhere. The visible postcode is rendered \u201cS051 0PW\u201d. Copy includes \u201cSubcribe\u201d, \u201cContacts us\u201d, \u201cHamphire\u201d, and other errors.",
      "impact": "Inconsistent facts reduce buyer confidence and make entity information less reliable for search and answer systems.",
      "action": "Confirm one authoritative name, address, phone, hours, postcode, email, company number, and VAT record. Proofread all migrated copy with the business owner.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-09",
      "category": "aeo",
      "category_label": "AEO / GEO",
      "severity": "high",
      "title": "No structured data was found on any sampled page",
      "evidence": "The nine-URL crawl found no JSON-LD for Organisation/LocalBusiness, Product/Offer, BreadcrumbList, or FAQs.",
      "impact": "Machines receive less explicit confirmation of the business, products, prices, and page relationships. Schema is not a ranking or rich-result guarantee.",
      "action": "Add valid, visible-content-matched Organisation/LocalBusiness, Product/Offer, and BreadcrumbList markup. Add FAQ markup only to genuine visible FAQs and follow current search-engine eligibility rules.",
      "phase": "Rebuild",
      "effort": "Medium"
    },
    {
      "id": "FS-10",
      "category": "aeo",
      "category_label": "AEO / GEO",
      "severity": "high",
      "title": "Useful buying information is not organised as direct answers",
      "evidence": "Sizes, VAT-inclusive prices, skids, roofing, delivery, assembly, and wind notes exist, but there is no focused FAQ or buyer-guide architecture.",
      "impact": "Valuable answers are buried in long sales copy, making comparison and extraction harder for prospects and answer engines.",
      "action": "Create concise answer blocks for mobile vs static, sizes, cladding, skids, roofing, tack rooms, VAT, delivery/offloading, assembly, maintenance, and planning considerations.",
      "phase": "Rebuild",
      "effort": "Medium"
    },
    {
      "id": "FS-11",
      "category": "aeo",
      "category_label": "AEO / GEO",
      "severity": "high",
      "title": "Field Shelters and Foster Fencing lack a clear entity relationship",
      "evidence": "The domain and product language use Field Shelters while the logo, testimonials, email, and footer identify Foster Fencing Ltd. No organisation schema explains the relationship.",
      "impact": "A prospect or machine may be unsure whether these are separate businesses, a trading name, or a product division.",
      "action": "State the relationship plainly: the approved legal entity, trading/site name, workshop address, and parent website. Use consistent naming and organisation identifiers.",
      "phase": "0\u201314 days",
      "effort": "Small"
    },
    {
      "id": "FS-12",
      "category": "aeo",
      "category_label": "AEO / GEO",
      "severity": "medium",
      "title": "No linked social or authoritative entity profiles in sampled HTML",
      "evidence": "No social-profile links or sameAs markup were found in the nine sampled pages. This does not prove the business has no social accounts.",
      "impact": "The website misses an opportunity to connect first-party entity information with external proof and current project media.",
      "action": "After verifying ownership, link the correct Google Business Profile and active social profiles. Reference them with appropriate organisation markup; do not invent profiles.",
      "phase": "Rebuild",
      "effort": "Small"
    },
    {
      "id": "FS-13",
      "category": "performance",
      "category_label": "Performance",
      "severity": "high",
      "title": "Mobile largest contentful paint measured 14.7 seconds",
      "evidence": "Lighthouse 12.8.2 mobile lab run: performance 65, FCP 2.9 s, LCP 14.7 s, Speed Index 6.0 s, TTI 16.9 s. Desktop LCP was 3.4 s and CLS 0.37.",
      "impact": "The main product visual takes too long to become useful under the simulated mobile connection. This is lab evidence, not a claim about every real visitor.",
      "action": "Replace the auto-loading hero carousel with one responsive, preloaded hero image; minimise render-blocking work and validate improvements across multiple runs and real-user data.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-14",
      "category": "performance",
      "category_label": "Performance",
      "severity": "high",
      "title": "Five hero backgrounds consume about 71% of the mobile page transfer",
      "evidence": "The five banner JPEGs total 2,367,078 bytes. The full mobile run transferred 3,314,293 bytes across 68 observed requests; images accounted for 2,575,898 bytes.",
      "impact": "Visitors download carousel imagery they may never see while the primary content competes for the same connection.",
      "action": "Load only the active hero. Produce correctly sized AVIF/WebP sources with a JPEG fallback, and defer all non-critical galleries.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-15",
      "category": "performance",
      "category_label": "Performance",
      "severity": "high",
      "title": "Images lack dimensions, lazy loading, and modern delivery",
      "evidence": "Across the nine sampled HTML documents, all 110 image tags lacked explicit width/height and native lazy loading. Lighthouse estimated 967 KiB savings from modern formats.",
      "impact": "Oversized images increase transfer and unsized media can contribute to layout instability. Below-fold imagery is fetched earlier than necessary.",
      "action": "Set intrinsic dimensions, use responsive srcset/sizes, lazy-load below-fold media, and retain meaningful alt text. Keep the LCP image eager and high priority.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-16",
      "category": "performance",
      "category_label": "Performance",
      "severity": "medium",
      "title": "Render-blocking assets and weak cache policy add delay",
      "evidence": "Homepage HTML references 14 stylesheets and 18 external scripts. Lighthouse estimated 1.52 s render-blocking savings on mobile and flagged 47 resources for cache policy.",
      "impact": "Legacy bundles and short/absent caching increase repeated work and delay rendering, especially on return visits and slower devices.",
      "action": "Remove unused libraries, bundle only necessary CSS/JS, defer non-critical scripts, use font-display: swap, preconnect deliberately, and set versioned long-lived static caching.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-17",
      "category": "performance",
      "category_label": "Front-end quality",
      "severity": "high",
      "title": "Homepage throws a jQuery runtime error",
      "evidence": "Browser testing recorded \u201cReferenceError: jQuery is not defined\u201d at the homepage inline script around line 301. Lighthouse also flagged the console error.",
      "impact": "A failed initialisation path can break interface behaviour and makes future regressions harder to detect.",
      "action": "Remove the duplicate/early initialisation or execute it only after dependencies load. Add automated smoke tests for navigation, carousel, gallery, forms, and console errors.",
      "phase": "0\u20137 days",
      "effort": "Small"
    },
    {
      "id": "FS-18",
      "category": "ux",
      "category_label": "Mobile UX / CRO",
      "severity": "high",
      "title": "The mobile homepage is approximately 26 viewport heights long",
      "evidence": "At a 390 \u00d7 844 viewport the document measured 21,808 px high. There was no horizontal overflow, which is a positive.",
      "impact": "Pricing, proof, delivery details, and contact options are separated by long repeated sections. The page asks substantial scrolling before helping a visitor act.",
      "action": "Create a concise mobile-first journey: value proposition, product choices, starting prices, proof, delivery, FAQs, and persistent call/quote actions. Move detail to focused pages.",
      "phase": "Rebuild",
      "effort": "Large"
    },
    {
      "id": "FS-19",
      "category": "ux",
      "category_label": "Mobile UX / CRO",
      "severity": "high",
      "title": "No structured quotation journey for a high-consideration purchase",
      "evidence": "The homepage offers a phone CTA and newsletter; product pages provide an email link. There is no onsite project-quote form or product configuration path.",
      "impact": "Prospects must translate their size, cladding, roof, skid, access, and delivery needs into an unassisted call or email.",
      "action": "Add a short quote flow capturing product, size, cladding, mobile/static, roof, add-ons, postcode, access notes, and preferred contact. Keep click-to-call visible.",
      "phase": "Rebuild",
      "effort": "Large"
    },
    {
      "id": "FS-20",
      "category": "ux",
      "category_label": "Mobile UX / CRO",
      "severity": "medium",
      "title": "Some controls are misleading or point to the wrong content",
      "evidence": "The Field Shelter with Skids thumbnail links to gallery3-lrg.jpg, the same large image as Stable Block. Several \u201cView Prices\u201d links on product pages point only to #.",
      "impact": "Visitors cannot reliably inspect the promised product and may interpret non-functional controls as a lack of care.",
      "action": "Link the correct shelter image, remove placeholder # controls, and use descriptive anchor text rather than \u201cClick Here\u201d. Test every product action before launch.",
      "phase": "0\u20137 days",
      "effort": "Small"
    },
    {
      "id": "FS-21",
      "category": "ux",
      "category_label": "Mobile UX / CRO",
      "severity": "medium",
      "title": "Strong proof is weakened by presentation and freshness signals",
      "evidence": "The site has genuine project imagery, testimonials, prices, and a 1983 founding claim, but reviews are undated and the footer says Copyright 2020.",
      "impact": "The business has valuable trust assets, yet visitors cannot easily judge recency or connect each review to a relevant project.",
      "action": "With permission, organise reviews by product/location/date and add project case studies. Update the footer automatically and verify all founding, guarantee, and pricing claims.",
      "phase": "Rebuild",
      "effort": "Medium"
    },
    {
      "id": "FS-22",
      "category": "accessibility",
      "category_label": "Accessibility",
      "severity": "high",
      "title": "Text contrast fails across 58 audited nodes",
      "evidence": "Lighthouse/axe listed 58 contrast failures in the mobile run. Green links #72c02c on white measured 2.26:1 where normal text requires 4.5:1.",
      "impact": "Low-vision users may struggle to read links and delivery information. This is a usability issue as well as a WCAG risk.",
      "action": "Define accessible colour tokens, retest every component state, and do not rely on colour alone to identify links. Target WCAG 2.2 AA contrast.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-23",
      "category": "accessibility",
      "category_label": "Accessibility",
      "severity": "high",
      "title": "Carousel, map, and menu accessible names are incomplete",
      "evidence": "Axe flagged two listboxes without accessible names, one unnamed option, a Google Maps iframe without a title, and a visible \u201cMENU\u201d label absent from the button accessible name.",
      "impact": "Screen-reader users receive unclear or incomplete control descriptions.",
      "action": "Prefer a static hero. If carousels remain, implement correct semantics and controls; title the map iframe and make the menu accessible name include its visible label.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    },
    {
      "id": "FS-24",
      "category": "accessibility",
      "category_label": "Accessibility",
      "severity": "medium",
      "title": "Structural navigation needs accessibility repair",
      "evidence": "The sampled homepage has no skip link, invalid heading order, and footer links distinguished only by colour. Automated testing is not a complete WCAG audit.",
      "impact": "Keyboard and screen-reader navigation requires more effort, and important landmarks are harder to understand.",
      "action": "Add skip navigation, landmarks, logical headings, visible focus, underlined inline links, keyboard testing, zoom/reflow testing, and manual screen-reader checks.",
      "phase": "Rebuild",
      "effort": "Medium"
    },
    {
      "id": "FS-25",
      "category": "security",
      "category_label": "Security & maintenance",
      "severity": "high",
      "title": "End-of-life jQuery 2.2.0 has known vulnerability advisories",
      "evidence": "The served file identifies jQuery 2.2.0. Retire.js 6.1.1 flagged end-of-life status plus CVE-2015-9251, CVE-2019-11358, CVE-2020-11022, and CVE-2020-11023. Bootstrap is 4.0.0-alpha.6.",
      "impact": "The front end relies on unsupported dependencies. Version detection confirms exposure to advisories, not that this site has been exploited.",
      "action": "Remove unnecessary legacy code or upgrade after compatibility testing. Review Bootstrap and all plugins, then add dependency monitoring and a patch owner.",
      "phase": "0\u201372 hours",
      "effort": "Medium"
    },
    {
      "id": "FS-26",
      "category": "security",
      "category_label": "Security & maintenance",
      "severity": "high",
      "title": "Baseline browser security headers and server hardening are missing",
      "evidence": "Responses lacked HSTS, Content-Security-Policy, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, and clickjacking protection. X-Powered-By exposes PHP 8.3.36 and PleskLin.",
      "impact": "The site lacks several defence-in-depth controls. Missing headers do not prove a compromise, and PHP 8.3 itself should not be described as obsolete.",
      "action": "Add and test an appropriate header baseline, including CSP report-only before enforcement. Suppress version disclosure and verify secure cookie attributes where applicable.",
      "phase": "0\u20137 days",
      "effort": "Medium"
    },
    {
      "id": "FS-27",
      "category": "security",
      "category_label": "Index & security integrity",
      "severity": "critical",
      "title": "Unrelated spam-titled URL appears in search results \u2014 investigation required",
      "evidence": "A site-restricted search surfaced a \u201cCooltamil\u2026\u201d title on a long field-shelters.co.uk query URL. Direct retrieval on 12 November 2026 returned the ordinary homepage, not spam content.",
      "impact": "This may be stale/parasite indexing or a historical issue; the audit does not confirm an active hack. It nevertheless warrants urgent index and host investigation.",
      "action": "Inspect the exact URL in Search Console, review indexed URL anomalies, check server/file/logs and scheduled tasks with the host, rotate credentials if evidence warrants, and request reindexing after cleanup.",
      "phase": "0\u201372 hours",
      "effort": "Unknown"
    },
    {
      "id": "FS-28",
      "category": "security",
      "category_label": "Privacy & trust",
      "severity": "medium",
      "title": "Newsletter processing and privacy information need alignment",
      "evidence": "The newsletter posts names/emails to email.mailweavers.co.uk. The privacy link leads to the Foster Fencing domain, whose policy says data is not shared with third parties except limited legal circumstances.",
      "impact": "The external processor relationship and the wording of the notice may not align. This is a review item, not a legal conclusion.",
      "action": "Have the data controller/legal adviser verify processor disclosures, lawful basis, retention, consent records, and cookie behaviour. Place a concise privacy link beside the form.",
      "phase": "0\u201314 days",
      "effort": "Medium"
    }
  ]
}