Common Umbraco Anti-Patterns That Slowly Kill Performance
Performance problems in Umbraco projects rarely appear overnight. Most teams do not deploy a slow website by mistake. Instead, performance degrades gradually as small design decisions and shortcuts accumulate over time. What makes this dangerous is that the site often works “well enough” during development and early releases, masking deeper architectural issues.
This article focuses on common Umbraco anti-patterns that teams continue to repeat in real projects. These patterns do not usually cause crashes or obvious errors, but they quietly increase load times, database pressure, and rendering cost until performance becomes a real problem in production.
Querying the Database Instead of the Published Cache
Another common issue is relying on custom database queries or repository patterns to fetch content that already exists in the published cache. This usually happens when teams come from non-CMS backgrounds and treat Umbraco like a traditional data store.
By skipping the published content cache, the application loses one of Umbraco’s biggest performance advantages. As content grows and traffic increases, unnecessary database access becomes a bottleneck that slowly drags down page load times.
Overloading Views With Business Logic
Performance issues often originate in Razor views that do far more work than they should. Complex loops, conditional logic, and service calls inside views may seem harmless at first, especially when pages are simple and traffic is low.
As content grows, these views are executed repeatedly for every request. Logic that should run once or be cached ends up running on every page load, increasing CPU usage and slowing down rendering across the site.
Poor Block List and Nested Content Design
Block Lists are powerful, but they are also easy to misuse. Teams often create deeply nested block structures without considering how much work is required to render them.
Each additional level of nesting increases rendering complexity and memory usage. When combined with unoptimized partials and repeated content lookups, pages become slower as editors add more blocks, even though no code changes were made.
Ignoring Defensive Null Checks in Rendering
Many performance issues are hidden behind rendering failures that do not throw errors. When code assumes properties or blocks always exist, Umbraco often fails silently and skips rendering parts of the page.
Teams then add additional fallback logic, retries, or conditional checks in multiple places, increasing complexity and rendering cost. Over time, this defensive sprawl adds unnecessary processing overhead to every request.
Hardcoding Content IDs and Structural Assumptions
Hardcoding content IDs or relying on fixed content hierarchies is another subtle anti-pattern. While this may seem convenient initially, it tightly couples rendering logic to a specific content structure.
As content editors reorganize pages or migrate data, additional lookups and conditional logic are introduced to “fix” broken references. These workarounds increase complexity and reduce performance predictability across environments.
Over-Customizing the Backoffice Without Performance Consideration
Custom property editors, dashboards, and backoffice extensions can also contribute to performance issues when not designed carefully. Heavy scripts, unnecessary API calls, and unoptimized data loading slow down editor workflows and indirectly affect content quality and publishing speed.
While backoffice performance does not directly impact front-end users, it often leads to rushed fixes and architectural shortcuts that later surface as front-end performance problems.
Treating Performance as a Late-Stage Concern
Perhaps the most common anti-pattern is treating performance as something to address after features are complete. By the time performance issues become visible, they are often deeply embedded in content models, rendering logic, and editor workflows.
At this stage, fixing performance requires refactoring core assumptions rather than simple optimizations. This is why teams often struggle to improve performance without significant rework.
Key Takeaway
Most Umbraco performance problems are not caused by a single bad decision. They are the result of repeated anti-patterns that feel harmless in isolation but compound over time. Because these issues rarely cause immediate failures, they often go unnoticed until the site reaches scale.
Avoiding these anti-patterns early and revisiting them regularly is essential for building Umbraco projects that remain fast, stable, and maintainable in production.
Related Blogs
Read More
Read More
Read More