Last updated

Price list type priority in Norce Commerce

This page explains the design intent and behavior of price list type priority in Norce Commerce. It is intended for solution architects and developers who design B2B pricing behavior.

How best price works by default

For each pricing request, Norce evaluates all eligible price lists and returns the lowest price:

  • Public price lists.
  • Price lists connected to the customer or company.
  • Price lists included in PriceListSeed.

This default behavior is correct for many scenarios, but not always for agreement-based B2B pricing.

Problem this feature solves

In B2B commerce, the commercially correct price is not always the lowest price. A project or contract price can be intentionally higher because it includes terms such as service, support, or warranty commitments.

Before type priority, enforcing contract precedence typically required storefront logic (for example, tightly controlled PriceListSeed values or row-level PriceListLocked). That approach is harder to maintain and audit across markets and integrations.

How type priority works

Price list types add a ranking layer above individual price lists. Each price list belongs to one type, and each type can have a numeric priority.

When type priority is configured, Norce evaluates price lists in priority order:

  1. Group eligible price lists by type priority.
  2. Evaluate priority 1 first and find the best price inside that group.
  3. If no price exists for the product in that group, continue to priority 2, then 3, and so on.
  4. The first priority group that returns a price wins.

Within one priority group, normal best-price logic still applies (lowest price in that group).

Relationship to existing mechanisms

Type priority complements existing mechanisms; it does not replace them.

MechanismWhere logic livesBest suited for
Type priorityNorce configurationPersistent precedence between price list types
PriceListSeedAPI request contextDynamic control of price list scope per request
PriceListLocked (basket row)Storefront and basket line itemExplicit storefront override that locks one specific price list for one row

PriceListSeed and type priority are commonly used together:

  • PriceListSeed decides which price lists can participate.
  • Type priority decides which type is evaluated first.

PriceListLocked overrides type priority for the locked basket row. This means the storefront can force a specific price list even when Norce configuration would otherwise select another list.

PriceListLocked should be used sparingly now that type priority is available. A common valid use case is when two price lists return the same price but you still need to control which price list is used, for example to control where goods are reserved from.

Note: The client setting "When PriceListSeed is used, disregard public price lists" still applies when type priority is active. If enabled, only seeded price lists are evaluated, and priority is applied within that seeded set.

Price lists without type

A price list without a type and a typed price list with null priority are treated the same. Both are evaluated at the lowest effective priority, and only considered when no price is returned from price lists with an explicit numeric type priority.

Product Feed impact when type priority is enabled

When type priority is enabled for a client, Product Feed behavior changes for the prices output.

Without this feature enabled, the Product Feed returned one best price per sales area.

With this enabled, Product Feed returns one best price per sales area and priority group.

This means the receiver can decide which priority best price to show in each scenario, instead of only receiving one resolved best price per sales area.

In practical terms, the receiver should treat each price entry as scoped by:

  • Sales area.
  • Priority group.

If you consume Product Feed in an external system, update your mapping and selection logic so prices are evaluated by both dimensions (sales area + priority group) when deciding what price to present.