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







