Everything you need to install, configure, and get the most out of Pulse for Umbraco.
Pulse is distributed as a NuGet package. Add it to your Umbraco 17+ project:
Or via the Package Manager Console:
Pulse automatically creates the database tables it needs on first startup — no manual migration steps required. It supports both SQL Server and SQLite.
After installing, start your Umbraco site and log into the backoffice. You will see a new Pulse section in the left-hand navigation.
Open the Pulse section from the backoffice sidebar and you will land on the Overview tab.
After a scan, Pulse calculates an overall score from 0 to 100. The score is a weighted aggregate of the results across all five categories:
Each category receives its own score, displayed as colour-coded cards on the Overview tab. A sparkline chart tracks how your score changes over time.
Every rule result is assigned one of four severity levels so you can prioritise your work:
The severity bar on the Overview tab gives you an at-a-glance breakdown of how many rules fall into each level.
Pulse ships with 42 built-in rules organised across five categories.
| Rule | What it checks |
|---|---|
| Unused Document Types | Doc types with zero published content. |
| Orphaned Media | Media items not referenced by any content. |
| Missing Templates | Doc types configured without an assigned template. |
| Recycle Bin Buildup | Excessive items in content or media recycle bins. |
| Deeply Nested Content | Content nodes nested deeper than the configured threshold. |
| Empty Published Content | Published pages with no property values populated. |
| Unused Data Types | Data types not used by any doc type. |
| Missing Alt Text | Media images without alt text. |
| Broken Internal Links | Content referencing deleted or unpublished pages. |
| Never Published Content | Content nodes that have never been published. |
| Previously Unpublished Content | Previously published content that is now unpublished. |
| Unpublished Changes | Published content with pending draft changes. |
| Empty Media Folders | Media folders containing no items. |
| Rule | What it checks |
|---|---|
| Environment & Debug Mode | Hosting environment is set to Development on a production server. |
| Hostname Binding | No hostnames are bound to the site. |
| Missing Mandatory Cultures | Variant content missing one or more mandatory language cultures. |
| Custom 404 Page | No custom 404 error page configured or the configured page is missing. |
| SMTP Email Delivery | No SMTP settings configured for outbound email. |
| HTTPS Enforcement | HTTPS is not enforced or assigned domains use plain HTTP. |
| Log Retention Policy | Serilog file-sink retention is not configured, risking unbounded log growth. |
| Rule | What it checks |
|---|---|
| Oversized Media Files | Media files exceeding the configured size threshold. |
| Content Version Cleanup | Version cleanup is not enabled, causing database bloat. |
| Overloaded Document Types | Doc types with an excessive number of properties including compositions. |
| Duplicate Media Files | Identical media files uploaded multiple times. |
| List View Not Enabled | Doc types with many children but no list view configured. |
| Rule | What it checks |
|---|---|
| Dormant User Accounts | Back-office users inactive beyond the configured threshold. |
| Excessive Admin Accounts | Too many users with full administrator privileges. |
| External Script Audit | Script tags loading from external domains — a supply-chain attack vector. |
| Unsafe Upload Extensions | Allowed file upload extensions that could enable remote code execution. |
| Content Security Policy | Missing or weak Content-Security-Policy header on the public site. |
| Security Response Headers | Missing OWASP-recommended HTTP security headers (HSTS, X-Content-Type-Options, X-Frame-Options, etc.). |
| Rule | What it checks |
|---|---|
| Stale Content | Published pages not updated within the configured threshold. |
| Thin Content | Pages with very few words. |
| Readability | Content with poor Flesch-Kincaid readability scores. |
| Missing Meta Description | Pages missing SEO meta description values. |
| Missing Open Graph Tags | Pages missing og:title, og:description, or og:image tags for social sharing. |
Several rules offer a Fix button directly in the results drilldown. Available actions include:
After performing a fix, click Rescan on that rule to verify the issue has been resolved. The updated result is reflected in your overall score immediately.
The Custom Scan tab lets you pick a subset of rules and run a targeted scan.
Custom scan results are read-only — they do not overwrite your persisted score, trigger notifications, or affect your score history.
If you run the same combination of rules frequently, save them as a preset:
Sometimes a rule result is a known exception you have decided to accept. Rather than letting it drag your score down, you can suppress it.
When creating a suppression you can optionally provide a reason and an expiry date. Expired suppressions are automatically removed and the items return to your score.
All active suppressions are listed on the Suppressions tab where they can be reviewed or removed.
Pulse stores up to 90 historical scan snapshots. The History tab displays:
Use this data to correlate score changes with deployments, content updates, or configuration changes.
Automate your health monitoring by configuring a scan schedule from the Settings area:
| Preset | Interval |
|---|---|
| Every 6 Hours | Scan every 6 hours |
| Every 12 Hours | Scan every 12 hours |
| Daily | Once per day at your preferred hour |
| Weekly | Once per week on your preferred day and hour |
| Custom | Set any interval in hours |
| Disabled | No automatic scanning |
You can also set your preferred time (UTC hour) and preferred day of week. Changes saved in the backoffice take effect immediately — no application restart required.
Pulse can alert you when something needs your attention.
When enabled, Pulse sends email notifications when:
Configure recipient email addresses, the "from" address, and a cooldown period to prevent inbox flooding. Use the Test Email button to verify your SMTP settings.
When enabled, a dismissible banner appears at the top of the Pulse dashboard when new issues are detected. Each notification can be dismissed individually or all at once.
Pulse turns scan results into actionable work items your team can track.
Every user has a personal to-do list showing their open assignments across all rules. Access it from the dashboard to see what needs your attention.
Pulse includes a gamification layer to keep your team engaged with site health:
If your Umbraco installation has multiple root content nodes, Pulse provides a site picker at the top of the dashboard.
Download a full scan report as a CSV file from the dashboard:
Use CSV exports to share reports with stakeholders, attach to project documentation, or archive for compliance audits.
All configuration is optional. Add the Umbraco:Pulse section to your appsettings.json to override defaults:
{
"Umbraco": {
"Pulse": {
"Enabled": true,
"ScanIntervalHours": 24,
"InitialDelaySeconds": 60,
"BatchSize": 500,
"LargeMediaThresholdMB": 5,
"MaxContentDepth": 7,
"MaxDocTypeProperties": 50,
"StaleUserDays": 90,
"StaleContentDays": 180,
"ThinContentWordThreshold": 300,
"ReadabilityMinScore": 30,
"ListViewContentThreshold": 50,
"Schedule": {
"Preset": "Daily",
"CustomIntervalHours": 24,
"PreferredHourUtc": 2,
"PreferredDayOfWeek": "Sunday"
},
"Notifications": {
"EmailEnabled": false,
"ScoreThreshold": 70,
"NotifyOnNewCritical": true,
"NotifyOnScoreDrop": true,
"ScoreDropThreshold": 10,
"BackofficeBannerEnabled": true,
"CooldownHours": 24
}
}
}
}
| Setting | Default | Description |
|---|---|---|
Enabled | true | Enable or disable the background scanner. |
ScanIntervalHours | 24 | Fallback interval between scans. |
InitialDelaySeconds | 60 | Delay before the first scan after startup. |
BatchSize | 500 | Max content items processed per batch. |
LargeMediaThresholdMB | 5 | Media files larger than this (MB) are flagged. |
MaxContentDepth | 7 | Content nodes deeper than this are flagged. |
MaxDocTypeProperties | 50 | Doc types with more properties are flagged. |
StaleUserDays | 90 | Users inactive longer than this are flagged. |
StaleContentDays | 180 | Published pages not updated within this are flagged. |
ThinContentWordThreshold | 300 | Pages with fewer words are flagged as thin content. |
ReadabilityMinScore | 30 | Flesch-Kincaid score below which content is flagged. |
ListViewContentThreshold | 50 | Doc types with more children without list view are flagged. |