Commonly Used Sitecore Commerce Pipelines

While writing new Sitecore Commerce plugins, I noticed that there a few pipelines that were required in almost all blocks. So i thought of putting together a list of pipelines so that it can be useful for someone who is new to Sitecore Commerce Plugins.

- Useful in checking if an entity of a type and an identifier exists in database or not. It can also create one if you set the parameter to shouldCreate=true


Input - FindEntityTypeArgument - type of entity, identifier and shouldCreate (true/false)

Returns - Bool


For example: To find if a particular inventory set exists or not :


// arg.Name = habitat_inventory or name of your inventory set.
string id = CommerceEntity.IdPrefix() + arg.Name;
var doesExist = await currentBlock._doesEntityExistPipeline.Run(new FindEntityArgument(typeof(InventorySet), id, false), context);


IPersistEntityPipeline - If you are creating an entity, then to persist it to database, you will need to use this pipeline.

Input - PersistEntityArgument - The entity to be persisted and the context.

Returns - PersistEntityArgument


InventorySet inventorySet = new InventorySet();
//set values for inventorySet 
PersistEntityArgument persistEntityArgument = await currentBlock._persistEntityPipeline.Run(new PersistEntityArgument(inventorySet), context);


IAddListEntitiesPipeline -  Creates an entry in the table  [SitecoreCommerce9_SharedEnvironments].[dbo].[CommerceLists] with the given CommerceEntityId . Maintains relationship with the commerce entity and lists


For example, the following command, creates an entry in the table CommerceLists that looks like this

ListEntitiesArgument entitiesArgument1 = new ListEntitiesArgument((IEnumerable)new string[1]  {   inventorySet.Id   }, CommerceEntity.ListName());

ListEntitiesArgument entitiesArgument2 = await inventorySetBlock._addListEntitiesPipeline.Run(entitiesArgument1, context);




We can then use the FindEntityInList pipeline to retrieve this entry.


IFindEntitiesInListPipeline - Returns a list of Commerce Entity matching the conditions in argument.


Input - FindEntitiesInListArgument - type of entity to look for, listname, skip count and take count

Output - FindEntitiesInListArgument  - List of Commerce Entities if found matching the criteria in input.



FindEntitiesInListArgument result= await currentBlock._findEntitiesInListPipeline.Run(new FindEntitiesInListArgument(typeof(InventorySet), string.Format("{0}", (object)CommerceEntity.ListName()), 0, int.MaxValue), context);


The above statement will return a list of all Inventory sets from the table [SitecoreCommerce9_SharedEnvironments].[dbo].[CommerceLists]. You can then iterate and cast the item you want to InventorySet and get data.


if (result!= null)
                CommerceList list = result.List;
                if (list != null)
                    list.Items.ForEach((Action)(item =>
                        InventorySet inventorySet = (InventorySet)item;
                        //just an example but you can add any custom logic.



IGetEnvironmentCachePipeline - Get an item that is in the cache.

Input - EnvironmentCacheArgument - Cache Name

Output : Cache


string cacheKey = string.Format("{0}|{1}|{2}", (object)context.CommerceContext.Environment.Name, (object)context.CommerceContext.CurrentLanguage(), (object)(context.CommerceContext.CurrentShopName() ?? ""));
ProductCachePolicy cachePolicy = context.GetPolicy();
ICache cache = (ICache)null;
List sellableItems = (List)null;
if (cachePolicy.AllowCaching)
  IGetEnvironmentCachePipeline cachePipeline = currentBlock._cachePipeline;
  EnvironmentCacheArgument environmentCacheArgument = new EnvironmentCacheArgument();
  environmentCacheArgument.CacheName = cachePolicy.CatalogsCacheName
  cache = await cachePipeline.Run(environmentCacheArgument, context);
  sellableItems = await cache.Get(cacheKey) as List;
  if (sellableItems != null)
     //custom code to iterate over sellable items
  sellableItems = new List();
  FindEntitiesInListArgument entitiesInListArgument = 


 	new FindEntitiesInListArgument(typeof(SellableItem), string.Format("{0}", 


 	 (object)CommerceEntity.ListName()), 0, int.MaxValue);


     foreach (CommerceEntity commerceEntity in 


	(await currentBlock._findEntitiesInListPipeline.Run(entitiesInListArgument,


       //custom code to iterate over sellable items
     if (cachePolicy.AllowCaching)
       if (cache != null)
          await cache.Set(cacheKey,


	 (ICachable)new Cachable>(sellableItems, 1L), 







Last but not the least, IFindEntityPipeline - Finds an entity of a given type and id. If not found, it can also create an entity without persisting it to the database.


Input - FindEntityArgument - type of entity to find, identifier and shouldCreate if not found

Output - CommerceEntity





To find a sellable item with and Id = 6003213



  CommerceEntity entity = await currentBlock._findEntityPipeline.Run


	(new FindEntityArgument(typeof(SellableItem),


 $"{CommerceEntity.IdPrefix()}6003213", false), context);
             var sellableItem = entity as SellableItem
               if (sellableItem == null)
                    await commerceContext.AddMessage(
                        new object[] { "6002321" },
                        $"Entity  was not found.");
                    return false;
               //if sellableItem not null then do;
               if ((entity is SellableItem))
                    SellableItem sellableItem = entity as SellableItem;
                    var variants = sellableItem.GetComponent();

                    if (variants != null && variants.ChildComponents.Count > 0)
                        foreach (ItemVariationComponent variant in


                            var variantData = (ItemVariationComponent)variant;


 					// all custiom logic to read some data from variant