Understand quotes and contracts

The quote lifecycle

Requested, in review, quoted, accepted or partially accepted, declined, rejected or expired — and who moves each step.

A quote has a life of its own before it becomes an order. This article describes that life as a set of states: what each one means, who moves it, and what the platform refuses to do in each.

The scenario

A maintenance buyer at a machine builder fills a basket with 500 metres of hydraulic hose DN 12 and 40 fittings. Together that is two pallets, too much for a parcel tariff, so the shop cannot price the freight. The buyer asks for a quote instead of checking out.

The request arrives as ANG-000412. Your Innendienst takes it on, prices the freight to the site at €180, sets a validity of four weeks and sends it. On Thursday the buyer asks whether 600 metres changes the hose price. It does, so the quote is priced again and becomes revision 2. Eleven days later the buyer accepts the hose and leaves the fittings open for now. An order is placed for the hose and the freight. Two weeks after that the buyer accepts the fittings, and a second order follows, without freight.

Every state below exists because somebody in that story needed it.

The states

StateMeansMoved by
requestedA buyer sent a basket in. Nothing is priced yet.The buyer, from the shop
in_reviewSomebody on your side owns it and is working on it.Your team, with Take it on; a quote your sales team opens starts here
quotedThe offer is out, with a price and a validity date. The buyer's turn.Your team, with Send quote
partially_acceptedThe buyer took some positions and left the rest open.The buyer
acceptedEvery position is decided and at least one was accepted.The buyer
declinedThe buyer said no to all of it.The buyer
rejectedYou refused to quote, with a reason the buyer reads.Your team, with Refuse to quote
expiredThe validity date passed without an answer.The hourly expiry sweep

accepted, declined, rejected and expired are final. partially_accepted is not: the buyer is expected back for the rest.

Two doors in. A request from the shop starts at requested and carries a copy of the buyer's cart. A quote your sales team opens with New quote has no cart behind it and starts at in_review, because the person opening it is already the desk. The list's Origin filter tells them apart: From a cart or Opened by sales.

Who may do what in each state

The Cockpit offers the three desk actions only where they make sense, and keeps the button visible with a reason when it does not.

ActionPossible in
Take it onrequested
Send quoterequested, in_review, quoted
Refuse to quoterequested, in_review
Buyer accepts or declinesquoted, partially_accepted (accept); a decided quote cannot be priced again

Once a quote is accepted, declined or expired, it cannot be priced again. The price the buyer answered has to remain the price on the record.

Pricing again creates a revision

A quote in quoted can still be priced again. The usual reason is the buyer asking "what about 600 metres?". By default each new round raises the Revision number on the quote and leaves the earlier round readable in the Trail tab. Six months later, somebody can still answer why this customer got eight percent.

A merchant who prefers to correct mistakes in place can switch that off with the setting A new price makes a new revision. Then the revision stays where it is. Either way every pricing round is announced as an event, corrections included, because the buyer acts on the last figure they were told. The app sends no mail itself; a workflow on that event does.

Validity, grace and expiry

Every quote carries a Valid until date. If you leave it empty when sending, the configured default validity fills it (30 days unless you change it). A quote without an end date does not exist.

The date is enforced when the buyer accepts. Past it, acceptance is refused, and the refusal names the date the quote stood until. You can allow a grace period in hours (Grace period after expiry in hours, zero by default). Hours are deliberate: a few hours of courtesy is a decision, whereas days would turn the date into a suggestion.

Separately, an hourly sweep moves quotes past their date to expired, so the list shows the real state. Switching the sweep off does not soften anything. Acceptance is still refused after the date; the quote only keeps its old status in lists. The sweep also announces a quote that is about to run out, once, three days ahead by default, so a workflow can remind the buyer. Set the warning to zero and nothing is announced.

Partial acceptance

In trade, eight positions now and two later is normal. The buyer may accept some positions and leave or decline the others, and each position records its own Decision: open, accepted or declined. The quote's status follows from those decisions and nothing else:

  • some accepted, some still open → partially_accepted
  • nothing left open, at least one accepted → accepted
  • everything declined → declined

Each acceptance hands over only the positions accepted in that step, so a second acceptance never orders the first half again. One quote can therefore produce several orders, which is why the order reference sits on each position and not on the quote.

You decide whether this is allowed. Switch off Allow partial acceptance and a quote is taken whole or not at all. That is the right choice when your price was calculated over the whole basket. A bundle price handed out line by line gives away the discount without the volume behind it.

Who may accept

Accepting is the step that spends money, so it has its own permission, quotes.accept, separate from asking for a quote. On top of the permission, the setting Who may accept a quote decides between Anyone in the organization (the default) and Only the requester. With the first, a buyer's colleague can take the quote while they are on holiday. With the second, only the person who asked can.

A buyer sees their own organisation's quotes and nobody else's. A quote of another company does not exist for them, not even as a refusal.

Carriage

Freight is quoted beside the goods and never folded into a line, because an ERP books it separately. The total the buyer sees is goods plus carriage. The carriage goes into the first order out of a quote only. A second acceptance of the rest of the basket carries none, because the lorry drives once.

Numbering

Quote numbers come from their own number range, ANG-000001 by default (prefix ANG-, six digits). The ranges are under Configuration › Quote number ranges. Quote numbers and order numbers come from separate ranges, so a number tells everyone which document they hold.

Next