A .NET team gets a task to build a corporate portal with multisite structure, role-based access, and headless API for mobile apps. The choice falls on Umbraco — an open-source CMS on ASP.NET Core. But without proper architecture and performance tuning, the project turns into a swamp with constant N+1 queries and response times over 2 seconds. We've encountered this many times and developed an approach that yields TTFB <200 ms on Umbraco 13.
For example, a company with a multisite structure (5 domains) and headless integrations for mobile apps approached us. After an audit, we found that N+1 queries on the old solution caused lag. We redesigned the architecture, implemented NuCache and the Repository pattern — TTFB dropped from 1.2 s to 180 ms, and database load decreased fourfold.
Why Umbraco for Corporate Sites?
Umbraco is a CMS on .NET 8 with an open-source MIT license. It runs on SQL Server or SQLite and supports clustering. It's well-suited for corporate sites, portals, and multisite infrastructures — especially where the client is tied to the Microsoft stack or needs a headless CMS with enterprise capabilities. Unlike WordPress, Umbraco provides strongly-typed models and a built-in headless Delivery API. License savings compared to proprietary CMS can reach 70%. For instance, Sitecore costs from $100,000 per year, while Umbraco is free (MIT license).
In tests, Umbraco with NuCache delivers TTFB <200 ms, whereas a typical WordPress installation hits 500–800 ms. This is achieved through built-in caching and model generation at compile time.
Comparison of Umbraco with Other CMS: WordPress, Sitecore, Drupal
| Criteria | Umbraco | WordPress | Sitecore |
|---|---|---|---|
| Model type | Strongly-typed (ModelsBuilder) | Dynamic (WP_Query) | Strongly-typed, but heavy |
| Headless API | Built-in Delivery API | Plugins (WPGraphQL) | Experience Edge (expensive) |
| Performance | TTFB <200 ms (NuCache) | TTFB 500–800 ms (no cache) | TTFB <300 ms (cached) |
| License | Free (MIT) | Free (GPL) | ~$100,000/year |
| Multisite support | Out of the box | Via multisite plugin | Built-in but complex |
Umbraco is 2-3 times faster than WordPress on standard hosting and requires no license fees unlike Sitecore.
Architecture and Setup
Typical solution structure:
MyProject/ ├── MyProject.Web/ ├── MyProject.Core/ └── MyProject.Tests/ The key configuration file is Program.cs, where all components are wired up:
// Program.cs
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.CreateUmbracoBuilder()
.AddBackOffice()
.AddWebsite()
.AddDeliveryApi()
.AddComposers()
.Build();
WebApplication app = builder.Build();
await app.BootUmbracoAsync();
app.UseUmbraco()
.WithMiddleware(u =>
{
// ...
})
.WithEndpoints(u =>
{
// ...
});
await app.RunAsync();For adding services, we use Composers. Example service registration and handlers:
public class SiteComposer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
builder.Services.AddScoped<IArticleService, ArticleService>();
builder.Services.AddScoped<ISitemapService, SitemapService>();
builder.AddNotificationHandler<ContentPublishedNotification, SearchIndexHandler>();
}
} Strongly-typed Models and Headless API
Umbraco generates models via ModelsBuilder. Usage in a controller:
public class ArticleController : RenderController
{
[HttpGet]
public IActionResult Index()
{
if (CurrentPage is not ContentModels.Article article)
return NotFound();
var viewModel = new ArticleViewModel
{
Title = article.Title,
Body = article.Body,
};
return CurrentTemplate(viewModel);
}
}For headless, we use the Delivery API, enabled in appsettings.json:
{ "Umbraco": {
"CMS": {
"DeliveryApi": {
"Enabled": true,
"PublicAccess": true,
"ApiKey": "your-api-key"
}
}
} }API calls: GET /umbraco/delivery/api/v2/content?contentType=article.
How to Set Up Headless Delivery API? Step-by-Step
- Enable Delivery API in appsettings.json.
- Set an API key if authorization is required.
- In the admin panel, mark content types available through the API.
- Configure CORS for external clients.
- (Optional) Enable caching at the CDN level.
Development Process for an Umbraco Site
| Stage | Duration | What We Do |
|---|---|---|
| Analysis and prototyping | 1–2 weeks | Gather requirements, create content type map, UX prototype |
| Architecture design | 1 week | Design solution structure, configure NuCache, plan integrations |
| Implementation | 2–4 weeks | Build templates, develop Surface and Render controllers, set up Delivery API |
| Testing | 1 week | Conduct load testing, verify Core Web Vitals |
| Deployment and handover | 3–5 days | Set up CI/CD, deploy to production, train editors |
Timelines and Scope
| Project scope | Timelines |
|---|---|
| Corporate site (10–15 content types) | 3–5 weeks |
| With headless API and integrations | 6–10 weeks |
| Redesign of existing instance | from 2 weeks |
Cost is calculated individually based on the scope and complexity of integrations. Contact us for a consultation to get an accurate estimate.
What is Included in the Result
- Fully configured Umbraco on your hosting or in the cloud.
- Source code (Git repository) with an architecture ready for scaling.
- Documentation on content types and API.
- Editor training (up to 4 hours).
- 3-month warranty on identified bugs.
- Recommendations for caching and performance optimization.
Our experience: over 5 years of Umbraco development, 15+ projects delivered, average client rating 4.9/5. We use only licensed software and follow best practices. Contact us for a consultation — we'll help you find the optimal solution.
Official Umbraco documentation: Umbraco CMS Documentation







