Skip to content

Quotes and intake

How a buyer gets a price for one Service job, accepts it into an Order, and how intake checks the job against its brief before work starts.

A Quote fixes the price of one buyer's job before any work starts. Intake then checks that the job that arrives is the job that was quoted.

When a Service needs a Quote

A Service with a fixed scope sells straight from its Offer. The buyer places an Order at the list Price, and intake starts at once.

A Service priced by the size of the job needs a Quote first. Take a Startup that copyedits book manuscripts at a price per thousand words. The price depends on the manuscript, so the author asks before buying.

Request with a brief

The buyer requests terms with a brief: the size, the inputs, and the turnaround the job needs. The brief becomes the scope the Order buys, so it is data, not a message.

TypeScript
const { deal } = await $.Quote.request({
  offers: ['offer_copyedit'],
  brief: { words: 82_000, styleSheet: 'house', turnaround: 'P21D' },
})

Request opens a Deal and starts Send a quote. A buyer's Agent requests the same way under its Mandate, and the Quote records both the Agent and the person it acts for.

Send, then never edit

The Sales Engineer prices the brief as lines, inside the discount Limit, and sends it, which freezes the lines, the total, and the payment terms. A different price is a new Quote that supersedes the old one, so the buyer always accepts exactly what they read. Each move is a Verb on the Quote:

VerbMoves the Quote toRun by
sendsentThe Sales Engineer
acceptacceptedThe buyer
declinedeclined, with the reason keptThe buyer
supersedesuperseded, replaced by a newer QuoteThe Sales Engineer
expireexpired, on its validUntil dateNo caller

Split a long job into lines. The copyeditor quotes 82,000 words as three lines, one per part of the book, each with its own price. Each line is delivered, accepted, and billed on its own, so the author pays for part one while part three is still in work.

Accept places the Order

Accept turns the Quote's one-time lines into an Order and its recurring lines into a Subscription. It authorizes payment for the Order's total, copies the brief onto the Order, and sets its fulfillment to intake.

TypeScript
const { order } = await $.Quote.accept({ quote: 'quote_1', party: 'contact_1' })

Accept also wins the Deal and supersedes every other open Quote on it. An expired or superseded Quote never converts, so a stale price never becomes an Order.

Intake checks the job against the brief

Intake compares what the buyer sends with what the brief promised. Order.start runs that check, then moves the Order from intake to working and sets dueAt from the brief's turnaround.

TypeScript
await $.Order.start({ order: 'order_1', received: { words: 79_400 } })

A missing input becomes one Question to the buyer, through ask, and the Order stays in intake. The deadline starts when the answer arrives, never before. Here the manuscript arrives without its style sheet, so the copyeditor asks for it once and waits.

Work beyond the brief

The brief is the ceiling of what the Order buys. When the manuscript arrives at 95,000 words, the extra 13,000 words go on a new Quote on the same Deal.

The Order keeps its accepted lines and starts on the quoted part at once. The author accepts or declines the extra on its own terms. No Startup bills work the buyer never priced, and no Startup absorbs work it never quoted.

Next