Sunil
+3
Nov 28, 2025
visibility 665
star star star star star
(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

error Please login to comment.
Latest blogs
Automated Search & Navigation to Graph Migration with Claude Code

A Claude Code plugin that scans your S&N codebase, applies Graph SDK transformations, and validates the result. Install once, run one command. CMS ...

Connor Fortin | Jun 24, 2026

Migrating from Find to Graph: Lessons Learned from a Real CMS 13 Project

While migrating a search solution from Optimizely Search & Navigation (Find) to Optimizely Graph in CMS 13, I encountered several issues that were...

Binh Nguyen Thi | Jun 24, 2026

Optimizely: Upgrade Opti-ID and .NET 10 in CMS 12

Many Optimizely customers are planning their roadmap around a future migration to Optimizely CMS 13. As a result, upgrades such as Opti ID adoption...

Madhu | Jun 23, 2026 |

Understanding Optimizely Graph: Caching, Webhooks & Avoiding Stale Content (Optimizely SaaS CMS)

📌 Scope: This post covers Optimizely CMS (SaaS) only — using the official @optimizely/cms-sdk and @optimizely/cms-cli packages with Next.js 15. If...

Kiran Patil | Jun 23, 2026 |