{
  "study": "great-britain-dental-2026",
  "title": "Websites of dental practices in Great Britain",
  "publisher": "TimeKairos",
  "page": "https://timekairos.com/research/uk-dental-websites-2026",
  "publishedOn": "2026-11-05",
  "measuredFrom": "2026-10-30",
  "measuredTo": "2026-11-05",
  "sampleFrozenOn": "2026-10-20",
  "engine": "AI X-Ray · research-xray-lab 1.2",
  "run": "RGFEAzwt2kt5",
  "seed": 4410,
  "note": "Percentages are counted over all 200 selected sites unless a different denominator is named. A site that could not be reached is counted neither as having a problem nor as free of it. Speed figures use the 137 sites whose speed could be measured, and say so: one site was fully checked but PageSpeed Insights returned no performance result for it.",
  "frame": {
    "onOpenStreetMap": 6617,
    "withWebsite": 1184,
    "eligible": 1183,
    "checked": 200,
    "fullyMeasured": 138,
    "speedMeasured": 137
  },
  "speed": {
    "lcpBands": {
      "good_under_2500ms": 19,
      "needsWork_2500_4000ms": 18,
      "poor_over_4000ms": 100,
      "notMeasured": 63
    },
    "clsBands": {
      "good": 117,
      "needsWork": 9,
      "poor": 11,
      "notMeasured": 63
    },
    "medians": {
      "lcpMs": 7695,
      "ttfbMs": 400,
      "pageSpeedScore": 68,
      "cls": 0.0008
    }
  },
  "shares": {
    "site_dead": {
      "count": 13,
      "of": 200,
      "percent": 6.5,
      "ci95": [
        3.8,
        10.8
      ],
      "definition": "Served no working home page in the measurement window: 8 domains had no DNS record, 4 servers returned HTTP 404, and 1 answered HTTP 200 with a registrar placeholder rather than a site. An HTTP status of 400 or above counts as not served. Contains no bot blocks, robots.txt refusals or offsite redirects. An observation over one window, not a claim of permanent unavailability."
    },
    "exposed_files": {
      "count": 5,
      "of": 200,
      "percent": 2.5,
      "ci95": [
        1.1,
        5.7
      ],
      "definition": "Files normally closed off were reachable over HTTP. Paths are not published and were not retained in the published dataset."
    },
    "domain_expiring": {
      "count": 13,
      "of": 200,
      "percent": 6.5,
      "ci95": [
        3.8,
        10.8
      ],
      "definition": "60 days or fewer remaining on the domain registration."
    },
    "no_https": {
      "count": 3,
      "of": 200,
      "percent": 1.5,
      "ci95": [
        0.5,
        4.3
      ],
      "definition": "A site that served no working home page is counted neither as having this problem nor as free of it."
    },
    "ssl_bad": {
      "count": 3,
      "of": 200,
      "percent": 1.5,
      "ci95": [
        0.5,
        4.3
      ],
      "definition": "Certificate invalid, or 60 days or fewer remaining with no automatic renewal detected."
    },
    "hacked": {
      "count": 0,
      "of": 200,
      "percent": 0,
      "ci95": [
        0,
        1.9
      ]
    },
    "no_local_biz": {
      "count": 95,
      "of": 200,
      "percent": 47.5,
      "ci95": [
        40.7,
        54.4
      ],
      "definition": "No schema.org LocalBusiness markup on the home page. A generic Organization node is not counted: it carries no address, opening hours or geo and produces no local result."
    },
    "no_schema": {
      "count": 43,
      "of": 200,
      "percent": 21.5,
      "ci95": [
        16.4,
        27.7
      ]
    },
    "no_desc": {
      "count": 23,
      "of": 200,
      "percent": 11.5,
      "ci95": [
        7.8,
        16.7
      ]
    },
    "no_sitemap": {
      "count": 14,
      "of": 200,
      "percent": 7,
      "ci95": [
        4.2,
        11.4
      ]
    },
    "noindex": {
      "count": 1,
      "of": 200,
      "percent": 0.5,
      "ci95": [
        0.1,
        2.8
      ]
    },
    "no_title": {
      "count": 0,
      "of": 200,
      "percent": 0,
      "ci95": [
        0,
        1.9
      ],
      "definition": "A site that served no working home page is counted neither as having this problem nor as free of it."
    },
    "no_messenger": {
      "count": 116,
      "of": 200,
      "percent": 58,
      "ci95": [
        51.1,
        64.6
      ]
    },
    "no_form": {
      "count": 80,
      "of": 200,
      "percent": 40,
      "ci95": [
        33.5,
        46.9
      ]
    },
    "no_tel": {
      "count": 37,
      "of": 200,
      "percent": 18.5,
      "ci95": [
        13.7,
        24.5
      ]
    },
    "cta_broken": {
      "count": 6,
      "of": 200,
      "percent": 3,
      "ci95": [
        1.4,
        6.4
      ]
    },
    "no_alt": {
      "count": 38,
      "of": 200,
      "percent": 19,
      "ci95": [
        14.2,
        25
      ]
    },
    "small_text": {
      "count": 14,
      "of": 200,
      "percent": 7,
      "ci95": [
        4.2,
        11.4
      ]
    },
    "no_viewport": {
      "count": 7,
      "of": 200,
      "percent": 3.5,
      "ci95": [
        1.7,
        7
      ],
      "definition": "No mobile viewport setting carrying width=device-width or initial-scale=1. This is the presence of the setting, not a judgement on mobile usability."
    },
    "overflow": {
      "count": 0,
      "of": 200,
      "percent": 0,
      "ci95": [
        0,
        1.9
      ]
    }
  },
  "unreachable": {
    "total": 13,
    "noDnsRecord": 8,
    "hostUnreachable": 0,
    "notFound": 4,
    "parkedPlaceholder": 1
  },
  "notMeasuredReasons": {
    "total": 62,
    "botChallenge": 20,
    "other": 15,
    "offsiteRedirect": 11,
    "deadDomain": 8,
    "httpError": 4,
    "robotsDisallowed": 2,
    "timeout": 1,
    "placeholderPage": 1,
    "deadDomain_breakdown": {
      "noDnsRecord": 8,
      "hostUnreachable": 0
    },
    "botChallenge_breakdown": {
      "unnamedFilter": 12,
      "cloudflare": 8,
      "note": "Repeated crawling of the same sample while the auditor was being corrected is part of the cause: eleven SiteGround-hosted sites began answering with an HTTP 202 \"Robot Challenge Screen\" that never clears."
    },
    "other_breakdown": {
      "emptyShell": 11,
      "connectionFailures": 4,
      "connectionErrors": {
        "ERR_CONNECTION_TIMED_OUT": 3,
        "ERR_CONNECTION_RESET": 1
      },
      "note": "An empty shell is a real <head> over a body with no text, as served behind an interstitial or by an unhydrated single-page app. The connection failures fell on both 2026-10-30 and 2026-11-05 rather than clustered."
    }
  },
  "limits": [
    "Only practices whose website OpenStreetMap records — about one in six (1184 of 6617). Not a slice of the whole industry.",
    "200 of 1183 eligible sites: a sample of the list, not most of it. Every share is an estimate; see ci95.",
    "20 of the 200 sites (one in ten) refused the crawler: 12 behind an unnamed filter, 8 behind Cloudflare. Repeated crawling of the same sample is part of the cause; a block is partly a fact about the measurement, not only about the site.",
    "Three sites stayed behind a self-reloading \"One moment, please…\" wall when checked by hand from a clean browser. Their rows come from reads that got through, corroborated by PageSpeed Insights scores fetched from Google's infrastructure; they could not be confirmed a second time by hand.",
    "Home page only.",
    "Measured 2026-10-30 to 2026-11-05 (56 sites on 30 October, 144 on 5 November); the list was fixed on 2026-10-20.",
    "Source is OpenStreetMap, which is not an official business register.",
    "Speed is measured in a mobile profile; lab figures, not field data.",
    "An automated check is not a full audit and does not prove the absence of other problems; nothing here measures the quality of dentistry.",
    "Unreachable sites are counted as neither having nor lacking a given problem.",
    "No data on these businesses' calls or revenue; no causal claim is made."
  ],
  "samplingScope": {
    "country": "Great Britain",
    "nationwide": true,
    "query": "OpenStreetMap Overpass, area ISO3166-1=GB, dental tags carrying website or contact:website",
    "coverage": "OpenStreetMap records a website for roughly one dental practice in six (1184 of 6617). Practices absent from it, or with the field empty, were never in scope. This is not a slice of the whole industry.",
    "sources": {
      "openStreetMap": 1184,
      "candidatesTotal": 1184,
      "excluded": {
        "outsideMarket": 1
      },
      "eligible": 1183,
      "checked": 200
    },
    "cityList": "A list of cities is used only to label each record with a stratum; a practice more than 40 km from any listed city is placed in the \"smaller towns\" stratum, never excluded.",
    "cityStrata": {
      "intendedPercent": {
        "londonAndLargestMetros": 30,
        "largeCities": 40,
        "smallerTowns": 30
      },
      "actualPercent": {
        "londonAndLargestMetros": 30,
        "largeCities": 40,
        "smallerTowns": 30
      },
      "note": "The quota was met exactly: 60, 80 and 60 sites."
    },
    "largestCity": {
      "name": "London",
      "sites": 60,
      "ofSample": 200
    }
  },
  "measurement": {
    "speed": {
      "metric": "LCP (Largest Contentful Paint)",
      "type": "lab",
      "provider": "Google PageSpeed Insights API (Lighthouse)",
      "strategy": "mobile",
      "runsPerSite": 5,
      "aggregation": "median",
      "note": "Lab data from Lighthouse via the PSI API, not Google field data from real users (CrUX)."
    },
    "everythingElse": {
      "provider": "TimeKairos analyser (AI X-Ray)",
      "covers": [
        "reachability",
        "TTFB",
        "TLS and domain expiry",
        "exposed server files",
        "structured data",
        "contact paths",
        "mobile viewport and text size",
        "image alt text"
      ],
      "note": "Our own crawl and analysis; no third-party service involved in these checks."
    }
  },
  "precision": {
    "method": "Each share carries its 95% Wilson confidence interval (ci95), in percentage points, computed over the 200 selected sites.",
    "reads": "The range that, with 95% confidence, holds the true share among all eligible sites on the list. A different draw of the same size could land anywhere inside it."
  }
}
