Let me try to make sure I have understand you correctly. If I have understood you correctly, you want the user to be charged with the right option automatically.
An important thing to say here is that by default we display only the shipping methods that are applicable for the current cart, so we don't display all available, but only those that are applicable in the context of the currently processed cart.
If in your case, you will always have one applicable method based on the weight of the amount to be shipped, this will be the only one displayed by the system and displayed by it.
Just in case, I haven't understood you correctly, I will send you some code on how you can easily get all the applicable methods manually as well. There is a service called EcommerceShippingMethodService, located in the Telerik.Sitefinity.Modules.Ecommerce.BusinessServices.Shipping.Implementations namespace.
There is a public virtual method called GetApplicableShippingMethods, which you can use to get all shipping methods applicable for the current cart:
public virtual IQueryable<IShippingResponse> GetApplicableShippingMethods(CheckoutState checkoutState, CartOrder cartOrder)
Like most of the shipping carriers (UPS and FedEx), our shipping logic is based on the physical properties of the shopping cart like dimensions and weight and not on the monetary properties of the products.
So to achieve you shipping price you will have to extend the system's default behavior. Here is a general overview of the process.
1) You have to create a ShippingMethod with a custom field to store the shipping percentage rate for the method. You can name the custom field - ShippingPriceProcentage. Here is more info on that (link here)
2) That field won't be accessible through the UI, so to allow the editors to enter the ShippingPricePercentage, you will have to add a custom backend control, configuration or other interface to allow the back-end users to enter the ShippingPricePercentage for every shipping method they will manage.
3) The next thing you will need to solve is to create a class that inherits from ShippingCalculatorBase class located in the Telerik.Sitefinity.Modules.Ecommerce.Shipping.Business.Calculators namespace. You would need to add a new metod public GenericShippingResponse Calculate(ShippingMethod shippingMethod, CartOrder cartOrder, string parms) - this is the same method we use in ShippingcalculatorByWeight and you will need to implemetn somethign similar, but calcualting percentage of the price. Here is the code we use, so you can use it as an example:
ShippingCalculatorByWeight : ShippingCalculatorBase, IOfflineShippingCalculator
GenericShippingResponse Calculate(ShippingMethod shippingMethod, CartOrder cartOrder,
(parms.Length != 4)
(IsShippingDestinationWithinShippingArea(shippingMethod, cartOrder) ==
minimumWeight = String.IsNullOrWhiteSpace(parms) ?
.MinValue : Double.Parse(parms, CultureInfo.InvariantCulture);
maximumWeight = String.IsNullOrWhiteSpace(parms) ?
.MaxValue : Double.Parse(parms, CultureInfo.InvariantCulture);
(minimumWeight > maximumWeight)
(cartOrder.Weight >= minimumWeight && cartOrder.Weight <= maximumWeight)
price = GetPriceParameterValue(parms);
/// Concrete implementation of IEcommerceShippingMethodService
EcommerceShippingMethodService : IEcommerceShippingMethodService
#region IEcommerceShippingMethodService Methods
/// <inheritdoc />
IQueryable<IShippingResponse> GetApplicableShippingMethods(CheckoutState checkoutState, CartOrder cartOrder)
var shippingManager = ShippingManager.GetManager();
List<IShippingResponse> availableShippingMethods =
var onlineShippingMethodRetriever =
, IShippingResponse> uniqueShippingMethods =
availableShippingMethods = uniqueShippingMethods.Values.ToList();
var offlineShippingMethodRetriever =
availableShippingMethods = availableShippingMethods.OrderBy(x => x.SortOrder).ToList();