uTPro.Feature.SEOAudit
2.1.0
dotnet add package uTPro.Feature.SEOAudit --version 2.1.0
NuGet\Install-Package uTPro.Feature.SEOAudit -Version 2.1.0
<PackageReference Include="uTPro.Feature.SEOAudit" Version="2.1.0" />
<PackageVersion Include="uTPro.Feature.SEOAudit" Version="2.1.0" />
<PackageReference Include="uTPro.Feature.SEOAudit" />
paket add uTPro.Feature.SEOAudit --version 2.1.0
#r "nuget: uTPro.Feature.SEOAudit, 2.1.0"
#:package uTPro.Feature.SEOAudit@2.1.0
#addin nuget:?package=uTPro.Feature.SEOAudit&version=2.1.0
#tool nuget:?package=uTPro.Feature.SEOAudit&version=2.1.0
uTPro SEO Audit for Umbraco
Documentation: https://docs.utpro.dev/uTPro.Feature.SEOAudit/
Site-wide SEO & content audit for Umbraco 16, 17 and 18. Crawls every Content and Media URL, checks for broken links/images/resources, and audits each page — producing a composite SEO score, a health score, prioritised issues, per-page details and CSV export, all in a dedicated backoffice section.

What it adds
Installing this package extends the SEO Audit section (created by uTPro.Feature.UrlViewer or by
this package when installed standalone) with:
| Where | What |
|---|---|
| Site Audit dashboard | Full site crawl, health score, SEO score, issues, per-page detail modal, CSV export |
| Error URLs dashboard | Standing list of failing URLs with single or bulk re-scan |
| Content/Media editors | SEO Audit tab per node (auto-scans on open, warns on issues) |
Architecture
T4VN.Seo.Core (engine, no Umbraco)
▲ ▲
│ │
uTPro.Feature.UrlViewer uTPro.Feature.SEOAudit
(URL Viewer tab + (this package — site crawler
shared UI + section) + node audit tab)
Both packages share the same T4VN.Seo.Core engine
and SeoScorer — the single source of truth for the SEO score. Install order and combination are
flexible; each package works independently.
Site Audit
A recurring background job (auto-discovered by uTPro Job Monitor) crawls every Content and
Media URL and, optionally, URLs in sitemap.xml.
- Broken links, images & resources —
<a>,<img>, stylesheets, scripts, fonts checked for a valid status code. - Health score per run + Overview of totals (pages, links, images, resources, broken, orphaned, duplicate).
- Composite SEO score per page and Avg SEO Score across the run.
- AI-readiness sub-score per page (robots.txt AI-bot rules,
llms.txt, JSON-LD quality, authorship dates, FAQ/breadcrumb schema, external citations) with an Avg AI Readiness card on the run overview, its own column in the pages grid and the CSV export. - Issues grouped by category with severity, type and priority.
- Orphaned pages (no internal link) and duplicate content (identical HTML hash) detection.
- Incremental scans — unchanged pages (ETag / Last-Modified) are skipped; previous result is carried forward.
- Respects
robots.txt(disallow rules +Sitemap:discovery); supports include/exclude URL patterns. - Core Web Vitals (optional) via the Google PageSpeed Insights API — no local browser needed.
- CSV export of any run.
- Extensible checks — implement
IUrlScanIssueand register in DI; it appears automatically in the Issues view.
Per-page audit (via modal detail)
- SEO — title (+ length), meta description (+ length), canonical, H1/H2/H3,
noindex,nofollow,lang. - Social — Open Graph, Twitter Card, pixel detection, social-profile links.
- Technical SEO — charset, gzip/br, browser caching, HTTPS, schema.org, viewport, favicon.
- Content — word/paragraph count, Flesch readability, keyword density, thin-content flag.
- Accessibility — aria counts, skip-to-content, heading structure,
lang, inputs without label. - Carbon — CO₂e estimate with A–F rating.
- Core Web Vitals (optional) — Lighthouse score, LCP, CLS, FCP, TBT, Speed Index + real-user field data.
Built-in issue checks
HTTP errors, server errors, broken links, broken resources, missing/too-long meta description,
missing H1, missing H2, nofollow, noindex, canonicalised URLs, orphaned pages, thin content,
duplicate content, images missing alt text, high carbon intensity, spam/hack keywords, cloaking,
JavaScript errors, poor Core Web Vitals.
Per-node SEO Audit tab
Adds a SEO Audit tab inside every Content and Media editor. Shown only for users with Settings access, and only when the node has a public routable URL (template-less nodes are automatically excluded). Opening a node auto-audits its URL(s) in the background and shows a footer warning when an issue is found.
Security
Backoffice-secured under /umbraco/management/api/v1/utpro/url-scan, requires Settings-section access.
Crawl fetches run behind the same SSRF guard as the URL Viewer (RFC-1918 / localhost / .local
blocked, re-checked on every redirect hop). SkipNodesWithoutTemplate = true (default) prevents
template-less nodes (folders, navigation-link containers, etc.) from being scanned — they have no
routable URL and would produce only false-positive 404s.
Installation
dotnet add package uTPro.Feature.SEOAudit
Tip: install
uTPro.Feature.UrlVieweras well to get the manual URL Viewer fetch tool in the same section.
Configuration
Bind under uTPro:Feature:SEOAudit in appsettings.json (all keys optional — defaults shown):
{
"uTPro": {
"Feature": {
"SEOAudit": {
"Enabled": true,
"Period": "24:00:00",
"Delay": "00:05:00",
"MaxConcurrency": 4,
"ThrottleDelayMs": 150,
"SkipCloakingCheck": true,
"AllowInternalHosts": false,
"AllowInvalidCertificates": false,
"RedirectWarningThreshold": 3,
"MaxRunHistory": 20,
"SkipNodesWithoutTemplate": true,
"CheckLinks": true,
"CheckExternalLinks": true,
"CheckImages": true,
"LinkCheckTimeoutSeconds": 15,
"MaxLinkChecksPerRun": 5000,
"UseIncrementalScan": true,
"UseSitemapDiscovery": true,
"RespectRobotsTxt": true,
"ExcludePatterns": [],
"IncludePatterns": [],
"CollectCoreWebVitals": false,
"PageSpeedApiKey": "",
"PageSpeedStrategy": "mobile"
}
}
}
}
| Key | Default | Description |
|---|---|---|
Enabled |
true |
Master switch for the recurring audit job. |
Period |
24:00:00 |
How often the audit runs. |
Delay |
00:05:00 |
Delay before the first run after startup. |
MaxConcurrency |
4 |
Max concurrent HTTP fetches (clamped 1–20). |
ThrottleDelayMs |
150 |
Delay after each fetch (ms). |
SkipCloakingCheck |
true |
Skip bot-vs-Chrome comparison during bulk audits (faster). |
AllowInternalHosts |
false |
Relax SSRF guard for internal/dev sites. |
AllowInvalidCertificates |
false |
Accept self-signed / invalid TLS (dev only). |
RedirectWarningThreshold |
3 |
Hop count above which a redirect chain is flagged. |
MaxRunHistory |
20 |
Runs retained in the DB before old runs are pruned. |
SkipNodesWithoutTemplate |
true |
Skip content nodes with no template (they have no routable URL). Set false for controller-routed template-less nodes. |
CheckLinks |
true |
Check link status codes. |
CheckExternalLinks |
true |
Also check external links. false to avoid any outbound requests. |
CheckImages |
true |
Check image URLs. |
LinkCheckTimeoutSeconds |
15 |
Per-request timeout for link/image checks (clamped 1–60). |
MaxLinkChecksPerRun |
5000 |
Safety cap on distinct URLs checked per run. |
UseIncrementalScan |
true |
Skip unchanged pages on scheduled runs. |
UseSitemapDiscovery |
true |
Discover additional URLs from sitemap.xml. |
RespectRobotsTxt |
true |
Honour robots.txt disallow rules and Sitemap: directives. |
ExcludePatterns |
[] |
URL patterns to skip (wildcards * / **). |
IncludePatterns |
[] |
If set, only matching URLs are scanned. |
CollectCoreWebVitals |
false |
Collect Core Web Vitals via PageSpeed Insights (requires API key). |
PageSpeedApiKey |
"" |
Google PageSpeed Insights API key. |
PageSpeedStrategy |
mobile |
mobile or desktop. |
Extensibility
Register a custom issue check in DI:
services.AddScoped<IUrlScanIssue, MyCustomIssue>();
IUrlScanIssue exposes Alias, Name, Description, Category, Severity, Type,
Priority and bool Matches(ScanResultRow row). It appears automatically in the Issues view.
License
Free to use (including commercially) under a proprietary End User License Agreement.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- T4VN.Seo.Core (>= 1.1.1)
- Umbraco.Cms.Api.Management (>= 17.0.0 && < 19.0.0)
-
net9.0
- T4VN.Seo.Core (>= 1.1.1)
- Umbraco.Cms.Api.Management (>= 16.0.0 && < 17.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
v2.1.0: Run-level AI Readiness. The per-page AI-readiness sub-score is now persisted in a dedicated AiReadinessScore column, averaged into the run overview (avg AI readiness card next to avg SEO score), listed as its own column in the pages grid and included in the CSV export. UrlPatternMatcher/EmissionsCalculator deduplicated - SEOAudit now consumes both from T4VN.Seo.Core v1.1.1 (which caches compiled glob regexes). No breaking API changes. v2.0.2: AI Readiness audit — new audit category that checks robots.txt AI-bot rules (GPTBot, CCBot, etc.), /llms.txt presence, /ai.txt presence, JSON-LD validity, FAQ schema, breadcrumb schema, authorship dates, external citations, and Content-Signal header; included in the per-page detail and SEO score. Webhook notifications — new WebhookUrl and WebhookScoreThreshold options to POST an alert when health or SEO scores drop below a threshold. Run comparison API (CompareRuns endpoint) returning score deltas between two runs. HTML report endpoint (GetReport) for print-to-PDF audit reports. UI split into dedicated Overview, Content Pages and Media Pages dashboards for better navigation. Vietnamese localization added. App_Plugins folder renamed from "seo-audit" to "utpro-seo-audit". Upgraded to T4VN.Seo.Core v1.1.0 (AI Readiness engine). No breaking API changes. v1.0.0: Initial release. Site-wide SEO & content audit for Umbraco 16, 17 and 18. Crawls every Content & Media URL, checks broken links/images/resources, and audits each page for SEO, Open Graph/Twitter, technical SEO, content quality, accessibility and carbon emissions. Includes a composite SEO score (Lighthouse-style, 0-100), a run health score, grouped issues with severity/priority, orphaned-page and duplicate-content detection, incremental scans, CSV export and a per-page detail modal. Adds a per-node SEO Audit tab in the Content/Media editors (auto-scans on open). Runs as a recurring background job (auto-discovered by uTPro Job Monitor). Built on the framework-agnostic T4VN.Seo.Core engine. Config key: uTPro:Feature:SEOAudit.