Prices & units

Overview
Four modules interlock in price determination. Telling them apart answers the most common question of all — why is that the price?
| Surface | What it defines |
|---|---|
| Price tiers | quantity-dependent prices per item — globally, per price list or per customer group |
| Customer prices | customer-specific price lists with terms per item or category |
| Customer groups | groups with discounts, price rules, price display and visibility |
| Packaging units | units of measure, pack sizes per item and free conversions |
Core tasks
Maintain price tiers. Tier sets define which price applies from which quantity. The scope decides the reach: globally for everyone, per price list or per customer group.
Grant customer prices. Customer-specific price lists with terms per item or per category. The category term is the more effective lever — it also applies to items that do not exist yet.
Set up customer groups. A group brings members together and carries price rules, the price display and visibility. It is the remedy against a hundred individual agreements.
Maintain units and pack sizes. Units of measure with dimension, base factor and decimal places; pack sizes per item; free conversions globally or per item — per item also across dimensions, such as "1 piece = 250 g". That conversion is exactly what anybody weighing piece goods or selling weight goods by the piece needs.
Fields in detail
The order of price finding decides which price ends up on the document: a customer price beats a tier, a tier beats the catalogue price. A promotion comes on top of that.
Price tiers
| Field | Required | Values / format | What it does |
|---|---|---|---|
Article productId | yes | an existing article | Which article the tier applies to. |
Scope scope | no | global, price list, customer group | For whom. Global applies to everyone, the other two to a specific list or group. |
Reference refId | with list/group | the list or group | Which list or group is meant. |
Quantity basis qtyBasis | no | per item or whole document | What the quantity is measured on. Whole document adds the same article across several rows — the difference that decides the tier when one article appears twice. |
Tiers tiers | yes | quantity and price per tier | The tier table itself: from what quantity which price applies. |
Rank priority | no | number | What wins when two tiers match. |
Valid from / to validFrom, validTo | no | date | Time limits. Empty means open-ended. |
Brand brandId | no | one of your brands | Which brand the tier applies to. |
Active active | no | yes/no | Whether the tier applies. |
Customer price list
| Field | Required | Values / format | What it does |
|---|---|---|---|
Customer customerUlid | yes | an existing customer | Whose prices. |
Name name | no | text, max. 100 characters | What the list is called, say "framework agreement 2026". |
Prices prices | yes | articles with a price | The agreed prices. They beat everything else — which is why what is contractually promised belongs here, and nothing else. |
Valid from / to validFrom, validTo | no | date | Term of the agreement. After it passes normal price finding applies again without anyone deleting the list. |
Note note | no | text | What the prices rest on. |
Brand brandId | no | one of your brands | For which brand. |
Active active | no | yes/no | Whether the list applies. |
Customer group
| Field | Required | Values / format | What it does |
|---|---|---|---|
Name name | yes | text, max. 100 characters | What the group is called, say "resellers". |
Key key | no | text, max. 50 characters | The technical identifier for import and automation. Do not change it once customers are assigned. |
Default discount (%) defaultDiscountPct | no | percentage | The reduction every member gets without any further rule. It applies before tiers and promotions. |
Price list priceListId | no | an existing price list | Which prices apply to the group. Through the group tiers and prices apply to everyone at once — the way to maintain terms without repeating them per customer. |
Price display taxDisplay | no | net, gross, tax free | Whether members are shown net or gross prices. Net for resellers, gross for consumers — the default for every document of this group. |
Automatic assignment autoAssignRule | no | conditions | Who joins the group by themselves, say from an annual revenue. Without a rule assignment is manual. |
Active active | no | yes/no | Whether the group has effect. |
Settings & permissions
- Four modules, four flags:
module.price_tiers,module.customer_prices,
module.customer_groups, module.packaging.
- Permissions per surface:
pricetiers.tier.view/manage,customerprices.price.view/manage,
customergroups.group.view/manage, packaging.units.view/manage.
- Calculation happens in the core. The order in which tier, customer price and group discount
take effect is determined by the commerce core — not the individual module.
- The RRP is never part of price determination, see Products.
FAQ & troubleshooting
The price on the quote is not the expected one. Work through the chain: the customer's individual price, then the customer group, then the tier, then the list price. The more specific entry wins.
A tier has no effect. Check the scope — a set per customer group applies only to its members.
A conversion is rejected. Cross-dimension conversions are possible per item only, not globally. A global "piece = gram" would have no universally valid meaning.
New items do not receive the customer discount. Then the term is maintained per item instead of per category.