Implementing Custom Line Item Pricing in Optimizely Commerce 14
In many enterprise commerce implementations, business users often need the flexibility to override product pricing at the cart level - especially during customer service operations, B2B negotiations, or manual order creation.
Recently, I had a client requirement where the Super Admin (a special CMS/Commerce role) needed the ability to modify the price of each line item directly from the Cart page.
For Example:
If the default price of a product is $1000, a Super Admin should be able to change it to $900, $850, or any custom value - even if this price is not defined in the price lists.
This custom pricing must also continue to work correctly with:
-
The promotions engine
-
Tax calculations
-
Recalculation workflows
-
Order totals
To meet this requirement cleanly and safely, we needed a way to override PlacedPrice at the line item level in a way that stays aligned with Commerce’s pricing pipeline.
This blog explains the correct, Commerce-native way to implement custom line-item pricing.
Use a Custom Price Processor
To implement custom pricing properly, we must plug into Commerce’s pricing pipeline via IPlacedPriceProcessor
1 - Store the Custom Price on the Line Item
When a Super Admin updates the price on the cart page:
lineItem.Properties["SuperAdminCustomPrice"] = customPrice.ToString(); // SuperAdminCustomPrice is meta field
_cartRepository.SaveCart(cart);
This property persists with the cart/item.
2 - Implement the Custom Price Processor
[ServiceConfiguration(typeof(IPlacedPriceProcessor))]
public class SuperAdminPriceProcessor : DefaultPlacedPriceProcessor
{
public override void ApplyPlacedPrice(
IOrderGroup orderGroup,
IOrderForm orderForm,
ILineItem lineItem,
IMarket market)
{
// Allow Commerce to set its default price
base.ApplyPlacedPrice(orderGroup, orderForm, lineItem, market);
// Check for Super Admin’s custom price
if (!lineItem.Properties.ContainsKey("SuperAdminCustomPrice"))
{
return;
}
if (decimal.TryParse(
lineItem.Properties["SuperAdminCustomPrice"].ToString(),
out var customPrice))
{
// Save original Commerce price for audit/rollback
lineItem.Properties["OriginalPlacedPrice"] = lineItem.PlacedPrice;
// Apply custom override
lineItem.PlacedPrice = customPrice;
}
}
}
3 - How It Looks in the UI
Your “Edit Price” option on the cart page simply updates the custom property:
if (User.IsInRole("SuperAdmin"))
{
lineItem.Properties["SuperAdminCustomPrice"] = newPrice;
}
This was exactly what the client needed:
A clean, production-safe way for Super Admins to override line item prices without breaking any Commerce functionality.
Thanks,
Sunil Kumar
Comments