# Quotes, price locking, and renegotiation A negotiation matters only if the agreed price holds. When Atlas Corporate creates an Order from a quote for 500 units, that price must survive a catalog update next week. The [Quote](/api/projects/quotes.md) resource is the binding offer that makes the agreed terms durable, from a seller's `Pending` offer through order creation, renegotiation, and acceptance recording. ## The Quote as a binding offer The seller issues a Quote from a Staged Quote. It is the formal, binding offer presented to the buyer, and it tracks the buyer's response through its states: Use [QuoteState](/urn?urn=ctp%3Aapi%3Atype%3AQuoteState) as the canonical state reference. For architecture decisions, `Pending` is the actionable offer: the buyer can create an Order from it, decline it, or request renegotiation. Renegotiation moves the current offer out of the active path until the seller issues a new Quote, while a withdrawn or declined Quote ends that offer. From a `Pending` Quote, the buyer can create an Order and record acceptance, decline, or request renegotiation, each governed by an Associate permission such as `CreateMyOrdersFromMyQuotes`, `DeclineMyQuotes`, or `RenegotiateMyQuotes`. ## How price locking works The Quote flow exists because a negotiated offer needs **price locking**, not only a discounted Cart. When the seller issues the Quote, the negotiated amounts are captured on the Quote itself. To turn the offer into an Order, the buyer creates the Order from a valid `Pending` Quote. If the request sets `quoteStateToAccepted: true`, order creation also records the Quote as `Accepted`. The Order uses the Quote's prices, not whatever the catalog says at order time. This decouples the agreed deal from the live Price architecture you built in [Configure B2B pricing](/learning-model-b2b-commerce/configure-b2b-pricing/price-selection.md). A Standalone Price change, a new Customer Group rate, or an expired validity period does not alter an already-agreed Quote. The negotiation result is a snapshot, insulated from the price-selection logic that would otherwise re-resolve at order time. ## The renegotiation loop B2B negotiation is rarely one round. If the buyer is close but not satisfied, they do not decline outright; they request renegotiation. ```http POST /{projectKey}/as-associate/{associateId}/in-business-unit/key=atlas-apac/quotes/{quoteId} HTTP/1.1 Content-Type: application/json { "version": 3, "actions": [ { "action": "requestQuoteRenegotiation", "buyerComment": "Close, but we need the unit price held for a 12-month term." } ] } ``` This moves the Quote to `DeclinedForRenegotiation`. The seller reopens the Staged Quote, adjusts the `quotationCart`, and issues a **new** Quote; the original moves to `RenegotiationAddressed`. The loop repeats until the buyer accepts or declines for good. Only a `Pending` Quote can be renegotiated, so each round operates on the current offer, not a superseded one. Because the seller issues a fresh Quote each round, every round keeps its own record. Each Quote carries the `sellerComment` that accompanied that offer and the `buyerComment` from the renegotiation request that prompted it, so the series of Quotes is a durable, round-by-round history of the negotiation. The Staged Quote's own `sellerComment`, by contrast, is mutable and always reflects only the seller's latest edit, so it is the working draft rather than the historical record. ```mermaid stateDiagram-v2 [*] --> Pending: Seller issues Quote Pending --> Accepted: Order created with quoteStateToAccepted Pending --> Declined: Buyer declines Pending --> DeclinedForRenegotiation: Buyer requests renegotiation Pending --> Withdrawn: Seller withdraws DeclinedForRenegotiation --> RenegotiationAddressed: Seller issues new Quote Accepted --> [*]: Terms recorded ``` ## From Pending Quote to Order To accept the offer and place the order in one step, create the Order from the valid `Pending` Quote and set `quoteStateToAccepted: true`. The Order inherits the locked prices and the `purchaseOrderNumber` carried through the flow. ```http POST /{projectKey}/as-associate/{associateId}/in-business-unit/key=atlas-apac/orders/quotes HTTP/1.1 Content-Type: application/json { "quote": { "typeId": "quote", "id": "{quoteId}" }, "version": 5, "quoteStateToAccepted": true } ``` Creating an Order from a Quote requires a permission such as `CreateMyOrdersFromMyQuotes`. For repeat purchasing on already-negotiated terms, the Order or its originating Cart can be replicated to seed a new basket, reusing the negotiated outcome as the starting point. ## Worked example: an Order created after a catalog price rise Atlas Corporate negotiates 500 units of `ZET-MON-27`. Trace what happens to the price: 1. **Negotiation.** The seller issues a Quote with a negotiated unit price of AUD 240, captured on the Quote. The Quote is `Pending`. 2. **Catalog moves.** Before Atlas responds, Zen Electron Trade raises the `atlas-apac-pricing` Channel Standalone Price for `ZET-MON-27` to AUD 265. Live price selection would now resolve AUD 265. 3. **Order creation.** Atlas creates the Order from the still-`Pending` Quote and sets `quoteStateToAccepted: true`. Because order creation uses the Quote's captured amounts, the agreed AUD 240 holds and the Quote records acceptance. 4. **Locked result.** Every unit is ordered at AUD 240, not the new AUD 265, because the Order takes the Quote's locked prices rather than re-resolving against the catalog. Had Atlas instead wanted the newer terms, they would have requested renegotiation while the Quote was still `Pending`, and the seller would have issued a fresh Quote. The lock protects whichever offer the buyer actually accepts. ## Key takeaways - A Quote is a binding offer with states `Pending`, `Accepted`, `Declined`, `DeclinedForRenegotiation`, `RenegotiationAddressed`, and `Withdrawn`. - Creating an Order from a valid `Pending` Quote uses the Quote's negotiated prices; setting `quoteStateToAccepted: true` records acceptance during order creation. - Renegotiation moves a Quote to `DeclinedForRenegotiation`; the seller issues a new Quote and the original becomes `RenegotiationAddressed`. Only `Pending` Quotes can be renegotiated. - Each Quote round preserves its own `sellerComment` and `buyerComment`, giving a durable history of the negotiation; the Staged Quote's `sellerComment` is mutable and holds only the latest edit. - The buyer creates the Order from a valid `Pending` Quote with a permission such as `CreateMyOrdersFromMyQuotes`; the Order inherits the locked prices and the purchase order number. ## Related pages - [Area overview page with navigation](/learning-model-b2b-commerce.md) - [Previous page: Quote Requests and Staged Quotes](/learning-model-b2b-commerce/implement-b2b-purchase-flows/quote-requests-and-staged-quotes.md) - [Next page: Recurring Orders for B2B](/learning-model-b2b-commerce/implement-b2b-purchase-flows/recurring-orders-for-b2b.md)