Sunil
Nov 28, 2025
  571
(1 votes)

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

 

Nov 28, 2025

Comments

Please login to comment.
Latest blogs
Announcing new library: SettingsManager

When you run .net app, there have been a few ways to store settings. Those can be set via appSettings.json, or via Azure Portal AppService...

Quan Mai | Apr 30, 2026

From Prompting to Production: Optimizely Opal University Cohort and the Future of Agentic MarTech

Most organizations today are still playing with AI. They experiment with prompts, test ideas in isolated chats, and occasionally automate a task or...

Augusto Davalos | Apr 28, 2026

Six Compelling Reasons for Upgrading to CMS 13

Most software updates ask you to keep up. Optimizely CMS 13 asks something different — it asks whether your digital strategy is built for a world...

Muhammad Talha | Apr 28, 2026

Optimizely CMS 13 breaking changes: GetContentTypePropertyDisplayName

When upgrading from CMS 12 to 13, resolving property display names may not work as before. Here’s what changed.

Tomas Hensrud Gulla | Apr 27, 2026 |