← Umbraco
Guide

How to upgrade Umbraco 13 to 17

By Alastair Murdoch Last reviewed Tested on Umbraco 17.7 · .NET 10 · uSync 17.4
In short

You can upgrade Umbraco 13 straight to 17 in one jump: update to the latest 13, confirm every package has a version for 17, move to .NET 10, update Umbraco and let it upgrade the database on first start. That part is quick. The time goes on packages without a 17 release and on custom code relying on removed features.

13.13 → 17.4
One jump, no stops at 14–16
12 days
From first preparation to the site running on 17
795
Items exported by our content-sync tool, uSync
.NET 8 → 10
Microsoft .NET version upgrade

Before you start

  • ✓A full database backup, and a copy of the site files
  • ✓A staging copy to upgrade first, never the live site
  • ✓A list of every add-on package and backoffice extension, and whether each has a version for Umbraco 17
  • ✓.NET 10 installed on every developer machine and build server
  • ✓A list of your custom code, especially anything that customises the backoffice

1. Get onto the latest Umbraco 13 and clear out what 17 dropped

Starting from the newest 13 release gives the jump a known-good base (on our own site, 13.13.1). Then we look for what 17 no longer has:

  • Custom code built on Umbraco's old API controller, which is gone. It needs rewriting as standard ASP.NET Core code.
  • Properties using the legacy Media Picker. Switch them to the current one while you can still test on 13.
  • Leftovers such as unused sync folders from earlier versions and one-off import tools.

2. Check every package has a version for 17

This step decides your timeline. Our theme package had no Umbraco 17 release when we started, which held things up until it shipped. We later replaced it with templates we own, so a third-party release can't hold up the next upgrade. Expect to drop abandoned or debug-only packages. Backoffice customisations written in AngularJS must be rebuilt, because the backoffice has used web components since Umbraco 14.

3. Move to .NET 10 and update the packages

Umbraco 17 runs on .NET 10, so the project moves up from .NET 8 (we pinned 10.0.300 so every machine builds alike). Umbraco and each package you keep, such as uSync, forms and import tools, go to their 17 versions. Seeing template changes without a rebuild during development needs one extra package.

4. Remove what Umbraco 17 took away

A build shows what no longer exists. For us: a setup line for the old installer; Smidge, the old CSS and JavaScript bundler, which we replaced with direct links; and macros, which are gone entirely, so any template using one must be rewritten (we retired a leftover grid template).

5. Back up, start the site and let it upgrade the database

With a backup taken, switch on Umbraco's unattended upgrade setting and start the site. Umbraco 17 then upgrades the database itself: converting Block List content, migrating rich text settings, converting dates to UTC and updating its backoffice login system (OpenIddict). Watch the log until it reports completion. Rich text editors move from TinyMCE to TipTap automatically, but check their settings afterwards.

6. Fix what the first start shows you

The backoffice can look fine while the public site fails, because it doesn't use your templates. Load a page of every type and read the log. Our first start showed two failures, covered under What usually goes wrong below.

7. Re-sync your content with uSync

If you use uSync to keep site structure under version control, let it export a fresh set for 17 on first start (ours was 795 items) and treat that as the source of truth. Keep the old files for reference; don't import them.

8. Get ahead of Umbraco 18

The build also warns about features due to be removed in 18. For us the big one was how templates move around the content tree (a page's children, parent, descendants and ancestors). We replaced it now with helpers built on the newer approach, so the next upgrade won't be a rewrite.

What usually goes wrong

From our own projects, not the manual.

Every page of the public site returned an error

An invisible marker character (a UTF-8 byte-order mark) at the start of our template files stopped the template compiler (error RZ2005), which took down every front-end page at once. The backoffice was unaffected. We removed the markers and added an editor setting so they can't come back.

Pages using an old image property broke after the upgrade

A property still used the legacy Media Picker, which Umbraco 17 removed, so the site treated its value as plain text and the part of the page expecting an image crashed. Switching the property to the current media picker fixed it. Do this on 13 before you upgrade.

uSync crashed on startup

Two content files had the same identifier, because a renamed item left its old file behind, and uSync refused to import either. Deleting the stale duplicate fixed it. Check for duplicates before any full import.

Importing a page type failed with a database error

A new property's identifier clashed with a property on a different page type (SQL error 2601). These identifiers must be unique across every page type, not just the one you're editing, so give each new property a fresh one.

The RSS feed and similar features returned nothing

On a multi-language site, Umbraco only lists pages in the current language, and features that run outside a normal page visit, such as an RSS feed, don't have one. Tell them which language to use before they look for pages.

Dates came back without a time zone

Dates read from Umbraco 17 are no longer marked as UTC, so converting them to UTC shifted them. Format dates explicitly, for example in the standard RSS date format, instead of converting them.

Do it yourself, or get help?

If your site uses a handful of well-maintained packages, has no custom backoffice extensions and little custom code, a developer comfortable with .NET can do this in a few days on staging. If you rely on a theme or package with no Umbraco 17 release, have custom backoffice extensions, or can't afford the public site to go down, get help: that's where upgrades stall, and where we spend most of our time on them. Every site's mix is different, so the plan depends on what yours relies on.

Get a developer on it
FAQ

Common questions

Do I have to upgrade to 14, 15 and 16 first?

No. We went straight from 13.13 to 17.4. Umbraco applies the database changes for the versions in between automatically when the site first starts.

How long does an Umbraco 13 to 17 upgrade take?

For our own site it was 12 days from the first preparation work to a site running on 17. Packages without a 17 release and custom backoffice code are what add time, not the database upgrade itself.

Will my AngularJS backoffice customisations still work?

No. Since Umbraco 14 the backoffice has been built on web components, a different technology, so custom property editors, dashboards and plugins written in AngularJS have to be rebuilt.

When does Umbraco 13 stop getting security fixes?

Umbraco 13 reaches end of life on 14 December 2026. Umbraco 17 LTS is supported until 27 November 2028.

Should I wait for the next LTS instead?

The next LTS, Umbraco 21, is due in December 2027, a year after 13's end of life. Moving to 17 now keeps you supported, and 17 to 21 will be a smaller jump.

Want us to run your Umbraco upgrade?

Tell us about your site and packages. We'll tell you what the move to 17 involves and what it will take.