public async override Task <CommerceEntity> Run(CommerceEntity arg, CommercePipelineExecutionContext context) { Condition.Requires(arg).IsNotNull($"{this.Name}: The argument can not be null"); var sellableItem = arg as SellableItem; if (sellableItem == null) { return(arg); } var externalSettingsComponent = sellableItem.GetComponent <ExternalSettingsComponent>(); var allParents = GetAllParents(sellableItem); var settingsCollection = GetExternalSettings(externalSettingsComponent); var sellableItemSitecoreId = sellableItem.SitecoreId; foreach (var parent in allParents) { Guid settingsGuid = GuidUtility.GetDeterministicGuid($"{sellableItemSitecoreId}|{parent}"); Tracking tracking = new Tracking(); Dictionary <string, Dictionary <string, string> > settings; if (settingsCollection.ContainsKey(settingsGuid)) { settings = settingsCollection[settingsGuid]; if (settings.ContainsKey("shared")) { if (settings["shared"].ContainsKey("__Tracking")) { tracking = settings["shared"]["__Tracking"].XmlDeserializeFromString <Tracking>(); } } } else { settings = new Dictionary <string, Dictionary <string, string> >(); settingsCollection.Add(settingsGuid, settings); } var result = await Commander.Pipeline <ISetTrackingFieldPipeline>().Run(new TrackingFieldArgument(sellableItem, parent, tracking), context); var serializedTrackingField = result.TrackingField.XmlSerializeToString(); if (!settings.ContainsKey("shared")) { settings.Add("shared", new Dictionary <string, string>()); } var sharedSettings = settings["shared"]; if (!sharedSettings.ContainsKey("__Tracking")) { sharedSettings.Add("__Tracking", serializedTrackingField); } else { settings["shared"]["__Tracking"] = serializedTrackingField; } } externalSettingsComponent.Settings = JsonConvert.SerializeObject(settingsCollection); return(arg); }