UMBRACO SEO AUDIT · RAZOR VIEWS · CONTENT COMPOSITION · STRUCTURED DATA

Free Umbraco SEO Audit

Umbraco SEO depends on SEO composition field configuration, Razor template meta tag output, content tree URL structure, JSON-LD in Razor views, XML sitemap generation, and ASP.NET Core performance. DeepSEOAnalysis audits your live Umbraco site — validating composition field output in the server-rendered HTML, structured data completeness, sitemap coverage, real CrUX Core Web Vitals, and AI visibility — with Razor C# snippets and backoffice configuration paths for every finding.

Audit my Umbraco site →How we score

WHAT WE CHECK

6 Umbraco-specific SEO checks

Umbraco SEO auditing covers SEO composition field configuration and Razor template meta tag output, content tree URL structure and redirect tracking, JSON-LD in Razor views, XML sitemap coverage and content type inclusion, Core Web Vitals from real CrUX data, and AI visibility — with Razor C# property access patterns and Umbraco backoffice paths for each finding.

🔧

SEO composition fields and Razor template meta tag output

Umbraco SEO is typically implemented via a shared property composition added to all content types (a set of SEO fields — seoTitle, metaDescription, og:image, noIndex, canonicalOverride — visible in the backoffice editor for every content node). The audit checks the server-rendered HTML of every crawled page for: `title` tag presence and uniqueness (if every page shares the same title pattern like "@Model.Name | Site Name" without using the seoTitle composition field, titles will be generic and non-optimised — a common setup gap); `meta name="description"` presence and character length (50–160 characters); Open Graph tags (`og:title`, `og:description`, `og:image` with an absolute URL, `og:url`); canonical tag self-reference (pages without a canonical override must have a self-referencing canonical matching the page\'s own absolute URL; pages with an override must point to the correct target); and robots meta tag (pages with noIndex set to true in the composition must carry `meta name="robots" content="noindex"`, and indexable pages must not). Common gaps: the SEO composition is created in the backoffice but the Razor layout still uses `@Model.Name` for the title rather than `@(Model.Value<string>("seoTitle") ?? Model.Name)`; og:image is defined in the composition but the image property value isn\'t fetched via `Model.Value<IPublishedContent>("ogImage")?.Url()` correctly. The audit identifies all gaps across crawled pages with the Razor property access pattern for each fix.

🔗

URL structure from content tree and routing configuration

Umbraco\'s URL structure mirrors its content tree — nodes, their names, and the tree hierarchy directly determine the URL path. The audit checks: node slug quality (URLs derived from generic internal names like "node-1423" or non-descriptive internal titles that were never intended to become URLs; keyword-descriptive node names produce better-ranking URLs); content tree depth (nodes at 5+ levels of nesting produce URLs like `/section/category/subcategory/topic/article/` — assess whether this depth is necessary or whether a flatter structure would serve better); URL uniqueness across document types (Umbraco can route multiple document types under the same tree, potentially creating URL collisions — the audit detects pages returning duplicate canonical URLs or unexpected 404s from routing conflicts); redirect tracking (renamed or moved content nodes should auto-generate 301 redirects via Umbraco\'s built-in redirect tracking — the audit checks for 404 pages that have inbound internal links, indicating redirect coverage gaps); and multi-domain/culture configurations in Umbraco\'s multi-site setups (domain assignment per content root in the Domains and Cultures dialog — verify each culture root has the correct domain assignment and that hreflang tags appear on pages in multi-language Umbraco installations).

📋

JSON-LD structured data in Razor views

Umbraco\'s Razor templating outputs whatever JSON-LD you add to the views. The audit checks: JSON-LD block presence and completeness in the server-rendered HTTP response (JSON-LD must be in the initial `head` response, not loaded via JavaScript after the page renders); `Article` JSON-LD on blog/news document types (requires fetching the author composition field and rendering `Person` type with `sameAs` for E-E-A-T signals — common gap: Article JSON-LD exists but `author` is a plain string rather than a typed `Person` object); `FAQPage` schema on pages with FAQ sections (implement via a repeating block editor or Nested Content data type with question/answer pairs, then iterate in Razor to output the `Question`/`acceptedAnswer` JSON-LD structure); `Product` schema on e-commerce content types if using Umbraco Commerce; `BreadcrumbList` JSON-LD reflecting the content tree hierarchy (each `item.id` must exactly match the canonical URL at that level — verify trailing slash consistency between the breadcrumb item URLs and actual page URLs); `Organization` schema in the root layout (with `sameAs` links to social profiles and authoritative third-party listings for entity recognition). The audit flags missing schema types by document type with the Razor C# property access pattern for each addition.

🗺️

XML sitemap configuration and content type coverage

Umbraco doesn\'t generate an XML sitemap natively in the core CMS — sitemap generation requires either the uSeoToolkit addon, a custom sitemap controller (a route-registered Umbraco controller that queries the content cache and outputs `application/xml`), or a third-party sitemap package. The audit checks: sitemap accessibility at the canonical domain (common issue: the sitemap is generated at a path other than `/sitemap.xml` — verify the `Sitemap` directive in `robots.txt` points to the correct URL); `lastmod` population (the sitemap should use the content node\'s `UpdateDate` property for `lastmod` — hardcoded dates or missing `lastmod` are flagged); sitemap coverage completeness (all live, non-noindex document types with public URLs should appear in the sitemap — check that the sitemap generator doesn\'t exclude content types unintentionally by document type alias or tree position); noIndex content excluded (composition noIndex = true nodes should not appear in the sitemap — check the sitemap generator respects the noIndex composition field); and robots.txt Sitemap directive presence and accuracy. For Umbraco multi-language/multi-site installations, each culture\'s content should either appear in a unified sitemap with hreflang annotations or in per-culture sitemaps, with each sitemap listed in the respective domain\'s robots.txt.

Core Web Vitals for Umbraco

Umbraco is an ASP.NET Core application that renders Razor views server-side — there\'s no JavaScript rendering gap for the main content. Performance varies significantly by hosting configuration, caching strategy, and front-end asset management. **LCP** — Umbraco sites often embed images via the `img` HTML helper without the `loading` and `fetchpriority` attributes. Add `fetchpriority="high"` to the hero/LCP image in the Razor layout and `loading="lazy"` to below-fold images. Use Umbraco\'s built-in image crop API (`GetCropUrl()`) or ImageSharp (via Umbraco\'s image processing pipeline in v10+) to serve WebP and correctly sized images. **INP** — Umbraco layouts are static HTML by default; JavaScript INP issues come from front-end libraries (jQuery, Bootstrap JavaScript components, third-party form embeds, chat widgets, analytics scripts). Defer or async-load non-critical JavaScript. **CLS** — missing explicit `width` and `height` attributes on images rendered via `GetCropUrl()` or media pickers; web font FOUT without `font-display: swap`. **TTFB** — Umbraco supports output caching in ASP.NET Core (configure `UseOutputCache()` in the middleware pipeline, or use a CDN-level cache like Cloudflare). For high-traffic Umbraco sites, Varnish or an output cache significantly improves TTFB. The audit uses real CrUX field data for LCP, INP, and CLS on mobile and desktop.

🧠

AI visibility for Umbraco sites

Add `llms.txt` to the Umbraco web root (the `wwwroot/` directory in an ASP.NET Core Umbraco v10+ installation, or the project root in v8 and earlier). The file lists key content sections, their purposes, and important document types in plain text. For Umbraco Cloud or hosting environments without direct file system access, deploy via CI/CD pipeline or as a static file in the `wwwroot/` directory tracked in source control. Verify AI crawlers are not blocked in `robots.txt` — check that GPTBot, ClaudeBot, PerplexityBot, and other AI user agents are either explicitly allowed or not blocked by a catch-all `Disallow: /` under an overly broad user-agent rule. For FAQPage JSON-LD: implement via a Nested Content or Block List data type with question/answer block types on document types that have FAQ sections. In the Razor view, iterate the blocks and output a `script type="application/ld+json"` FAQPage block. For question-format headings: guide content editors to write question-phrased H2 headings in rich text properties ("How does Umbraco handle URL routing?", "What is a content composition?") — Umbraco\'s TinyMCE or Rich Text editor supports heading formatting. The audit checks all five AI visibility signals — llms.txt, AI crawler access, FAQPage/HowTo JSON-LD in server-rendered HTML, question-heading ratio (≥20%), and content chunkability (avg section ≤400w) — with Razor C# property access patterns and backoffice configuration paths for each fix.

HOW IT WORKS

Audit your Umbraco site in 60 seconds

  1. Enter your Umbraco site URL. No backoffice credentials, API keys, or database access needed — the audit crawls the public HTTP output as Googlebot would. Works with all Umbraco versions (v8, v10, v13, v14), any document type structure, and with or without uSeoToolkit installed.
  2. We crawl and analyse. The engine checks SEO composition field output in the raw server HTTP response, validates JSON-LD schema blocks per document type, audits content tree URL slug quality, checks sitemap coverage and noIndex field exclusions, measures CrUX Core Web Vitals from real Chrome field data, and evaluates all five AI visibility signals.
  3. You get a prioritised report. Umbraco-specific issues first — SEO composition field gaps, missing document-type-level structured data, slug quality issues, redirect tracking gaps, sitemap coverage problems — then general SEO, each with the Razor C# property access pattern, backoffice document type path, or ASP.NET Core configuration for the fix.

FAQ

Questions about the Umbraco SEO audit

Does Umbraco have built-in SEO features?

Umbraco\'s core CMS doesn\'t include dedicated SEO tooling — it provides a flexible content model, Razor-based templating, and media management, but SEO output depends on your implementation. The most widely used Umbraco SEO solutions are: (1) uSeoToolkit (commercial addon by Umbraco Market partner) — adds per-content-node meta title, description, Open Graph, robots noindex, canonical override, and XML sitemap generation fields visible in the Umbraco backoffice. (2) SEO Checker (another commercial addon) — crawl-based SEO audit within the backoffice. (3) Custom implementation — many Umbraco builds create their own SEO composition with a custom `SeoComposition` that adds meta title, description, og:image, and noindex properties to content types, rendered in the Razor layout. The audit validates what\'s in the server-rendered HTML regardless of which approach generates it: whether the meta tags, canonical tags, and structured data appear correctly in the `head` on every crawled page.

How do I set up meta tags in Umbraco?

The cleanest approach in modern Umbraco (v10+, v13+, v14+): (1) Create an SEO composition in the backoffice — a property group added to all content types containing: `seoTitle` (TextString), `metaDescription` (TextArea), `ogImage` (Media Picker), `noIndex` (True/False). Compositions let you add SEO fields to any content type without repeating field configuration. (2) In your Razor layout (`Views/Layout.cshtml`), render the SEO fields: `title>@(Model.Value<string>("seoTitle") ?? Model.Name) | Site Name</title`, `meta name="description" content="@Model.Value<string>("metaDescription")"`, canonical from `@Model.Url(mode: UrlMode.Absolute)`. (3) Install a package for structured data if custom templates are too complex — uSeoToolkit handles most common schema types. (4) Verify the Razor template includes `@RenderSection("head", required: false)` in the `head` so page-level templates can inject additional `meta` or `script type="application/ld+json"` blocks. Common gap: adding SEO composition fields but not rendering them in the layout because the layout still uses hard-coded `title>@Model.Name</title` — the audit catches this by detecting pages with the same title pattern across many content nodes.

How does Umbraco handle URL structure for SEO?

Umbraco generates URLs based on the content tree structure and node names (converted to URL-safe slugs). By default, a page at "Home > Services > Web Design" in the content tree generates `/services/web-design/`. SEO-relevant URL considerations: (1) Umbraco slugs are generated from the content node name — keep node names keyword-descriptive (not "Page 1" or internal titles). (2) URL depth mirrors content tree depth — avoid nesting beyond 3–4 levels for crawl efficiency. (3) Umbraco\'s URL routing supports custom URL providers — you can implement a custom `IUrlProvider` to override the default tree-based URL generation if you need flatter or different URL patterns. (4) Multinode Treepicker and complex data types don\'t generate their own URLs — they\'re embedded content within parent node URLs. (5) For URL changes (renamed nodes or moved content in the tree), Umbraco automatically creates 301 redirects only if the redirect tracking feature is enabled (Settings → Redirect Tracker in v8+) or via the Umbraco Redirects Manager package. Without redirect tracking, renamed or moved pages return 404 and lose link equity. Enable redirect tracking before any content restructuring.

Is the Umbraco SEO audit free?

Yes. The complete audit is free with no signup and no email gate. Paid plans add saved history, scheduled monitoring, larger crawls (up to 1,000 pages), and agency workflows.