Design your price structure

Design your price lists

How many lists you need, how to scope them, and how to set priority so resolution stays predictable.

A price list is the container that makes a price apply to somebody. Getting the set of lists right is a one-hour design job that decides whether pricing stays explainable for the next five years.

Before you start: read How pricing works, specifically the resolution order. Designing lists without it produces a structure that behaves correctly by accident.

Start with the smallest set that works

Almost every B2B company can start here:

ListCodeScopePriority
Standard catalogue price, EURstandardnone (the default list)0
One list per foreign currencystandard-chfmarket: Switzerland0
One list per customer with an agreementkd-10042organization10

That is it. Do not create a list per customer segment, per sales rep, per product group or per year until a concrete requirement forces it. Each extra list is another line in the answer to "why did this buyer get this price".

Add lists when a requirement cannot be expressed on an existing one:

  • A different currency. Always a new list; currency is per list.
  • A different net/gross basis. Always a new list.
  • A campaign with an end date. A new list with a validity window, so that it disappears by itself.
  • A channel-specific price book, for example prices that only apply inside a punchout catalogue.

Naming and codes

The code is permanent and is what integrations, imports and your ERP use to address the list. Treat it like a SKU.

  • Lowercase, no spaces: standard, standard-chf, kd-10042, aktion-q1-2026.
  • Encode the currency when there is more than one: haendler-eur, haendler-chf.
  • For customer lists, use the ERP customer number, not the company name. Companies get renamed and acquired; customer numbers do not.
  • Do not encode a year unless the list is genuinely annual and will be replaced.

The name is what your colleagues read in the grid. Make it say who it is for: "Müller Industriebedarf — Rahmenvertrag 2026", not "Preisliste 4".

Create a list

  1. Go to Order Management › Prices › Price lists and select New price list.
  2. Enter the code, the name and the currency (ISO, three letters: EUR, CHF). Only lists in the buyer's currency ever resolve, so this is the first thing that must be right.
  3. Select Create list. You land on the list, which is empty.
  4. Select Edit list and complete the rest, as described below.

Scope: who the list applies to

On the list, the Applies to section holds three fields, and the rule for all three is the same: empty widens, filled narrows.

FieldEmpty meansFilled means
AccountEvery accountOnly this organization
ContactAnyone at the accountOnly this person
ChannelEvery channelOnly this channel

A list with all three empty applies to everyone. That is correct for your standard list and almost never correct for anything else.

Markets work the same way and sit in their own section: pick no market and the list resolves in every market; pick one or more and it resolves only there.

The most common mistake in this area is creating a customer price list and forgetting to set the Account. The list is valid, active, and applies to every buyer in the shop, including the ones who did not negotiate it. Check the Applies to column in the price list grid after you create any customer list.

Priority

Priority is an integer, and higher wins. It only ever sorts lists that are equally specific. It cannot make an open list beat a customer list.

A scheme that stays readable:

PriorityUse for
0Standard and default lists
10Normal customer and contract lists
50Campaign lists that must beat a contract price for their window
100Emergency corrections you intend to remove

Leave gaps. Priorities 0, 1, 2, 3 leave you nowhere to insert anything.

If two equally specific lists carry the same priority, a configured tiebreak rule decides, by default the cheapest price for the buyer. That is a safety net, not a design. See Rounding, defaults and resolution rules.

The default list

Exactly one list should carry Default list. It is the last resort: the list used when nothing more specific applies to the buyer. In practice this is your standard catalogue list.

The default list cannot be deleted while it holds the flag; make another list the default first. That is deliberate; a tenant with no default list has articles that silently have no price.

Validity and status

Valid from / Valid until on the list decide whether the list exists at all today. Outside the window it does not resolve, and the buyer falls through to whatever is next. Use it for campaigns and for contracts with a fixed term.

Status is the manual switch. An inactive list never resolves, whatever its priority or validity says; the list detail shows a banner saying exactly that. Use inactive to park a list you are preparing. To end a campaign, use a validity window, which ends by itself; a status does not.

Logged-in buyers only

Logged-in buyers only on a list means anonymous visitors skip it entirely.

This is how you avoid publishing your price book to the open web while still running a public catalogue. Set it on every customer and contract list without exception.

If your policy is "no prices at all for anonymous visitors", do not rely on remembering the flag on every list you ever create. Set it once for the tenant instead. See Rounding, defaults and resolution rules.

What to check

Open Order Management › Prices › Price lists and read the grid across:

  • Exactly one row has Default.
  • Every customer list shows an account under Applies to.
  • Every list has a Net / gross value. An empty one raises a warning banner on the list, because the stored amounts then mean whatever a tenant-wide setting says.
  • No two active lists have the same scope and the same priority.
  • Validity dates are the ones you intended, in the right year.

Next