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);
        }