The OrderItemPriceCalculationStrategy defines the listPrice of an OrderLine when adding an item to an Order. By default the DefaultOrderItemPriceCalculationStrategy is used.

When is the strategy invoked ?

  • addItemToOrder (only on the new order line)
  • adjustOrderLine (only on the adjusted order line)
  • setOrderShippingAddress (on all order lines)
  • setOrderBillingAddress (on all order lines)

OrderItemPriceCalculationStrategy vs Promotions

Both the OrderItemPriceCalculationStrategy and Promotions can be used to alter the price paid for a product.

The main difference is when a Promotion is applied, it adds a discount line to the Order, and the regular price is used for the value of OrderLine.listPrice property, whereas the OrderItemPriceCalculationStrategy actually alters the value of OrderLine.listPrice itself, and does not add any discounts to the Order.

Use OrderItemPriceCalculationStrategy if:

  • The price calculation is based on the properties of the ProductVariant and any CustomFields specified on the OrderLine, for example via a product configurator.
  • The logic is a permanent part of your business requirements.

Use Promotions if:

  • You want to implement “discounts” and “special offers”
  • The calculation is not a permanent part of your business requirements.
  • The price depends on dynamic aspects such as quantities and which other ProductVariants are in the Order.
  • The configuration of the logic needs to be manipulated via the Admin UI.

Example use-cases

A custom OrderItemPriceCalculationStrategy can be used to implement things like:

  • A gift-wrapping service, where a boolean custom field is defined on the OrderLine. If true, a gift-wrapping surcharge would be added to the price.
  • A product-configurator where e.g. various finishes, colors, and materials can be selected and stored as OrderLine custom fields (see Customizing models.
  • Price lists or bulk pricing, where different price bands are stored e.g. in a customField on the ProductVariant, and this is used to calculate the price based on the current quantity.


interface OrderItemPriceCalculationStrategy extends InjectableStrategy {
        ctx: RequestContext,
        productVariant: ProductVariant,
        orderLineCustomFields: { [key: string]: any },
        order: Order,
        quantity: number,
    ): PriceCalculationResult | Promise<PriceCalculationResult>;




(ctx: RequestContext, productVariant: ProductVariant, orderLineCustomFields: { [key: string]: any }, order: Order, quantity: number) => PriceCalculationResult | Promise<PriceCalculationResult>

Receives the ProductVariant to be added to the Order as well as any OrderLine custom fields and returns the price for a single unit.

Note: if you have any relation type custom fields defined on the OrderLine entity, they will only be passed in to this method if they are set to eager: true. Otherwise, you can use the EntityHydratorto join the missing relations.

Note: the quantity argument was added in v2.0.0