8 public marketing routes audited against 84 applicable checks across 18 categories. Scored against what a crawler actually receives from the live Netlify deployment.
Scored over the 12 page-scoped categories. Site-wide checks (robots, sitemap, analytics, social, DNS, llms.txt) are scored once in the panel below.
| Route | Score | Status | Meta | OG | JSON-LD | Headings | Images | Words | Critical | |
|---|---|---|---|---|---|---|---|---|---|---|
| / | 55% | Fair | 1,141 | 4 | ||||||
| /services | 53% | Fair | 836 | 4 | ||||||
| /how-we-work | 53% | Fair | 1,104 | 4 | ||||||
| /our-radiologists | 55% | Fair | 704 | 4 | ||||||
| /pricing | 51% | Fair | 630 | 5 | ||||||
| /about | 55% | Fair | 708 | 4 | ||||||
| /for-radiologists | 55% | Fair | 580 | 4 | ||||||
| /contact | 52% | Fair | 195 | 5 |
Infrastructure and domain-level signals, checked once against the live deployment and DNS.
/robots.txt returns HTTP 200 with the SPA shell. Crawlers parse HTML
as robots directives and get nothing usable.frontend/public/.
Links pasted into Slack, LinkedIn or email render as bare text.application/ld+json blocks site-wide. No Organization,
MedicalBusiness, WebSite, Service, FAQPage or BreadcrumbList.favicon.svg and favicon.ico return 200.google-site-verification=6XJWVOqHL_73fhFX… is live. Property
is verified but has no sitemap to submit yet.v=spf1 include:_spf.google.com ~all;
DMARC p=quarantine with an rua address.A category check passes only when it passes on every applicable page. 40 of 84 applicable checks pass.
26 distinct findings. Counts in parentheses are the number of failing checks folded into each group.
<app-root>. Non-JS crawlers and most LLM crawlers index
nothing. This single defect is what caps every content, heading and keyword category below.<link rel="canonical"> anywhere.
With an SPA that serves identical HTML on every path, this is an active duplicate-content risk.frontend/public/, so Open Graph cannot be completed without producing one first.H4 headings directly
after an H2 on every page. /contact is worst: H1 jumps straight to
H4 with no H2 or H3 in between./services
("Every modality. Every hour. Any volume."), /how-we-work, /pricing and
/contact. Strong marketing copy, but it gives search engines no topical signal./, /how-we-work and /our-radiologists. Unreserved layout space is a
direct CLS risk.cxr.png is 484KB. All 6 images are PNG or JPEG.
The scan assets total 1.5MB and push the home page to a 1.83MB transfer./contact. Healthcare buyers expect a callable number, and both are prerequisites for any
location or MedicalBusiness schema.Worth stating plainly, because the delivery pipeline is in better shape than the score suggests.
media="print" with an onload swap, fonts declare font-display:swap, and all
bundles are minified. Zero console errors on all 8 routes. DOM sizes are 187-554 nodes against a
1,500 ceiling.nav, main, header, footer and
section are used correctly throughout, lang="en" is set, and all 13 inputs on
the contact form have associated labels.p=quarantine) both configured, and Search Console already verified by DNS TXT record.Every failed check converted to a specific task, ordered Critical then High then Medium.
These items need an account or credential and cannot be completed without you.
No action needed. The DNS TXT record
google-site-verification=6XJWVOqHL_73fhFX… is live on astrarad.com, so the property is
already verified. Once sitemap.xml ships, submit it under Indexing > Sitemaps and the pipeline is
complete.
Nothing is tracking today. Without this there is no way to prove any of the work below moved traffic.
G-)G- ID, and it gets wired into all 8 routes with
SPA route-change pageview tracking.Only worth it if you want to add or remove tracking tags without a redeploy. GA4 alone is enough to close the analytics gap.
GTM-)GTM- ID. Skip this entirely if GA4 covers your needs.Three social checks fail and the Organization schema sameAs array cannot be
populated without real profile URLs. A LinkedIn company page matters most for a clinical B2B buyer.
Neither appears anywhere on the site. Both Local Business checks fail, and the
Organization schema cannot carry a contactPoint without a number.