Upgrade Commerce 14 to Commerce 15
Why upgrade to Commerce 15
Section titled “Why upgrade to Commerce 15”Commerce 15 aligns the commerce platform with CMS 13 and moves to .NET 10, bringing architectural improvements that affect how you build and deploy commerce solutions:
- CMS 13 compatibility — Commerce 14 is not compatible with CMS 13. If you are upgrading CMS, Commerce must follow
- .NET 10 runtime — Performance improvements, new language features, and continued LTS support
- Explicit package model — Commerce 15 moves away from metapackages to explicit NuGet references, giving you finer control over dependencies
- Content Graph integration — Built-in support for Optimizely Graph replaces older delivery mechanisms
- Visual Builder support — Commerce content types work with the CMS 13 Visual Builder experience
Before you start
Section titled “Before you start”What this upgrade involves
Section titled “What this upgrade involves”This upgrade touches three layers simultaneously:
| Component | From | To |
|---|---|---|
| Commerce | 14.15.3 | 15.0.0-preview1 |
| CMS | 12.31.2 | 13.0.0-preview4 |
| .NET | 8.0 | 10.0 |
Preview version warning
Section titled “Preview version warning”Commerce 15.0.0-preview1 and CMS 13.0.0-preview4 are pre-release versions. Do not use them in production. Use this guide for evaluation, testing, and preparing your upgrade plan. Commerce 15-compatible versions for popular add-ons will be released at a later date.
Prerequisites
Section titled “Prerequisites”You need the following before starting:
- Visual Studio 2022 with the .NET 10.0 SDK installed
- SQL Server (LocalDB or a full instance)
- A working Commerce 14/CMS 12 site (or use the empty template in Step 1 to create one)
- Familiarity with Optimizely Commerce architecture and NuGet package management
Upgrade steps
Section titled “Upgrade steps”Step 1: Establish a baseline Commerce 14 site
Section titled “Step 1: Establish a baseline Commerce 14 site”If you do not have an existing Commerce 14 project to upgrade, create one from the template to use as a starting point:
dotnet new epi-commerce-empty --name CoCo14 --forceAfter creating the project:
- Restore packages and build the project
- Run the application (F5 in Visual Studio or
dotnet run) - Register an admin user at
https://localhost:5000/util/register - Log in at
https://localhost:5000/util/login - Run the commerce migration at
https://localhost:5000/episerver/commerce/migrate - Verify the admin UI loads at
https://localhost:5000/episerver/cms
If you are upgrading an existing site, skip this step and proceed with your current project.
Step 2: Update the target framework
Section titled “Step 2: Update the target framework”Open your .csproj file and change the target framework from .NET 8.0 to .NET 10.0:
<!-- Before --><TargetFramework>net8.0</TargetFramework>
<!-- After --><TargetFramework>net10.0</TargetFramework>Step 3: Update NuGet package references
Section titled “Step 3: Update NuGet package references”Commerce 15 and CMS 13 move from a metapackage model to explicit package references. This gives you visibility into every dependency and finer control over versions.
Replace your existing Commerce and CMS package references with explicit references.
Remove the old metapackages:
<!-- Remove these --><PackageReference Include="EPiServer.CMS" Version="12.31.2" /><PackageReference Include="EPiServer.Commerce" Version="14.15.3" />Add explicit Commerce 15 and CMS 13 packages:
<!-- Commerce 15 --><PackageReference Include="EPiServer.Commerce" Version="15.0.0-preview1" />
<!-- CMS 13 (all version 13.0.0-preview4) --><PackageReference Include="EPiServer.OptimizelyIdentity" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.CMS.UI.AspNetIdentity" Version="13.0.0-preview4" /><PackageReference Include="Optimizely.Graph.Cms" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Cms.UI.ContentManager" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Hosting" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Cms.UI.VisitorGroups" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.CMS.Shell.UI" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.CMS.UI" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.ImageLibrary.ImageSharp" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Events.ChangeNotification" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Cms.AspNetCore.TagHelpers" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Cms.AspNetCore.HtmlHelpers" Version="13.0.0-preview4" /><PackageReference Include="EPiServer.Cms.TinyMce" Version="13.0.0-preview4" />Step 4: Update startup configuration
Section titled “Step 4: Update startup configuration”CMS 13 requires explicit service registration instead of relying on the metapackage to wire everything up. Open Startup.cs and update the ConfigureServices method.
Before (Commerce 14 / CMS 12):
services .AddCmsAspNetIdentity<ApplicationUser>() .AddCommerce() .AddAdminUserRegistration() .AddEmbeddedLocalization<Startup>();After (Commerce 15 / CMS 13):
services .AddCmsHost() .AddCmsCore() .AddCmsAspNetIdentity<ApplicationUser>() .AddCmsHtmlHelpers() .AddCmsTagHelpers() .AddCmsUI() .AddAdmin() .AddCmsImageSharpImageLibrary() .AddTinyMce() .AddContentGraph() .AddContentManager() .AddCommerce() .AddVisitorGroupsMvc() .AddVisitorGroupsUI() .AddAdminUserRegistration() .AddEmbeddedLocalization<Startup>();
services.Configure<DataAccessOptions>(options =>{ options.UpdateDatabaseCompatibilityLevel = true;});The UpdateDatabaseCompatibilityLevel setting ensures the database schema migrates correctly during the upgrade.
Step 5: Configure Content Graph
Section titled “Step 5: Configure Content Graph”CMS 13 integrates Content Graph natively. Add the configuration to appsettings.json:
{ "Optimizely": { "ContentGraph": { "GatewayAddress": "https://cg.optimizely.com", "AppKey": "<your-app-key>", "Secret": "<your-secret>", "SingleKey": "<your-single-key>", "AllowSendingLog": "true" } }}Replace the placeholder values with your actual Content Graph credentials from the Optimizely portal.
Step 6: Build and run the migration
Section titled “Step 6: Build and run the migration”Restore packages and build:
dotnet restoredotnet buildStart the application, then navigate to the commerce migration endpoint:
https://localhost:5000/Optimizely/commerce/migrateThis updates the database schema and migrates data to the Commerce 15 format. The endpoint path has changed from /episerver/commerce/migrate to /Optimizely/commerce/migrate.
Step 7: Verify the upgrade
Section titled “Step 7: Verify the upgrade”Once migration completes, verify the Commerce admin UI at:
https://localhost:5000/Optimizely/Commerce/Check that:
- The Commerce admin interface loads without errors
- Catalog structure and products are intact
- Order history is accessible
- Scheduled jobs are visible
Source code considerations
Section titled “Source code considerations”Depending on the complexity of your Commerce solution, you may need additional source code changes due to API differences between CMS 12 and CMS 13. Common areas that require attention:
- Custom controllers — Verify your MVC controllers compile against the CMS 13 API surface
- Search and Navigation — If your commerce catalog search uses Search and Navigation, you must migrate to Graph
- Third-party add-ons — Commerce 15-compatible versions for add-ons will be released separately; check compatibility before upgrading
- Scheduled jobs — The API is unchanged, but verify any commerce-specific jobs work correctly
- Custom promotion/discount engines — Test pricing and promotion logic after migration
For CMS-specific breaking changes (Search and Navigation removal, Graph schema changes), see the CMS 13 upgrade guide.
1. What is the minimum .NET version required for Commerce 15?
Commerce 15 requires .NET 10.0, which is the target framework you set in the .csproj file during the upgrade.
Commerce 15 requires .NET 10.0, which is the target framework you set in the .csproj file during the upgrade.
2. Why does Commerce 15 use explicit package references instead of metapackages?
The move to explicit package references gives developers visibility into every dependency and finer control over which components are included and at what version.
The move to explicit package references gives developers visibility into every dependency and finer control over which components are included and at what version.
3. What must you do if your Commerce site uses Search and Navigation for catalog search?
Search and Navigation is completely removed in CMS 13. All search functionality, including commerce catalog search, must be migrated to Optimizely Graph.
Search and Navigation is completely removed in CMS 13. All search functionality, including commerce catalog search, must be migrated to Optimizely Graph.