In B2B trade with metal, plastics, chemicals or electrical engineering, the price shown in the shop today is a different one tomorrow. Base price, alloy or material surcharge, energy share and freight all move independently and at different intervals. Anyone tracking that movement by hand in price lists loses either margin or trust. This article shows how to model daily prices, surcharges and index linkage cleanly in the shop, which limits German price clause law sets, and why every line item needs a price date and an expiry.
Key takeaways
- A daily price is not a price but a calculation from four components: base price, material surcharge, energy share and freight share. Each component has its own source, its own rhythm and its own validity window.
- The movement is measured, not asserted: wholesale prices in July 2026 stood 5.3 percent (Federal Statistical Office) above the prior-year month, and 27.8 percent (Federal Statistical Office) higher for non-ferrous ores, metals and semi-finished products.
- Not every index linkage is permitted. German price clause law prohibits automatic coupling to goods that are not comparable, but expressly exempts cost element clauses (Preisklauselgesetz) - so the surcharge has to be tied to your own cost of supply.
- A price without an expiry binds longer than the sales team would like: without a stated deadline, the offer remains binding until a reply could be expected under ordinary circumstances (German Civil Code).
- Technically, provenance decides everything: base price from the ERP system, surcharge values from the mill table, index readings with source, reference date and base year - and the same figure in the cart, the quote, the order and the invoice.
Why the list price is rarely the price in a B2B shop
Anyone selling stainless steel, aluminium semi-finished products, technical plastics, cable or chemicals does not work with a price but with a price formula. The base price comes from condition maintenance in the ERP system and perhaps moves once a quarter. The material surcharge follows the quotations of the alloying elements used and is published by the respective mill in its own table. The energy share depends on supply contracts and on how energy prices develop. The freight share moves with diesel prices, toll rates and capacity. These four figures have little to do with each other in substance; they only meet on the invoice line. A shop that knows only a single price field per article therefore forces the sales desk to track the movement manually. That costs time, and above all it costs trust when a customer puts a price in the cart that the order confirmation later fails to confirm.
The movement is not an assertion, it is measured. Wholesale selling prices in July 2026 were 5.3 percent (Federal Statistical Office) above the same month a year earlier, after 4.9 percent (Federal Statistical Office) in June and 5.9 percent (Federal Statistical Office) in May. Within that average the swings are far wider: in wholesale trade with non-ferrous ores, metals and semi-finished metal products, prices were 27.8 percent (Federal Statistical Office) above the prior-year month while simultaneously 3.9 percent below the previous month. Mineral oil products at wholesale level were 24.1 percent (Federal Statistical Office) more expensive than a year before. A range containing such product groups cannot sensibly be managed with a price list printed twice a year.
Two index families, two viewpoints
What German price clause law permits
Before a single line of code is written, the clause needs checking. The Preisklauselgesetz does not prohibit price adjustment as such but one particular construction of it: the direct and automatic coupling of a monetary debt to the price of goods that are not comparable (Preisklauselgesetz). Anyone who automatically ties the price of a service to a raw material quotation that plays no part in that service is therefore inside the prohibited area. The law expressly exempts four clause types from this prohibition, and one of them carries the surcharge logic of technical distribution.
- Performance reservation clauses leave discretion as to the extent of the change, making it possible to determine the new amount of the monetary debt according to principles of equity (Preisklauselgesetz).
- Tension clauses relate goods or services to each other that are essentially of the same kind or at least comparable (Preisklauselgesetz).
- Cost element clauses make the amount owed dependent on the price development of goods that directly influence the creditor's own costs in rendering the counter-performance (Preisklauselgesetz). Material, energy and freight surcharges typically fall under this type.
- Clauses that can only lead to a reduction of the monetary debt - unlike the three preceding types, German price clause law gives this fourth exemption no term of its own; it is commonly referred to as a reduction clause.
For the shop this means: a surcharge needs a traceable link to your own procurement costs. An alloy surcharge on stainless steel can be justified because nickel, chromium and molybdenum quotations move the cost of supply directly. A flat mark-up oriented on some arbitrary economic indicator cannot. The law states the prohibition in a single sentence.
The amount of monetary debts may not be determined directly and automatically by the price or value of other goods or services that are not comparable with the agreed goods or services.
Alongside the construction, the law does have a specificity test, but it does not apply it to every price clause: under the Preisklauselgesetz it covers only the price clauses named in section 3 and price clauses used in consumer credit contracts (Preisklauselgesetz). Cost element clauses, which material, energy and freight surcharges typically fall under, sit outside the prohibition and therefore outside that test. The wording still works as a drafting template: a price clause is not sufficiently specific if an amount owed is to depend generally on future price developments or on another benchmark that does not reveal which prices or values are to be decisive (Preisklauselgesetz). For implementation that is the actual work instruction: the contract must name the index with its full title, with its product classification or table number, with its base year and with the reference date on which the calculation is made. A reference to general market development does not satisfy that; if the clause sits in general terms and conditions, a lack of clarity alone can amount to an unreasonable disadvantage (German Civil Code). If a breach of the Preisklauselgesetz is established with final legal effect, the price clause becomes invalid at that point in time unless an earlier invalidity was agreed (Preisklauselgesetz) - amounts already invoiced up to then remain unaffected.
One-sided clauses are open to challenge
Price date and expiry: what holds a quote together
A daily price without a date is a promise without an end. Anyone who offers to conclude a contract with another party is bound by that offer unless they have excluded being bound (German Civil Code). For an offer made to an absent party - and every shop offer is exactly that - the offer can be accepted up to the point at which the offeror may expect to receive a reply under ordinary circumstances (German Civil Code). What ordinary circumstances mean for a price that moves daily is a matter of interpretation. Interpretation is expensive in a dispute, and it rarely falls in favour of the party that created the ambiguity.
The clean route is an express deadline. If the offeror has set a period for acceptance, acceptance may only take place within that period (German Civil Code). In the shop that means concretely: every quote and every cart carrying a daily price gets two timestamps. The price date says which values the price was calculated from. The expiry says how long it applies. Both belong visibly on the line item, in the PDF, in the order confirmation and in the data structure behind it. Once the deadline passes, the shop recalculates and states the change expressly instead of adopting it silently. The difference between the two variants is two data fields and one notice.
If the offeror has determined a period for acceptance of the offer, the acceptance may only take place within that period.
The difference that prevents disputes
The four components of a daily price
Anyone who takes price formation apart ends up with four components, each with its own source, its own rhythm and its own validity. That separation is the basis of all later verifiability: only if each component is stored on its own can you say afterwards why a price rose. If only the total is stored, every query leaves nothing but reconstruction from memory.
Base price
Comes from condition maintenance in the ERP system, including customer group, tier and customer-specific special price. Change rhythm: weeks to quarters. The authoritative source is the ERP system, not the shop.
Material or alloy surcharge
Comes from the published surcharge table of the respective mill and differs by material and by supplier. It is adopted, not derived in-house - otherwise the shop diverges from the supplier document.
Energy and levy share
Reflects supply costs that move independently of the material. Producer prices for energy in July 2026 were 3.8 percent (Federal Statistical Office) above the prior-year month and 3.4 percent above the previous month.
Freight share
Depends on weight, volume, zone, bulky-goods status and diesel escalation. It belongs on its own line rather than baked into the article price, otherwise it can no longer be allocated cleanly on partial deliveries.
The separation has a second purpose. A customer who does not understand a price increase picks up the phone. A customer who can see on the line item that the base price stayed unchanged and only the material surcharge rose typically does not. That producer prices for industrial products in July 2026 were 4.5 percent (Federal Statistical Office) above the prior-year month for pig iron, steel and ferro-alloys while reinforcing steel cost 5.8 percent (Federal Statistical Office) more is comprehensible to a buyer as soon as the shop shows the breakdown. How the freight share itself can be calculated is described in our article on shipping costs and forwarding freight.
| Component | Source | Rhythm | Presentation in the shop |
|---|---|---|---|
| Base price | Conditions in the ERP system, per customer group and tier | Weeks to quarters | Line item price with tier note |
| Material or alloy surcharge | Published surcharge table of the mill, per material | Monthly or more often, per supplier | Separate line with reference quantity and date |
| Energy and levy share | Supply contract plus an index named in the contract | Monthly, on a fixed reference date | Separate line with index name and base year |
| Freight share | Tariff, zone, weight, diesel escalation | Weekly to monthly | Separate line in the cart, visible before checkout |
| Price date | Point in time of calculation | Per transaction | Timestamp on line item and document |
| Expiry | Contractually set acceptance period | Per transaction | Date and time on the quote |
Wiring index linkage cleanly
As soon as a surcharge formula points at an official index, a pricing question becomes a data question. The index has to be named unambiguously, fetched regularly, stored with versions and used in the formula with the same reading that the document later states. The Federal Statistical Office has published its own guidance on price escalation clauses, from which several points follow that are regularly overlooked in practice.
- Name the index in full: title, statistical report, serial number, product classification or table number, and base year. Without these details it stays open which values are meant to be decisive; in general terms and conditions the clause is then open to challenge for lack of clarity alone (German Civil Code).
- Rely on percentage rates of change rather than index points, because index points depend heavily on the absolute index level of the indices being compared (Federal Statistical Office).
- Rule out circular references: do not use for a given product the price index that depicts exactly that product's price development (Federal Statistical Office).
- Define the reference date and the lag. Time passes between the reporting month and publication; the formula therefore needs a rule for which published reading applies on the order date.
- Plan for rebasing: after a periodic revision the base indices in the clause have to be exchanged so that price developments remain comparable in substance (Federal Statistical Office).
- Store every index reading with value, reporting month, base year, retrieval time and source, not just the calculated price. Only then is an invoice still traceable years later.
- Treat increases and decreases alike so that the clause does not operate one-sidedly.
Two sentences from the official methodology
Technically an index reading is a record of its own, not a field on the article. It has an identifier, a value, a base year, a reporting month, a retrieval time and a source reference. The price of an article points at that record instead of copying the value. If a retrieval fails, the shop continues with the last valid reading and marks that fact rather than silently inserting a zero: a surcharge of zero would not be a measurement in that case but a failure. How strongly rebasing acts is shown by the conversion of the wholesale selling price index to base year 2021 = 100 with reporting month April 2024 (Federal Statistical Office): the annual average of the new base year is set to 100, and indices previously calculated on the old base lose their validity.
{
"item": "1.4571-RB-20X2000",
"quantity_kg": 480,
"priced_at": "2026-09-14T08:00:00+02:00",
"valid_until": "2026-09-14T18:00:00+02:00",
"currency": "EUR",
"components": [
{
"kind": "base_price",
"source": "erp/conditions",
"value_per_100kg": 145.00,
"as_of": "2026-09-01"
},
{
"kind": "alloy_surcharge",
"source": "mill/surcharge-table",
"value_per_100kg": 118.00,
"as_of": "2026-09-01",
"reference": "Nickel, chromium, molybdenum"
},
{
"kind": "energy_share",
"source": "index/producer-prices-energy",
"value_per_100kg": 9.50,
"index": {
"name": "Producer price index for industrial products, energy",
"base_year": 2021,
"reporting_month": "2026-07",
"change_yoy_percent": 3.8,
"retrieved": "2026-09-14T06:00:00+02:00"
}
},
{
"kind": "freight_share",
"source": "tarif/zone-3",
"value_per_100kg": 7.50,
"as_of": "2026-09-08"
}
],
"daily_price_per_100kg": 280.00,
"note": "Price applies until the stated time, after that it is recalculated."
}The advantage of this structure shows when working backwards. If a customer asks in November why a September delivery cost more than a July one, the answer sits in the line item and not in the memory of the sales desk. Every line carries its source, its reading and its value. That is at the same time the basis for being able to answer your own accounting department and a tax audit. Which data paths this requires between shop and ERP system is described in our article on ERP integration in B2B e-commerce.
The shop has to explain the price, not just display it
In a pure B2B shop the German price indication regulation does not apply at its core: it governs the indication of prices for goods or services by traders towards consumers (PAngV). Anyone selling exclusively to commercial customers and securing access accordingly therefore works with net prices and without the obligations of the regulation. That eases presentation - and it is a fallacy if the conclusion drawn is that price clarity does not matter in B2B. Here clarity is not enforced by the regulation but by contract law and by the buyer's need to process the price further in their own costing.
- Every surcharge appears as its own line with a designation, a reference quantity and an amount, not folded into the article price.
- Price date and expiry are visible on the line item, not only in the general terms and conditions.
- The formula is set out in comprehensible text on a page of its own, linked from every affected line item.
- The cart recalculates when opened and states any deviation expressly instead of adopting it silently.
- An expired quote is marked as expired and cannot be ordered at a new price without comment.
- The customer can download the price date of a line item as a document, including after purchase.
The last point is frequently underestimated. Buyers work with budgets, framework contracts and internal approvals. A price they cannot evidence creates work for them, and work at the customer's end is a reason to switch supplier. How price commitment and call-offs can be modelled over longer periods is set out in our article on framework contracts and call-off orders; the fundamentals of price structure are covered in the article on price lists and tier pricing in Shopware.
From enquiry to invoice: one figure, one path
A daily price is only implemented cleanly when it is the same at every station. Enquiry, quote, cart, order, delivery note and invoice all have to carry the same breakdown. If the chain breaks at one point, exactly the case nobody wants arises: the customer orders at one price, the ERP system confirms another, and accounting sorts out the difference afterwards. For VAT purposes the invoice requires a breakdown that has to match the structure of the line item.
the consideration for the supply or other service (section 10), broken down by tax rates and individual tax exemptions, as well as any reduction in the consideration agreed in advance, unless it is already taken into account in the consideration
In practice this means: surcharges that form part of the consideration share its tax rate and belong in the same breakdown (German VAT Act). An alloy surcharge is not an ancillary transaction but part of the price for the supply. Anyone showing it as a separate line on the invoice therefore assigns it the same tax rate as the main supply. Since the move to structured invoice formats this is no longer a matter of diligence but of properly filled fields; we have described the e-invoicing obligation and its connection to the ERP system separately. How tax rate and reverse charge interact on cross-border orders is covered in the article on VAT in the B2B shop.
What typically goes wrong during implementation
The mistakes repeat themselves, and they rarely sit in the pricing algorithm. They sit at the edges: in fetching the values, in the cache, in the handover to the ERP system and in the question of which reading applies to a cart already sitting open. How far price automation should go at all without losing sight of margin is covered in the article on dynamic pricing and margin control.
- The cache outlives the price date. A page or object cache that stores prices keeps serving the old value after a rebuild. Price components belong outside caching or must be bound to the price date as part of the cache key.
- A failed retrieval is booked as a value. If no answer arrives, no zero may enter the formula. The last valid reading continues to apply and is marked as such.
- The cart ages unnoticed. A cart left open for three days carries prices from three days ago. On opening it has to be recalculated and the deviation shown.
- Rounding happens too early. If each component is rounded individually, the total deviates from the customer's own recalculation. Rounding happens at the end, on the line item total, following a defined rule.
- The surcharge table is rebuilt instead of adopted. Deriving the alloy surcharge in-house produces deviations from the supplier document. The published value is imported.
- The ERP system does not know the breakdown. If the order arrives there as a single total, the provenance is lost. The components belong in the handover as separate condition types.
- The clause exists only in program code. What the shop calculates has to match what the contract says - and the contract text has to name the index in full.
How we implement daily prices in a Shopware shop
We build price formation as a layer of its own between the ERP system and the shop, not as a collection of individual rules in the shop back end. The connection to the ERP system supplies base prices, customer groups and tiers. A dedicated import path fetches surcharge tables and index readings and stores them with versions. Price formation assembles the line item from these and writes price date and expiry onto the transaction. This is implemented in Shopware development on the basis of the Community Edition, without dependence on closed extensions.
For the customer this results in a B2B portal in which the price is not merely stated but justified: breakdown per line item, price date, expiry, downloadable document and a history of their own prices. Rollout typically happens in stages, starting with the product group in which surcharges fluctuate most. If you also want to put the inventory side in order, the preparation is described in our article on year-end stocktaking.
Sources and legal bases
Related Articles
Units of Measure and Pack Sizes in B2B Online Shops
Case, pallet, roll or metre: how base, sales and order units convert in a B2B online shop, how minimum quantities apply and unit pricing stays correct.
Rental Items in the B2B Shop: Digital Equipment Hire
How rental items, availability calendars, inspection intervals and rental billing fit together in a B2B shop - with market figures and the legal duties.
Selling Services and Maintenance Contracts in B2B Shops
Installation, inspection and maintenance contracts as bookable items in a B2B shop: product type without stock, pricing, service data and ERP handover.