Sitecore Experience Commerce 10

Let's explore Sitecore Experience Commerce 10

Sitecore Experience Commerce 10 was released just a few days ago. If you want a quick summary of the new features and improvements, this is where you should start! I was able to get it up and running in under 35 minutes (along with SXP). There are numerous new features, improvements in the framework and performance tweaks. Read on for a quick summary of the major changes in this new version of SXC.

Sitecore CH to XC Connector

Sitecore Experience Commerce 10.0 is compatible with Sitecore Content Hub release 3.2.203.  There is a sample plugin in the SDK for connecting to Content Hub. Before this connector can push updates from Content Hub into Sitecore Experience Commerce, products have to be synched from ERP into CH and XC. It is a one-way, asynchronous data synchronization - from Sitecore Content Hub to Sitecore Experience Commerce. The data synchronization is triggered by product update operations in Sitecore Content Hub. Asset synchronization from DAM support Images, other types of digital assets (PDFs, etc) are not supported at the moment but the plugin can be easily extended to support those use cases. An update on a product in Content Hub, will push an update to the latest version of the corresponding sellable item in Sitecore XC. 

Support for Containers

XC 10 supports deployments via container. Developers can also use the sample container image to spin up a new instance of SXC 10 without a lot of work. Containers allow you to package your application and its dependencies together into one compact manifest that can be version controlled, allowing for easy replication of your application across developers on your team and machines in your cluster. For managing multiple instances of your app deployed via container, K8S (Kubernetes) is used. SXC provides a new deployment option based on Docker and Kubernete. This is definitely a good feature to add since this also reduces the dependency on the guest OS and allows portability.

Generic search framework

With XC 10, comes a new framework that supports a generic and provider agnostic search framework. You can use the exposed API or use it internally for you custom pipeline block, where you need to search for entities. It provides the ability to search for catalog items, price cards, orders, customers and promotions and discovery of commerce entities such as promotions, price cards. A direct benefit of this can be found in the price module, where retrieving price cards and promotions use this framework instead of directly going to database and fetching the entities. This framework also provides a standard way to query entities in XC 10

The generic search framework exposes the following GenericSearch API end-point {{ServiceHost}}/{{ShopsApi}}/GenericSearch().


There have been quite a few changes in the promotions module, from adding new benefit types, to consolidating the cart level and cart line level discount logic into one block. There is also an option to add a priority to promotions now. A new benefit added - Free Gift. This allows you to award the customer with another product without changing the cart total. You can specify if the free products can be directly added to cart or the customer has the option pick one or many from a selection of products. 



The pipeline ICalculateCartPipeline has been modified to use a single block to calculate the discounts. It is called CalculateCartPromotionsBlock

It is now possible to return eligible promotions for products. For APIs that return sellable items, such as GetSellableItemsSummary, the promotion is returned in the AssociatedPromotionsComponent. For APIs that return pricing information, such as GetSellableItemsSummary(), the promotion is returned in the SellableItemPricing.

To control the sequence of calculating promotions, where multiple promotions apply to the cart, you can specify a priority in business tools on a promotion.This improves control in how overlapping promotions are intended to apply.


Dynamic Bundles

XC 10 supports dynamic bundles. How are these different from static bundles? - You could make certain products optional, upgradeable and specify unit price on each item in the dynamic bundle. This feature is an extension of static bundles. You can either leave the price calculation to Automatic (calculated with unit price of all items selected in bundle) or Manual (Set a manual price override on each item and total price of bundle)

dynamic bundle

Recommended Products Scope

A new search scope has been added in the storefront, that can look at a query or an order id or the last order and recommend products based on the results. The configured related sellable items of the products returned from the query is displayed as the recommended products in storefront. The fallback logic here is to look at the last order (last order could be in the same session- uses CommerceInteractionCache). You can also control the number of items to be displayed in the widget on the storefront.



The add to cart functionality has been modified to accept multiple cart lines at once. This is extremely helpful when a quick order scenario is being developed. 

The new AddCartLines API calculates the cart only once, and not for each line item added. The calculate cart total pipelines for cart line and cart have been merged into one pipeline.You can see below that the AddToCart action is calling Plugin.Carts.ICalculateCartPipeline  only

IAddCartLinesPipeline (Sitecore.Commerce.Plugin.Carts.CartLinesArgument => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.Catalog.ValidateSellableItemsBlock (Sitecore.Commerce.Plugin.Carts.CartLinesArgument => Sitecore.Commerce.Plugin.Carts.CartLinesArgument)
     Plugin.Availability.ValidateFreeGiftAvailabilityBlock (Sitecore.Commerce.Plugin.Carts.CartLinesArgument => Sitecore.Commerce.Plugin.Carts.CartLinesArgument)
     Plugin.Carts.ValidateFreeGiftsBlock (Sitecore.Commerce.Plugin.Carts.CartLinesArgument => Sitecore.Commerce.Plugin.Carts.CartLinesArgument)
     Plugin.Carts.AddCartLinesBlock (Sitecore.Commerce.Plugin.Carts.CartLinesArgument => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.Carts.AddContactBlock (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.Carts.IPopulateValidateCartPipeline (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.GiftCards.AddCartLineGiftCardBlock (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.DigitalItems.AddCartLineDigitalProductBlock (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.DigitalItems.AddCartLineWarrantyBlock (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.DigitalItems.AddCartLineInstallationBlock (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Plugin.Carts.ICalculateCartPipeline (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Plugin.Carts.Cart)
     Core.PrepArgumentToPersistEntityBlock`1[Sitecore.Commerce.Plugin.Carts.Cart] (Sitecore.Commerce.Plugin.Carts.Cart => Sitecore.Commerce.Core.PersistEntityArgument)
     Core.IPersistEntityPipeline (Sitecore.Commerce.Core.PersistEntityArgument => Sitecore.Commerce.Core.PersistEntityArgument)
     Core.PostPersistEntityBlock`1[Sitecore.Commerce.Plugin.Carts.Cart] (Sitecore.Commerce.Core.PersistEntityArgument => Sitecore.Commerce.Plugin.Carts.Cart)

Pricing and Promotions pipelines have been modified to improve performance. These blocks now use the generic search framework and don't go to database. An empty cart does not load promotions.

There are also other performance improvements in indexing, caching (bulk caching in redis) and storefront. 

There are numerous Storefront fixes and updates as well.