Skip to content

Quote lifecycle

Quote lifecycle

A quote (App\Models\Quote) moves through the App\Billing\Cpq\Enums\QuoteStatus states:

Status Meaning
draft Editable by the rep; not yet submitted.
pending_approval Above the deal-desk threshold; waiting on an approver.
approved Approved (or auto-approved below threshold); ready to send.
sent Out with the customer at the tokenized order-form URL.
accepted Accepted by the customer; the subscription is provisioned.
declined Declined by the customer (terminal).
expired Passed its validity or expired by an operator (terminal).

Only a draft is editable. Only an approved quote can be sent. Only a sent, unexpired quote is open to a customer decision.

The console

  • List (/quotes) — status tabs (All, Drafts, Pending approval, Approved, Sent, Accepted, Declined, Expired), search by number / prospect / customer, and pagination.
  • Detail (/quotes/{quote}) — the priced line items, the contract terms, the first-invoice and committed-value totals, the approval state, the acceptance record, and a cross-link to the provisioned subscription and the customer organization. The lifecycle actions (submit, send, resend, expire, clone, delete, and — for an approver — approve/reject) live here.
  • Authoring (/quotes/new, /quotes/{quote}/edit) — the header (customer or prospect, selling entity, currency, validity, owner, notes, order coupon), the repeatable line items, and the contract terms. Totals recompute through the engine when the quote is saved and shown.

Actions

  • Submit routes the quote for approval (or auto-approves it below threshold).
  • Send mints the opaque order-form token and opens the order form.
  • Resend re-stamps the send timestamp on the same link.
  • Expire closes an outstanding (approved or sent) quote.
  • Clone starts a fresh editable draft from any quote (new number; no token/approval/acceptance carried over) — the basis for renewals and revisions.
  • Delete removes a quote that has not yet provisioned a subscription.

Every console mutation is audit-logged (see Audit & compliance); the route → action map lives in App\Billing\Audit\Enums\AuditAction.