Quotes, contracts and framework agreements
Ask three people in a B2B company what "the agreed price" is and you get three different objects. All three are real, they behave differently, and confusing them is how a company ends up honouring a price it agreed once, forever.
Three objects, one phrase
| Quote | Contract price | Framework agreement | |
|---|---|---|---|
| Covers | One deal | One article, ongoing | A volume over a period |
| Lifetime | Days or weeks | Months or a year | A financial year, usually |
| Ends by | Expiry or acceptance | Valid until | The end of the term or the volume running out |
| The buyer sees it | As a document | As their price in the shop | As remaining volume plus their price |
| Binds | You, until it expires | Both sides, per order | Both sides, including a commitment to buy |
| Lives in | Quotes | A price list | An agreement plus a price list |
Read the last row twice. A quote is its own object. The other two are price lists — that is not an implementation detail you can ignore, it is the whole mechanism.
Quote: one deal, frozen
A quote answers one question at one moment: what does this basket cost this buyer, if they order it in the next four weeks? Its prices are a snapshot taken at send — see The quote lifecycle.
A quote is deliberately outside the price resolution chain. Resolution ran once, when the quote was drafted; the answer was copied onto the lines and the chain was never consulted again. That is why a price list change tomorrow does not move a sent quote, and why a quote cannot be used to price a second order.
Contract price: the customer's standing price
A contract price is what the buyer pays for an article every time, without asking.
4711-A is €19.90 on your catalogue and €16.20 for Müller Industriebedarf until
the end of the year, and the shop shows €16.20 to anyone logged in at Müller.
That works because a price list can be bound to an organization, and an organization-bound list outranks a channel list, an open list and the default list. Specificity beats priority, always. The full ordering is in How pricing works; the setup is in Contract prices for a customer.
A contract price commits you to a number. It does not commit the customer to buy anything.
Framework agreement: the commitment
A Rahmenvertrag adds the part a contract price is missing: the customer's side of the deal. They commit to 12,000 metres of hose over twelve months; you commit to €4.80 a metre and a 48-hour delivery window. Individual orders against it are call-offs (Abrufe) — see Call-offs against a framework agreement.
An agreement therefore carries two things a contract price does not:
- A committed volume, in units or in value, with a running balance.
- Call-off rules — minimum call-off quantity, maximum per call-off, what happens when the committed volume is exhausted, and what happens if it is not reached by the end of the term.
The second one is where the money is. A framework price is usually the price for the whole committed volume. If the customer calls off 4,000 metres of the 12,000 they committed to and the term ends, you sold a third of the volume at the full-volume price. Decide in advance whether that triggers a retroactive correction, a renegotiation, or nothing — and write it into the agreement's terms. See Set up a framework agreement.
How a won quote becomes a contract price
This is the mechanism customers ask about most, so here it is precisely.
Accepting a quote produces an order. It does not, by itself, produce a standing price — a quote is one deal. When the deal you won is meant to hold for the next twelve months, you convert it into pricing, and there is exactly one way that works:
- A price list is created for the account. Bound to the organization, in the quote's currency, with the quote's net/gross basis.
- The accepted lines become price entries. One entry per article, at the
agreed unit price. Where the quote agreed a ladder — €5.60 from 1, €4.80 from
500 — that is several entries on the same article, differing by
quantity_min. The ladder is the set of entries; there is no separate tier object. See Scale and volume prices. - Validity is set from the agreement's term.
Valid fromthe start date,Valid untilthe end. This is what makes the price stop on its own. - Priority is set above your standard customer list, so that where the two overlap, the negotiated one wins. Priority only sorts lists of equal specificity — it is not a substitute for binding the list to the account.
- Logged-in buyers only is switched on. Always. A negotiated price on a list anonymous visitors can resolve is a negotiated price your competitors can read.
- The quote keeps the reference. The list records which quote produced it, and the quote records which list it produced. Twelve months later, "why does Müller pay €4.80?" has a one-click answer instead of an archaeology project.
The framework agreement then sits on top of that price list, holding the committed volume, the call-off rules and the term. The price list answers "what does it cost"; the agreement answers "how much is left and what are the rules".
Which one do you actually need
| The situation | Use |
|---|---|
| A buyer wants a written number for one project | A quote |
| You agreed a price for six articles for this customer, no volume promise | A contract price list |
| The customer committed to a volume in exchange for the price | A framework agreement with a bound price list |
| Everyone gets a lower price above 500 units | A scale price on your standard list, not a contract |
| A price that runs for six weeks and then reverts | A time-limited price or a promotion |
| A temporary incentive on top of the agreed price | A promotion — and read the margin warning there first |
The last two rows are the ones people get wrong. A promotion is not a way to record an agreement, and a contract price is not a way to run a campaign. They sit at different points in the chain: contract prices are the resolved price; promotions apply after resolution, to whatever it produced. That distinction is the subject of Promotions vs. contract prices.
The failure mode: the agreement nobody ended
Contract prices do not rot loudly. They rot by outliving the negotiation that
produced them. A price agreed in a bad quarter in 2023, on a list with no
Valid until, is still being served today — at a margin nobody would sign off
now, to a customer who has long since stopped mentioning it.
Two habits prevent it. Every negotiated list gets an end date at creation, not later. And every end date goes in a calendar with a name against it, because the day the price reverts is the day the customer phones. See Price list hygiene.
Next
- Set up a framework agreement — the volume, the term and the call-off rules.
- Contract prices for a customer — building the price list this article describes.