<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><language>en</language><title>Blog posts by Viet Anh Nguyen</title> <link>https://world.optimizely.com/blogs/viet-anh-nguyen/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Unit-Level Promotion Exclusions: Updated Behaviour and Developer Guide</title>            <link>https://world.optimizely.com/blogs/viet-anh-nguyen/dates/2026/10/unit-level-promotion-exclusions-updated-behaviour-and-developer-guide/</link>            <description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Since Commerce 13, Optimizely Commerce Connect has supported two modes for promotion exclusion: order-level and unit-level. Order-level exclusion is the default and the one most sites use. Unit-level exclusion is the more granular option, designed for scenarios where merchandisers want competing promotions to coexist on the same order -- just not on the same product unit.&lt;/p&gt;
&lt;p&gt;While the concept has been available for years, several edge cases in unit-level exclusion behaved inconsistently. Depending on how exclusions were declared, whether condition units were counted, and what type of promotion was involved, the results could be surprising and difficult to reason about. In Commerce 14.47.0, we corrected these inconsistencies to make unit-level exclusion behave predictably and symmetrically. The same corrections are planned for an upcoming Commerce 15 release.&lt;/p&gt;
&lt;p&gt;This post explains the unit-level exclusion model from scratch, details the five behaviour changes introduced in 14.47.0, and provides a migration guide for developers upgrading their sites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does this affect you?&lt;/strong&gt; Only if your site sets &lt;code&gt;PromotionExclusionLevel = ExclusionLevel.Unit&lt;/code&gt;, either globally or per invocation. If you use the default &lt;code&gt;ExclusionLevel.Order&lt;/code&gt;, nothing changes.&lt;/p&gt;
&lt;h2&gt;The Business Problem&lt;/h2&gt;
&lt;p&gt;Consider a common merchandising scenario. A retailer runs two promotions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P1&lt;/strong&gt;: 15% off all Wella brand products (narrow, brand-specific)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P2&lt;/strong&gt;: 10% off the entire Shampoo category (broad, category-wide)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both promotions target shampoo, but the merchandiser marks them as mutually exclusive so that a Wella shampoo does not receive both discounts (25% off would erode the margin too much). Now a shopper adds two items to the cart: one Wella shampoo at 200 and one non-Wella shampoo at 100.&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;order-level exclusion&lt;/strong&gt; (the default), the engine evaluates P1 first (higher priority). P1 applies and the engine marks P2 as excluded from the &lt;em&gt;entire order&lt;/em&gt;. Result: the Wella shampoo gets 15% off, but the non-Wella shampoo gets nothing -- even though P1 never touched it.&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;unit-level exclusion&lt;/strong&gt;, the blast radius is narrowed. P1 consumes only the Wella shampoo unit. P2 is excluded from that unit, but the non-Wella shampoo is still free for P2 to discount.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Unit price&lt;/th&gt;
&lt;th&gt;Order-level result&lt;/th&gt;
&lt;th&gt;Unit-level result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wella Shampoo&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;170 (P1, -15%)&lt;/td&gt;
&lt;td&gt;170 (P1, -15%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other Shampoo&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100 (no discount)&lt;/td&gt;
&lt;td&gt;90 (P2, -10%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;270&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;260&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The shopper saves more, the merchandiser&#39;s margin on the Wella product is preserved, and the non-Wella shampoo is not unfairly penalised. This is the core value proposition of unit-level exclusion: exclusions should only affect the units a promotion actually used, not everything else in the cart.&lt;/p&gt;
&lt;h2&gt;How Unit-Level Exclusion Works&lt;/h2&gt;
&lt;h3&gt;Vocabulary&lt;/h3&gt;
&lt;table style=&quot;width: 100%; height: 195.938px;&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 19.5938px;&quot;&gt;
&lt;th style=&quot;width: 7.22641%; height: 19.5938px;&quot;&gt;Term&lt;/th&gt;
&lt;th style=&quot;width: 90.5646%; height: 19.5938px;&quot;&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 39.1875px;&quot;&gt;
&lt;td style=&quot;width: 7.22641%; height: 39.1875px;&quot;&gt;&lt;strong&gt;Unit&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;width: 90.5646%; height: 39.1875px;&quot;&gt;The atomic object of exclusion accounting. Not a line item -- one line item with quantity 5 contains five units. A cart with one line item of quantity 5 must behave identically to five separate line items of quantity 1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 39.1875px;&quot;&gt;
&lt;td style=&quot;width: 7.22641%; height: 39.1875px;&quot;&gt;&lt;strong&gt;Condition unit&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;width: 90.5646%; height: 39.1875px;&quot;&gt;A unit consumed to satisfy a promotion&#39;s condition. In &quot;buy 3, get 10% off one&quot;, the three units that satisfy the &quot;buy 3&quot; requirement are condition units. They are charged full price but consumed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19.5938px;&quot;&gt;
&lt;td style=&quot;width: 7.22641%; height: 19.5938px;&quot;&gt;&lt;strong&gt;Reward unit&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;width: 90.5646%; height: 19.5938px;&quot;&gt;A unit that receives the discount or is given free.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 39.1875px;&quot;&gt;
&lt;td style=&quot;width: 7.22641%; height: 39.1875px;&quot;&gt;&lt;strong&gt;Consumed&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;width: 90.5646%; height: 39.1875px;&quot;&gt;A unit used as either a condition unit or a reward unit by a given promotion. Counted once per unit, not per role -- if a unit is both condition and reward (as in a simple &quot;10% off all items&quot;), it counts once.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19.5938px;&quot;&gt;
&lt;td style=&quot;width: 7.22641%; height: 19.5938px;&quot;&gt;&lt;strong&gt;Free unit&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;width: 90.5646%; height: 19.5938px;&quot;&gt;A unit not yet consumed by any promotion that is in an exclusion relationship with the current one. This is the pool available for the current promotion.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19.5938px;&quot;&gt;
&lt;td style=&quot;width: 7.22641%; height: 19.5938px;&quot;&gt;&lt;strong&gt;Redemption&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;width: 90.5646%; height: 19.5938px;&quot;&gt;One application of a promotion. If a promotion is applied n times (up to its redemption limit), it produces n redemptions, each consuming its own batch of units.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Evaluation Algorithm&lt;/h3&gt;
&lt;p&gt;The promotion engine processes exclusions with the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Order promotions by priority&lt;/strong&gt;, highest first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For each promotion&lt;/strong&gt;, determine its free units: every unit in the cart that has not been consumed by a promotion in an exclusion relationship with the current one. Units consumed by non-excluding promotions are irrelevant -- they do not reduce the pool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test the condition&lt;/strong&gt;&amp;nbsp;against free units only. If the promotion requires &quot;buy 3&quot; and only 2 free units remain, the condition is not met.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the condition is met&lt;/strong&gt;, redeem. Record both condition units and reward units as consumed by this promotion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the condition cannot be met&lt;/strong&gt;&amp;nbsp;from free units, the promotion does not apply. There is no partial redemption -- the entire condition must be satisfiable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continue&lt;/strong&gt;&amp;nbsp;with the next promotion in priority order.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;There are two ways to enable unit-level exclusion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Global setting&lt;/strong&gt; -- applies to all &lt;code&gt;ApplyDiscounts&lt;/code&gt; calls:&lt;/p&gt;
&lt;div class=&quot;codeBlockWrapper_-a7MRw&quot;&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;services.Configure&amp;lt;PromotionOptions&amp;gt;(options =&amp;gt;
{
    options.PromotionExclusionLevel = ExclusionLevel.Unit;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Per invocation&lt;/strong&gt; -- overrides the global setting for a single call:&lt;/p&gt;
&lt;div class=&quot;codeBlockWrapper_-a7MRw&quot;&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var settings = new PromotionEngineSettings
{
    ExclusionLevel = ExclusionLevel.Unit
};
cart.ApplyDiscounts(_promotionEngine, settings);
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;Declaring Exclusions&lt;/h3&gt;
&lt;p&gt;Exclusions are configured on the &lt;code&gt;PromotionData.ExcludedItems&lt;/code&gt; property, which accepts a list of &lt;code&gt;ContentReference&lt;/code&gt; values. Each reference can point to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A specific promotion&lt;/strong&gt;&amp;nbsp;(&lt;code&gt;otherPromotion.ContentLink&lt;/code&gt;) -- excludes that one promotion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A campaign&lt;/strong&gt;&amp;nbsp;(&lt;code&gt;campaign.ContentLink&lt;/code&gt;) -- excludes all promotions within that campaign&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The campaign root&lt;/strong&gt;&amp;nbsp;(&lt;code&gt;SalesCampaignFolder.CampaignRoot&lt;/code&gt;) -- excludes all other promotions site-wide&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Merchandisers configure these through the Commerce UI under &lt;strong&gt;Discount Priorities and Exclusions&lt;/strong&gt;, without writing code.&lt;/p&gt;
&lt;h2&gt;What Changed in Commerce 14.47.0&lt;/h2&gt;
&lt;h3&gt;Does This Affect Me?&lt;/h3&gt;
&lt;p&gt;You are affected if either of the following is true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You set&amp;nbsp;&lt;code&gt;PromotionOptions.PromotionExclusionLevel = ExclusionLevel.Unit&lt;/code&gt;&amp;nbsp;globally in your service configuration&lt;/li&gt;
&lt;li&gt;You pass&amp;nbsp;&lt;code&gt;ExclusionLevel = ExclusionLevel.Unit&lt;/code&gt;&amp;nbsp;for individual calls through&amp;nbsp;&lt;code&gt;PromotionEngineSettings&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you use the default (&lt;code&gt;ExclusionLevel.Order&lt;/code&gt;), nothing changes. Stop reading here and carry on.&lt;/p&gt;
&lt;h3&gt;Summary of Changes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;Previous behaviour&lt;/th&gt;
&lt;th&gt;New behaviour&lt;/th&gt;
&lt;th&gt;Likely price effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One-way exclusions now work like two-way exclusions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The result depended on which promotion listed the exclusion. Sometimes a promotion was dropped completely.&lt;/td&gt;
&lt;td&gt;It does not matter which promotion lists the exclusion. The lower-priority promotion applies to any units the higher-priority one did not use.&lt;/td&gt;
&lt;td&gt;Bigger discounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product promotions that conflict with order or shipping promotions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depending on setup, shoppers could sometimes combine promotions meant to exclude each other.&lt;/td&gt;
&lt;td&gt;The product promotion is now excluded in full, whichever way the exclusion was set up.&lt;/td&gt;
&lt;td&gt;Smaller discounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Units used by a promotion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A promotion only used up the units it discounted.&lt;/td&gt;
&lt;td&gt;A promotion now uses up all units that met its condition. &quot;Buy 3, get 10% off one&quot; on quantity 10 now leaves 7 units for other promotions, not 9.&lt;/td&gt;
&lt;td&gt;Smaller discounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Buy X get free items, cheapest free, most expensive free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;These promotions could use units that other promotions had already used.&lt;/td&gt;
&lt;td&gt;These promotions now only get units that are left over, like other item discounts.&lt;/td&gt;
&lt;td&gt;Fewer free items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Count units as consumed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only count reward units as consumed.&lt;/td&gt;
&lt;td&gt;Count both condition and reward units as consumed.&lt;/td&gt;
&lt;td&gt;Smaller discounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consistent reporting of excluded promotions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BuyOneGetOneDiscount&lt;/code&gt;&amp;nbsp;returned&amp;nbsp;&lt;code&gt;Excluded&lt;/code&gt;&amp;nbsp;with no redemption. Other types were inconsistent.&lt;/td&gt;
&lt;td&gt;Every product-level promotion that ends up with no units returns&amp;nbsp;&lt;code&gt;Fulfilled&lt;/code&gt;&amp;nbsp;with one redemption whose status is&amp;nbsp;&lt;code&gt;FulfillmentStatus.Excluded&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;No price change, but code that lists applied promotions may need updating&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Detailed Breakdown&lt;/h3&gt;
&lt;h4&gt;One-way vs two-way exclusions&lt;/h4&gt;
&lt;p&gt;Previously, declaring &quot;P1 excludes P2&quot; versus &quot;P2 excludes P1&quot; versus both could yield different results. The engine checked for &quot;double exclusion&quot; (both sides listing each other) as a special case, and the one-way path had different logic from the two-way path.&lt;/p&gt;
&lt;p&gt;Now all three configurations produce identical outcomes. The exclusion relationship is symmetric -- it means &quot;these two promotions must not stack on the same unit.&quot; The higher-priority promotion gets first pick of units; the lower-priority promotion works with whatever is left. The &lt;code&gt;IsDoubleExclusion&lt;/code&gt; method on &lt;code&gt;OrderFormPriceMatrix&lt;/code&gt; is now obsolete because the engine no longer distinguishes between one-way and two-way exclusions.&lt;/p&gt;
&lt;p&gt;The practical effect is that promotions which were previously dropped entirely (because they were on the &quot;wrong&quot; side of a one-way exclusion) now apply to leftover units. This tends to increase discounts.&lt;/p&gt;
&lt;h4&gt;Condition unit consumption&lt;/h4&gt;
&lt;p&gt;This is likely the most impactful change. Consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P1&lt;/strong&gt;&amp;nbsp;(higher priority): Buy 3 of SKU A, get 10% off one. Redemption limit: 1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P2&lt;/strong&gt;: 5% off SKU A.&lt;/li&gt;
&lt;li&gt;P1 and P2 exclude each other.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cart&lt;/strong&gt;: SKU A x 10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Previously, P1 consumed only 1 unit (the one that received the 10% discount). The 3 units that satisfied the &quot;buy 3&quot; condition were not tracked. P2 saw 9 free units.&lt;/p&gt;
&lt;p&gt;Now, P1 consumes 3 units: the 1 reward unit plus the 2 condition-only units. P2 sees 7 free units.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Units&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Unit price&lt;/th&gt;
&lt;th&gt;Line total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;P1 reward (-10%)&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;P1 condition (full price)&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Free, P2 applies (-5%)&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;665&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;955&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This change means promotions with large condition quantities relative to their reward quantities (common in &quot;buy X get Y&quot; structures) now consume more units, leaving fewer for competing promotions. The effect is generally smaller discounts.&lt;/p&gt;
&lt;h4&gt;Order/shipping promotions remain fully exclusive&lt;/h4&gt;
&lt;p&gt;Unit-level exclusion only applies to product-level (&lt;code&gt;DiscountType.LineItem&lt;/code&gt;) promotions. When one side of an exclusion relationship is an order-level or shipping-level promotion, the engine cannot meaningfully split units -- these promotion types operate on the order as a whole. In this case, the product promotion is excluded in full, exactly as it would be under order-level exclusion.&lt;/p&gt;
&lt;p&gt;Previously, depending on how the exclusion was declared, the two promotions could sometimes both apply. This is no longer possible.&lt;/p&gt;
&lt;h2&gt;Developer Migration Guide&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;IsDoubleExclusion&lt;/code&gt;&amp;nbsp;Is Obsolete&lt;/h3&gt;
&lt;p&gt;If your code calls &lt;code&gt;OrderFormPriceMatrix.IsDoubleExclusion&lt;/code&gt;, replace it with &lt;code&gt;OrderFormPriceMatrix.IsExcluded&lt;/code&gt;. The &lt;code&gt;IsExcluded&lt;/code&gt; method handles one-way and two-way exclusions identically, which matches the new engine behaviour. &lt;code&gt;IsDoubleExclusion&lt;/code&gt; still works but will be removed in a future major version.&lt;/p&gt;
&lt;h3&gt;Custom Processors Based on&amp;nbsp;&lt;code&gt;GetFreeItemsProcessorBase&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;GetAffectedEntries&lt;/code&gt; method now only returns product codes that still have free units available. If your custom free-item processor overrides this method, be aware that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your processor may receive fewer batches than before, because units consumed as conditions by higher-priority promotions are no longer available.&lt;/li&gt;
&lt;li&gt;Review and test any custom logic that assumes all cart units are available.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Filtering Applied Promotions&lt;/h3&gt;
&lt;p&gt;Code that lists applied promotions -- for cart messages, analytics, order confirmation, or order notes -- must now account for excluded redemptions. A promotion whose units were all consumed by excluding promotions is still returned with status &lt;code&gt;Fulfilled&lt;/code&gt; (its condition was met by the cart contents), but its single redemption carries status &lt;code&gt;FulfillmentStatus.Excluded&lt;/code&gt;. It saves nothing, adds no gift items, and should not count as &quot;applied&quot; in the UI.&lt;/p&gt;
&lt;p&gt;Filter these out:&lt;/p&gt;
&lt;div class=&quot;codeBlockWrapper_-a7MRw&quot;&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var applied = rewardDescriptions.Where(r =&amp;gt;
    r.Status.HasFlag(FulfillmentStatus.Fulfilled) &amp;amp;&amp;amp;
    r.Redemptions.Any(x =&amp;gt; x.Status != FulfillmentStatus.Excluded));
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Without this filter, you may display promotions to the shopper that saved nothing, which is confusing.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;RewardApplicatorBase&lt;/code&gt;&amp;nbsp;Changes&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;Apply&lt;/code&gt; method in &lt;code&gt;RewardApplicatorBase&amp;lt;T&amp;gt;&lt;/code&gt; no longer marks an excluded gift redemption as fulfilled. If you have custom reward applicators that extend this base class, review this change and ensure your override does not rely on the old behaviour.&lt;/p&gt;
&lt;h2&gt;Worked Examples&lt;/h2&gt;
&lt;h3&gt;Example A: Promotion That Cannot Be Satisfied from Free Units&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P1 (higher priority): Buy 2 of SKU A, get the cheapest free&lt;/li&gt;
&lt;li&gt;P2: Buy 3 of SKU A, get them for fixed 20 each&lt;/li&gt;
&lt;li&gt;P1 and P2 exclude each other&lt;/li&gt;
&lt;li&gt;Cart: SKU A x 3 @ 100 each&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: P1 consumes 2 units (1 condition + 1 reward). Only 1 free unit remains -- fewer than P2&#39;s requirement of 3. P2 does not apply.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;P1 units&lt;/th&gt;
&lt;th&gt;Free units&lt;/th&gt;
&lt;th&gt;P2 applies?&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cart quantity 3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cart quantity 4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cart quantity 5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Yes (3 x 20)&lt;/td&gt;
&lt;td&gt;260&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The key takeaway: P2 needs 3 free units. Adding a 4th unit to the cart still only gives 2 free (P1 has already consumed 2). Only when the 5th unit is added does P2 have enough.&lt;/p&gt;
&lt;h3&gt;Example B: Partial Overlap Across SKUs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P1 (higher priority): Buy any 3 across SKUs A, B, C, get 10% off&lt;/li&gt;
&lt;li&gt;P2: Buy any 2 across SKUs C, D, E, get 5% off&lt;/li&gt;
&lt;li&gt;P1 and P2 exclude each other&lt;/li&gt;
&lt;li&gt;Cart: A x 1, B x 1, C x 2, D x 1, E x 1 (all at 100)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: P1 consumes A x 1, B x 1, C x 1 (3 units). Only the overlapping SKU (C) is reduced for P2&#39;s pool. D and E were never touched by P1.&lt;/p&gt;
&lt;p&gt;P2&#39;s free pool: C x 1, D x 1, E x 1 = 3 free units. P2&#39;s condition of 2 is met. P2 applies.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SKU&lt;/th&gt;
&lt;th&gt;Qty&lt;/th&gt;
&lt;th&gt;Consumed by P1&lt;/th&gt;
&lt;th&gt;Free for P2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0 (not in P2&#39;s target)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0 (not in P2&#39;s target)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The critical detail: only overlapping SKUs have their free count reduced. Subtracting P1&#39;s total consumed count (3) from every SKU in P2&#39;s pool would wrongly starve D and E, which P1 never touched. The engine tracks consumption per SKU, not as a global counter.&lt;/p&gt;
&lt;h3&gt;Example C: Order-Level Promotion Falls Back to Full Exclusion&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P1 (higher priority): 50 off the order (&lt;code&gt;DiscountType.Order&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;P2: 20% off Men&#39;s Shoes (&lt;code&gt;DiscountType.LineItem&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;P1 and P2 exclude each other&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: P1 is not a line-item promotion, so there are no individual units to split. P2 is excluded in full. Unit-level exclusion never weakens an exclusion involving order-level or shipping-level promotions.&lt;/p&gt;
&lt;p&gt;This is by design. Order and shipping promotions operate on the order as a whole. There is no meaningful way to determine which specific product units an order-level discount &quot;consumed,&quot; so the engine falls back to full exclusion for safety.&lt;/p&gt;
&lt;h3&gt;Example D: Non-Excluding Promotion Between Two Excluding Ones&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P1 (highest priority): Buy 2 of Men&#39;s, get the most expensive free&lt;/li&gt;
&lt;li&gt;P2 (medium priority): Buy 2 of Men&#39;s, get 50% off --&amp;nbsp;&lt;strong&gt;no exclusions declared&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;P3 (lowest priority): Spend 10 or more, get a gift item free&lt;/li&gt;
&lt;li&gt;P1 and P3 exclude each other. P2 has no exclusion relationships with anyone.&lt;/li&gt;
&lt;li&gt;Cart: Men&#39;s item x 2 @ 33.50&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;P1&lt;/strong&gt;&amp;nbsp;consumes 2 units (1 condition + 1 reward). The most expensive unit is free.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P2&lt;/strong&gt;&amp;nbsp;has no exclusion relationships, so it sees all units as available. P2 stacks on top of P1&#39;s result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P3&lt;/strong&gt;&amp;nbsp;checks its free pool: both units were consumed by P1 (which excludes P3). Effective value from free units is 0, which is below the 10 threshold. P3 does not apply.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The key insight: a non-excluding promotion (P2) cannot release units that an excluding promotion (P1) consumed. Exclusion tracking is per unit against the original claiming promotion. P2 freely stacks because it has no exclusion relationships, but P3&#39;s view of the cart is restricted to units P1 did not consume.&lt;/p&gt;
&lt;h2&gt;Recommendations and Known Limitations&lt;/h2&gt;
&lt;h3&gt;Migration Checklist&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check your setup&lt;/strong&gt;&amp;nbsp;-- confirm whether your site uses&amp;nbsp;&lt;code&gt;ExclusionLevel.Unit&lt;/code&gt;. Search your codebase for&amp;nbsp;&lt;code&gt;ExclusionLevel.Unit&lt;/code&gt;&amp;nbsp;and check your service configuration for&amp;nbsp;&lt;code&gt;PromotionOptions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review your active promotions&lt;/strong&gt;&amp;nbsp;-- focus on mutual exclusions, product vs order/shipping mixes, and buy-X or free-item promotions. These are the areas where behaviour has changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test before you go live&lt;/strong&gt;&amp;nbsp;-- compare order totals on a test environment before and after the upgrade, using carts that match your real promotion mix. Automated tests with known expected totals are ideal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update your code&lt;/strong&gt;&amp;nbsp;-- replace&amp;nbsp;&lt;code&gt;IsDoubleExclusion&lt;/code&gt;&amp;nbsp;with&amp;nbsp;&lt;code&gt;IsExcluded&lt;/code&gt;, review custom free-item processors, and update any promotion-listing code to filter excluded redemptions.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;When to Use Which Level&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Order level&lt;/strong&gt;&amp;nbsp;(default): when exclusion means &quot;these offers must never both appear on this order.&quot; Example: a loyalty programme offer that is void when a clearance sale is active.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unit level&lt;/strong&gt;: when exclusion means &quot;do not stack these on the same product unit.&quot; Example: a category-wide promotion alongside a brand-specific promotion where you want both to apply, just not to the same item.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Known Limitation&lt;/h3&gt;
&lt;p&gt;When one promotion covers several products and only some of those products overlap with an excluding promotion, the discount can still land on units already used by the other promotion in certain edge cases involving multi-product reward distributions. Single-SKU pools and non-overlapping pools are not affected by this limitation.&lt;/p&gt;
&lt;h3&gt;A Note on Switching Levels&lt;/h3&gt;
&lt;p&gt;Switching from order-level to unit-level exclusion generally &lt;em&gt;increases&lt;/em&gt; the total discount on an order, because promotions that were previously blocked entirely can now apply to leftover units. Model the margin impact before changing this setting in production.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.developers.optimizely.com/commerce-connect/docs/promotion-exclusions&quot;&gt;Optimizely developer documentation: Promotion exclusions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The full technical specification for the unit-level exclusion model is available for Optimizely partners and employees&lt;/li&gt;
&lt;/ul&gt;</description>            <guid>https://world.optimizely.com/blogs/viet-anh-nguyen/dates/2026/10/unit-level-promotion-exclusions-updated-behaviour-and-developer-guide/</guid>            <pubDate>Fri, 23 Oct 2026 07:27:33 GMT</pubDate>           <category>Blog post</category></item><item> <title>Upgrade Guide: Commerce 14 to Commerce 15 preview </title>            <link>https://world.optimizely.com/blogs/viet-anh-nguyen/dates/2026/3/upgrade-guide-commerce-14-to-commerce-15-preview-/</link>            <description>&lt;div class=&quot;SCXW92401041 BCX0&quot;&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;This document provides step-by-step instructions to upgrade a Commerce site from Commerce 14/CMS 12 to Commerce 15/CMS 13 preview.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Overview&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;This upgrade includes:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Commerce&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: 14.15.3 &amp;rarr; 15.0.0-preview1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;CMS&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: 12.31.2 &amp;rarr; 13.0.0-preview4&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;.NET&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: 8.0 &amp;rarr; 10.0&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Prerequisites&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Visual Studio 2022 with .NET 10.0 SDK&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;SQL Server (&lt;/span&gt;&lt;span class=&quot;NormalTextRun SpellingErrorV2Themed SCXW92401041 BCX0&quot;&gt;LocalDB&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;nbsp;or full instance)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Basic understanding of Optimizely Commerce and CMS&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Step 1: Create a new Commerce 14 empty site from template&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;To create a baseline Commerce 14 site from template:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Run the template command:&lt;/span&gt;&lt;/span&gt; &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code&gt;dotnet new epi-commerce-empty --name CoCo14 --force&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Open the project, restore packages, and build it&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Press F5 and create a user by accessing:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://localhost:5000/util/register&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;https://localhost:5000/util/register&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Log in at:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://localhost:5000/util/login&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;https://localhost:5000/util/login&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Migrate Commerce data:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://localhost:5000/episerver/commerce/migrate&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;https://localhost:5000/episerver/commerce/migrate&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Verify the CMS/Commerce Admin UI:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://localhost:5000/episerver/cms&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;https://localhost:5000/episerver/cms&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Verification&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: Ensure the site is running without errors before&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;proceeding&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Step 2: Update Project Configuration&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;File Modified&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: [CoCo14.csproj]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Target Framework&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;  &amp;lt;!-- was net8.0 --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Package References&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Before&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;(Simple metapackage approach):&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&amp;lt;PackageReference Include=&quot;EPiServer.CMS&quot; Version=&quot;12.31.2&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Commerce&quot; Version=&quot;14.15.3&quot; /&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;After&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;(Explicit package references):&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Commerce packages:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&amp;lt;PackageReference Include=&quot;EPiServer.Commerce&quot; Version=&quot;15.0.0-preview1&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;CMS packages (all version 13.0.0-preview4):&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&amp;lt;PackageReference Include=&quot;EPiServer.OptimizelyIdentity&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.CMS.UI.AspNetIdentity&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;Optimizely.Graph.Cms&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Cms.UI.ContentManager&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Hosting&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Cms.UI.VisitorGroups&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.CMS.Shell.UI&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.CMS.UI&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.ImageLibrary.ImageSharp&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Events.ChangeNotification&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Cms.AspNetCore.TagHelpers&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Cms.AspNetCore.HtmlHelpers&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt; 
&amp;lt;PackageReference Include=&quot;EPiServer.Cms.TinyMce&quot; Version=&quot;13.0.0-preview4&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Step 3: Update Startup Configuration&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;File Modified&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;NormalTextRun SpellingErrorV2Themed SCXW92401041 BCX0&quot;&gt;Startup.cs&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Update Service Registration&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Before&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;(Commerce 14 - Simple metapackage registration):&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;services 
    .AddCmsAspNetIdentity&amp;lt;ApplicationUser&amp;gt;() 
    .AddCommerce() 
    .AddAdminUserRegistration() 
    .AddEmbeddedLocalization&amp;lt;Startup&amp;gt;(); &lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;After&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;(Commerce 15 - Explicit service registration):&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;services 
    .AddCmsHost() 
    .AddCmsCore() 
    .AddCmsAspNetIdentity&amp;lt;ApplicationUser&amp;gt;() 
    .AddCmsHtmlHelpers() 
    .AddCmsTagHelpers() 
    .AddCmsUI() 
    .AddAdmin() 
    .AddCmsImageSharpImageLibrary() 
    .AddTinyMce() 
    .AddContentGraph() 
    .AddContentManager() 
    .AddCommerce() 
    .AddVisitorGroupsMvc() 
    .AddVisitorGroupsUI() 
    .AddAdminUserRegistration() 
    .AddEmbeddedLocalization&amp;lt;Startup&amp;gt;(); 
 
services.Configure&amp;lt;DataAccessOptions&amp;gt;(options =&amp;gt; 
{ 
    options.UpdateDatabaseCompatibilityLevel = true; 
}); &lt;/code&gt;&lt;/pre&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Step 4: Update Application Settings&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;SCXW92401041 BCX0&quot;&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;File Modified&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;NormalTextRun SpellingErrorV2Themed SCXW92401041 BCX0&quot;&gt;appsettings.json&lt;/span&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Add the following Optimizely configuration section for Content Graph&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code&gt;&quot;Optimizely&quot;: { 
  &quot;ContentGraph&quot;: { 
    &quot;GatewayAddress&quot;: &quot;https://cg.optimizely.com&quot;, 
    &quot;AppKey&quot;: &quot;&amp;lt;app-key&amp;gt;&quot;, 
    &quot;Secret&quot;: &quot;&amp;lt;secret&amp;gt;&quot;, 
    &quot;SingleKey&quot;: &quot;&amp;lt;single-key&amp;gt;&quot;, 
    &quot;AllowSendingLog&quot;: &quot;true&quot; 
  } 
} &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;br /&gt;Important&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;: Replace the placeholder values (&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;lt;app-key&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;lt;secret&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;lt;single-key&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;lt;instance-id&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;) with your actual credentials from the Optimizely portal.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Step 5: Restore, Build, and Run Migration&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;After making all the changes:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Restore packages&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code&gt;dotnet restore&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Build the project&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code&gt;dotnet build&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Run the application&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul class=&quot;NumberListStyle2 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Press F5 in Visual Studio, or&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ol&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul class=&quot;NumberListStyle2 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Run&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;dotnet run&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;nbsp;from the command line&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Run Commerce migration&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ol&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul class=&quot;NumberListStyle2 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Navigate to:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://localhost:5000/Optimizely/commerce/migrate&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;https://localhost:5000/Optimizely/commerce/migrate&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ol&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul class=&quot;NumberListStyle2 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;This will update the database schema and migrate data to Commerce 15 format&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&lt;br /&gt;Step 6: Verify the Upgrade&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;NumberListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Access the Commerce Admin UI&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Navigate to &lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://localhost:5000/Optimizely/Commerce/&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;https://localhost:5000/Optimizely/Commerce/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Important Notes&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;SCXW92401041 BCX0&quot;&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Code Compatibility&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Depending on your Commerce solution, you may need to update source code due to API changes in CMS 13 and Commerce 15. See the&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://docs.developers.optimizely.com/content-management-system/v13-Pre-Release/docs/overview-of-cms-13-pre-release&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;CMS 13 Pre-Release overview&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;nbsp;for details.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Commerce 15-compatible versions for popular Commerce add-ons will be released later&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Preview Versions&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Commerce 15.0.0-preview1&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;CMS 13.0.0-preview4&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;&amp;nbsp;are pre-release versions&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Not recommended for production use&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Use for evaluation and testing purposes only&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;strong&gt;&lt;span class=&quot;TextRun SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Additional Resources&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://docs.developers.optimizely.com/commerce-connect/docs/creating-your-project&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;How to create an empty commerce project from which you can build your Optimizely Commerce Connect website&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;/link/401767d8a5e8446db6e213b139618c2d.aspx&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Official upgrade guide: CMS 12 to CMS 13&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListContainerWrapper SCXW92401041 BCX0&quot;&gt;
&lt;ul class=&quot;BulletListStyle1 SCXW92401041 BCX0&quot;&gt;
&lt;li class=&quot;OutlineElement Ltr SCXW92401041 BCX0&quot;&gt;
&lt;p class=&quot;Paragraph SCXW92401041 BCX0&quot;&gt;&lt;a class=&quot;Hyperlink SCXW92401041 BCX0&quot; href=&quot;https://docs.developers.optimizely.com/commerce-connect/v15-pre-release/docs/overview-of-commerce-15-pre-release&quot;&gt;&lt;span class=&quot;TextRun Underlined SCXW92401041 BCX0&quot;&gt;&lt;span class=&quot;NormalTextRun SCXW92401041 BCX0&quot;&gt;Overview of Commerce 15 pre-release&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;EOP SCXW92401041 BCX0&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description>            <guid>https://world.optimizely.com/blogs/viet-anh-nguyen/dates/2026/3/upgrade-guide-commerce-14-to-commerce-15-preview-/</guid>            <pubDate>Tue, 31 Mar 2026 03:59:41 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>