Every product in Dynamicweb has a default price — a single number in your default currency. For many scenarios, that is all you need.
But commerce is rarely that simple. You may sell in multiple currencies, operate in countries with different VAT rates, offer negotiated prices to key accounts, or give volume discounts to encourage larger orders.
The price matrix handles all of this. It lets you create as many price entries as you need for a product, each scoped to a specific combination of currency, country, customer, quantity, date range, and more.
This article starts with the simplest pricing scenario and adds one dimension at a time, so you can stop reading when you have reached the level of complexity your business requires.
The default price
All products have a standard product field called Price in which you enter a price using the default currency.

When a product is shown on the frontend, this is the price that is used unless the price matrix provides a more specific match.
If your solution supports multiple currencies, the default price is automatically converted using the exchange rates configured on each currency. You do not need to create separate price entries for each currency unless you want to set explicit prices.
Example; one product, one price:
| Product | Default price | Currency |
|---|---|---|
| Trail Runner 500 | 120.00 | EUR |
A customer browsing a GBP website sees the price converted at the exchange rate — for example, £104.00 if the EUR-to-GBP rate results in that value. A customer on the EUR website sees a price of €120.00.
Tip
The default currency context for a website is set in the website ecommerce settings.
The Price Matrix
For more advanced pricing needs, Dynamicweb provides the price matrix — a flexible, multi-dimensional list of price entries for a product, using a format familiar from classic ERP systems.
To open the price matrix:
- Open the product overview screen
- Open the action menu and select Prices

Each row in the price matrix is a price entry with up to four dimensions:
| Dimension | Controls |
|---|---|
| Price | The amount, currency, VAT handling, discount, and discount settings |
| When | Quantity thresholds and date ranges |
| Who | Which customers or customer groups qualify |
| Where | Which variant, unit, stock location, country, language, or shop the price applies to |
A price entry only applies when all of its criteria are met. Criteria that are left blank are treated as "all" — meaning a price with no country set applies in every country, a price with no user set applies to every user, and so on.
To add a new price, click New Price and configure the dimensions described below.
Note
Price matrix entries are often created and maintained via integration with an ERP system rather than entered manually.
Price
The Price section defines the core pricing information.
In this section:
- Amount and currency
- VAT handling
- Informative prices
- Discount percentage
- Allow order line discounts
- Allow order discounts
- Priority
Amount and currency
Enter the price and select the currency. These are the only required fields. Every other field on the price entry is optional.
Example — explicit prices in multiple currencies:
| Product | Price | Currency |
|---|---|---|
| Trail Runner 500 | 120.00 | EUR |
| Trail Runner 500 | 109.00 | GBP |
| Trail Runner 500 | 899.00 | DKK |
When a customer browses in GBP, the system finds the explicit GBP price (£109.00) instead of converting from EUR. This is useful when you want to set market-friendly price points rather than relying on exchange rates.
VAT handling
Each price entry specifies how VAT is handled using one of two options:
| Option | What it means | Typical use |
|---|---|---|
| Price does not include VAT | The entered amount is net. VAT is added based on the customer's country. | B2B pricing, where business customers expect to see prices without VAT. |
| Price includes VAT | The entered amount is the gross (final) price. The system calculates how much of it is VAT based on the customer's country. | B2C pricing, especially in the EU, where consumers expect to see VAT-inclusive prices. |
B2C example — same gross price, different VAT
A common B2C scenario: you want consumers in every EU country to see the same price on the shelf — for example, €99.95. Because VAT rates differ by country, the VAT amount inside that price varies.
| Country | Gross price | VAT rate | VAT amount | Net price |
|---|---|---|---|---|
| Germany | €99.95 | 19% | €15.96 | €83.99 |
| Netherlands | €99.95 | 21% | €17.35 | €82.60 |
| Denmark | 799.00 DKK | 25% | 159.80 DKK | 639.20 DKK |
To configure this, create one price entry per country with Price includes VAT selected. The system handles the back-calculation automatically, using the VAT rate from the VAT group assigned to the product, or the country's default VAT rate.
Tip
This approach mirrors how physical retail works in the EU: the sticker price is the same everywhere, but the merchant remits different VAT amounts depending on the country.
B2B example — net price, VAT added at checkout
In B2B, the standard practice is to show prices without VAT. The customer sees the net price, and VAT is added during checkout based on the delivery country and the customer's VAT registration.
| Product | Net price | Currency | Customer sees (DE, 19% VAT) | Customer sees (NL, 21% VAT) |
|---|---|---|---|---|
| Trail Runner 500 | 100.00 | EUR | €100.00 + €19.00 VAT = €119.00 | €100.00 + €21.00 VAT = €121.00 |
To configure this, create a price entry with Price does not include VAT selected. You do not need separate entries per country — the system adds the correct VAT at checkout.
Note
VAT calculation depends on the product's VAT group, the customer's country, and whether reverse charge applies. For details on how VAT is calculated, see VAT & Taxes. For system-wide VAT settings (such as rounding), see Price settings.
Informative prices
Check the Informative box to mark a price as a reference price that is never applied to an order. Informative prices are used to display:
- Recommended retail price (RRP/MSRP) — "Suggested price: €149.00"
- Before price — "Was: €149.00, Now: €119.00"
The system retrieves informative prices separately from regular prices, so they never interfere with the actual price calculation. Your frontend template controls how and where they are displayed.
Example:
| Product | Price | Currency | Informative | Purpose |
|---|---|---|---|---|
| Trail Runner 500 | 120.00 | EUR | No | The selling price |
| Trail Runner 500 | 149.00 | EUR | Yes | The RRP shown for comparison |
Discount percentage
Set a discount percentage to reduce the price. The discount is applied to the amount, so a price of €100.00 with a 20% discount results in an effective price of €80.00.
You can also create discount-only entries by setting the price to 0 and specifying only a discount percentage. In this case:
- The discount is applied to the lowest applicable priced entry in the matrix
- If no priced entries exist, the discount is applied to the product's default price
This is particularly useful in B2B scenarios where you want to define customer-group discounts independently of specific price points.
Example — customer group discount without a fixed price:
| Price | Currency | Discount % | User group | What happens |
|---|---|---|---|---|
| 100.00 | EUR | — | (all) | Base price for everyone |
| 0 | EUR | 15% | Wholesale | Wholesale customers pay €85.00 (15% off the base) |
| 0 | EUR | 25% | Platinum | Platinum customers pay €75.00 (25% off the base) |
Note
This structure mirrors how price and discount lines work in Microsoft Dynamics 365 Business Central, making it straightforward to synchronize via integration.
Allow order line discounts
Controls whether this price entry can receive product-specific discounts (e.g., a discount configured on a promotion that targets this product). When unchecked, no product discounts or discount percentages are applied to the order line.
Enabled by default.
Allow order discounts
Controls whether this price entry contributes to and receives order-level discounts — for example, "10% off orders over €500."
When unchecked, order lines with this price are excluded from order discount calculations. This is useful for products sold at already-negotiated margins where further discounting would erode profitability.
Enabled by default.
See Allow order discounts — examples for detailed calculation walkthroughs.
Priority
When multiple price entries match, Dynamicweb uses this selection logic:
- If any matching price has a priority value greater than zero, only the prices with the highest priority are considered
- Among those candidates, the lowest effective price (amount after discount) is selected
- If no prices have a priority set, the system selects the lowest effective price across all matches
Leave the priority field empty to use the default lowest-price behavior. Use priority when you need a specific price to take precedence even if it is not the cheapest — for example, a contractual price that must apply regardless of promotional prices.
Tip
Priority is typically used when prices are managed via ERP integration and the ERP system determines which price should win.
When
The When section controls temporal and quantity conditions.
In this section:
Quantity
Set a quantity threshold to create tiered pricing. The price applies when the customer orders at least this many units.
Example — quantity breaks:
| Product | Price | Currency | Quantity | Effective price per unit |
|---|---|---|---|---|
| Trail Runner 500 | 120.00 | EUR | (empty) | €120.00 (any quantity) |
| Trail Runner 500 | 108.00 | EUR | 3 | €108.00 (3 or more) |
| Trail Runner 500 | 96.00 | EUR | 10 | €96.00 (10 or more) |
| Trail Runner 500 | 84.00 | EUR | 50 | €84.00 (50 or more) |
A customer ordering 5 units pays €108.00 each. A customer ordering 50 pays €84.00 each.
Note
When a price is set for the Any variants option (see Where — Variant), the quantity threshold can be evaluated against the total quantity across all variants of the product, not just a single variant. This is useful when you want to offer volume discounts regardless of which size or color the customer picks.
Valid from / Valid to
Set a date range to create time-limited prices — for example, a seasonal promotion or a contractual price that expires.
Example — Black Friday pricing:
| Product | Price | Currency | Valid from | Valid to |
|---|---|---|---|---|
| Trail Runner 500 | 120.00 | EUR | (empty) | (empty) |
| Trail Runner 500 | 89.95 | EUR | 2025-11-25 | 2025-12-02 |
Outside the date range, the regular price applies. During Black Friday week, the promotional price takes over automatically.
Who
The Who section targets prices to specific customers or customer groups.
In this section:
User
Select a specific user to create a customer-specific price. This is the most specific targeting — it overrides group-level and general prices for that individual.
Example — negotiated price for a key account:
| Product | Price | Currency | User |
|---|---|---|---|
| Trail Runner 500 | 120.00 | EUR | (all) |
| Trail Runner 500 | 95.00 | EUR | Acme Corp (user #142) |
When the buyer from Acme Corp logs in, they see €95.00. Everyone else sees €120.00.
User group
Select a user group to apply a price to all members of that group. This is the standard way to implement tiered pricing in B2B — for example, different price levels for distributors, resellers, and retail customers.
Example — tiered group pricing:
| Product | Price | Currency | User group |
|---|---|---|---|
| Trail Runner 500 | 120.00 | EUR | (all) |
| Trail Runner 500 | 102.00 | EUR | Resellers |
| Trail Runner 500 | 90.00 | EUR | Distributors |
Customer number / Group customer number
For businesses using ERP-assigned customer numbers, you can target prices using a customer number (for an individual account) or a group customer number (for a customer segment defined in the ERP).
These fields let you match prices to customers based on ERP identifiers rather than Dynamicweb user IDs, which simplifies integration and keeps pricing in sync with the ERP.
Where
The Where section scopes a price to a specific product variant, unit of measure, stock location, language, country, or shop.
In this section:
Variant
By default, a price applies to all variants of a product. You can restrict a price to:
- All variants — the price applies regardless of which variant is selected (default)
- Any variants — also applies to all variants, but with a difference: quantity thresholds are evaluated against the total quantity of all variants combined rather than each variant individually
- A specific variant — the price applies only to that variant (e.g., "Size XL / Red")
Example — variant-specific pricing:
| Product | Variant | Price | Currency |
|---|---|---|---|
| Trail Runner 500 | (all) | 120.00 | EUR |
| Trail Runner 500 | Limited Edition Gold | 159.00 | EUR |
Unit
If your product is sold in multiple units of measure (e.g., per piece, per box, per pallet), you can set a different price per unit.
Example:
| Product | Unit | Price | Currency |
|---|---|---|---|
| Cleaning Agent X | Piece (1 L) | 12.50 | EUR |
| Cleaning Agent X | Box (12 × 1 L) | 132.00 | EUR |
| Cleaning Agent X | Pallet (48 boxes) | 5,760.00 | EUR |
Stock location
Set different prices for different warehouses or fulfillment centers. This is relevant when stock at different locations has different costs — for example, a local warehouse versus an overseas distribution center.
Language
Restrict a price to a specific language version of your site. This is typically used when language implies a different market or pricing context — for example, a French-language site serving France versus a Dutch-language site serving Belgium.
Country
Restrict a price to a specific country. Combined with VAT handling, this is how you implement market-specific pricing.
Example — different prices per market:
| Product | Price | Currency | Country | VAT included |
|---|---|---|---|---|
| Trail Runner 500 | 99.95 | EUR | Germany | Yes |
| Trail Runner 500 | 99.95 | EUR | Netherlands | Yes |
| Trail Runner 500 | 799.00 | DKK | Denmark | Yes |
| Trail Runner 500 | 89.95 | GBP | United Kingdom | Yes |
Each country sees a locally optimized price point. The system back-calculates the correct VAT amount per country.
Shop
Restrict a price to a specific shop (sales channel). Use this when you run multiple storefronts — for example, a B2C webshop and a B2B portal — and want different pricing on each.
Example:
| Product | Price | Currency | Shop |
|---|---|---|---|
| Trail Runner 500 | 120.00 | EUR | B2C Webshop |
| Trail Runner 500 | 96.00 | EUR | B2B Portal |
How prices are resolved
When a customer views a product or adds it to the cart, the system evaluates all price entries for that product and selects the one that applies. Understanding this process helps you predict which price a customer will see.
The filtering step
Every price entry is tested against the customer's current context. A price must match all of its criteria:
| Filter | What is checked |
|---|---|
| Currency | Does the price's currency match the session currency? |
| Country | Does the price's country match the customer's country? (Empty = all countries) |
| Shop | Does the price's shop match the current shop? (Empty = all shops) |
| Language | Does the price's language match the current language? (Empty = all languages) |
| Variant | Does the price's variant match the selected variant? (Empty or "Any" = all variants) |
| Unit | Does the price's unit match the selected unit? (Empty = all units) |
| Stock location | Does the price's stock location match? (Empty = all locations) |
| Quantity | Is the order quantity at least the price's quantity threshold? (Empty = any quantity) |
| Valid from / to | Is the current date within the price's date range? (Empty = always valid) |
| User | Does the price's user match the logged-in customer? (Empty = all users) |
| User group | Is the logged-in customer a member of the price's user group? (Empty = all groups) |
| Customer number | Does the customer's number match? (Empty = all customers) |
Any criteria left blank on a price entry is treated as "applies to all." Only price entries that pass every filter proceed to the selection step.
The selection step
Among the price entries that pass all filters:
- Priority check — if any price has a priority greater than zero, only the prices with the highest priority value are kept
- Lowest effective price — among the remaining candidates, the one with the lowest effective price wins. The effective price is: amount × (1 − discount percentage ÷ 100)
- Fallback — if no price matrix entry matches at all, the product's default price is used
Important
The system always selects the best price for the customer. In the common case (no priorities set), this means the lowest price. When priorities are used, the highest-priority price wins — even if a lower price exists at a different priority level.
Worked example
Consider a product with these price entries:
| # | Price | Discount | Qty | Country | User group | Effective price |
|---|---|---|---|---|---|---|
| 1 | €120.00 | — | — | — | — | €120.00 |
| 2 | €108.00 | — | 3 | — | — | €108.00 |
| 3 | €0.00 | 15% | — | — | Resellers | (discount only) |
| 4 | €95.00 | — | — | — | Key Accounts | €95.00 |
| 5 | €99.95 | — | — | Germany | — | €99.95 |
Scenario A: A guest customer in France orders 1 unit. Entries #3 and #4 are excluded (wrong group). Entry #2 is excluded (quantity < 3). Entry #5 is excluded (wrong country). Only entry #1 matches → €120.00.
Scenario B: A Resellers group member in France orders 5 units. Entries that match: #1 (€120.00), #2 (€108.00, qty ≥ 3), #3 (discount-only, applies 15% to the lowest priced match). Entry #3's 15% discount is applied to the lowest priced match (#2): €108.00 × 0.85 = €91.80.
Scenario C: A Key Accounts member in Germany orders 1 unit. Entries that match: #1 (€120.00), #4 (€95.00), #5 (€99.95). Lowest effective price → €95.00.
Appendix A: Combining dimensions
The power of the price matrix is that dimensions can be freely combined. Here are common configurations:
B2C multi-country with VAT
Goal: Charge consumers a clean shelf price in each market, with VAT baked in.
| Product | Price | Currency | Country | VAT included | Qty | User |
|---|---|---|---|---|---|---|
| Running Shoe Pro | 149.95 | EUR | Germany | Yes | — | — |
| Running Shoe Pro | 149.95 | EUR | Netherlands | Yes | — | — |
| Running Shoe Pro | 149.95 | EUR | France | Yes | — | — |
| Running Shoe Pro | 1,199.00 | DKK | Denmark | Yes | — | — |
| Running Shoe Pro | 129.95 | GBP | United Kingdom | Yes | — | — |
B2B tiered pricing with quantity breaks
Goal: Give resellers better prices at higher volumes, with separate pricing tiers per customer group.
| Product | Price | Currency | Qty | User group | VAT included |
|---|---|---|---|---|---|
| Industrial Bearing X200 | 45.00 | EUR | — | — | No |
| Industrial Bearing X200 | 42.00 | EUR | 50 | — | No |
| Industrial Bearing X200 | 38.00 | EUR | 100 | — | No |
| Industrial Bearing X200 | 0.00 (10% disc.) | EUR | — | Silver | No |
| Industrial Bearing X200 | 0.00 (20% disc.) | EUR | — | Gold | No |
A Gold customer ordering 100 units: the base price at qty 100 is €38.00, with a 20% group discount applied → €30.40 per unit.
Seasonal sale with before-price
Goal: Run a 2-week promotion and show the original price for comparison.
| Product | Price | Currency | Informative | Valid from | Valid to |
|---|---|---|---|---|---|
| Winter Jacket Deluxe | 249.00 | EUR | Yes | — | — |
| Winter Jacket Deluxe | 199.00 | EUR | No | — | — |
| Winter Jacket Deluxe | 149.00 | EUR | No | 2025-01-15 | 2025-01-31 |
During the sale period, the customer sees: €249.00 €149.00. Outside the sale period: €249.00 €199.00. The informative price provides the "was" reference.
Contract pricing with priority
Goal: A negotiated contract price must always apply, regardless of whether a cheaper promotional price exists.
| Product | Price | Currency | User | Priority | Valid from | Valid to |
|---|---|---|---|---|---|---|
| Server Rack Unit A | 2,400.00 | EUR | — | — | — | — |
| Server Rack Unit A | 1,999.00 | EUR | — | — | 2025-03-01 | 2025-03-31 |
| Server Rack Unit A | 2,100.00 | EUR | Acme Corp | 10 | — | — |
During the March promotion, most customers see €1,999.00 (lowest price). Acme Corp sees €2,100.00, because their contract price has priority 10, which overrides the promotional price.
Appendix B: Allow order discount
The Allow order discounts toggle on a price entry controls whether the order line participates in order-level discounts. Here are detailed walkthroughs.
Setup:
- Product A: Default price 1,000 DKK, price matrix price 500 DKK
- Product B: Default price 200 DKK, no price matrix entry
- Order discounts applied: Flat 100 DKK off + 10% order discount
Allow order discounts — unchecked (Product A)
- Product A: 500 DKK — excluded from order discounts
- Product B: 200 DKK
- 100 DKK flat discount applied → 100 DKK
- 10% order discount applied → 90 DKK
- Total: 500 + 90 = 590 DKK
Product A keeps its price intact. Only Product B receives the order discounts.
Allow order discounts — checked (Product A)
- Product A: 500 DKK
- Product B: 200 DKK
- Subtotal: 700 DKK
- 100 DKK flat discount → 600 DKK
- 10% order discount → 540 DKK
- Total: 540 DKK
Both products participate in the order discounts, resulting in a larger total reduction.
Only Product A in cart — unchecked
- Product A: 500 DKK
- 100 DKK flat discount applied → 400 DKK
- 10% order discount is not applied (Product A has order discounts unchecked)
- Total: 400 DKK
Note
Flat-rate order discounts apply to the cart total, not individual products, so they still affect the final price even when the only item in the cart has order discounts unchecked. Percentage-based order discounts, however, are excluded for that product.