Skip to content

Quotes & approvals

Where a deal becomes a concrete, priced offer — and where that offer is checked and signed off internally before it reaches the customer.

  • Quotes — the priced offer, with a status lifecycle (draft, in review / pending approval, approved, presented, sent, accepted, declined).
  • Quote lines — the line items, each priced through the pricing waterfall, optionally arranged into line groups and carrying per-line configuration and segments.
  • Quote versions — snapshots so a quote can be revised without losing history.
  • Quote team — internal collaborators on a quote.
  • Attachments, notes and competitors — supporting context on the quote.
  • Quote templates — reusable document layouts used to generate a proposal-style quotation from a quote version (see Quote delivery). They are not starting points for new quotes.
  • Approval processes & steps — an approval process is an ordered chain of steps, each naming its approver as either a specific user or an approver role. A submitted quote enters at the process’s first step, and the decision taken there settles the request: approving completes the request and approves the quote outright. Chains of more than one step are not walked today, so define the single step whose holder should have the final say.
  • Discount approval matrix — rules that determine, from the discount on a quote, whether approval is required and which role has to give it.
  • Credit checks & credit holds — the customer-side gate: a check is a dated decision about one customer and one amount; a hold is a standing block or warning on a customer.
  • Validation rules — record-level checks (alongside product rules, option constraints and configuration rules) that keep a quote consistent.
  • Create and update quotes; add, edit, group and remove lines. A quote is editable while it is in draft — once it has been submitted, updates are refused until it comes back out of review.
  • Recalculate a quote’s totals from its lines on demand, and validate a line’s configuration.
  • Track a quote’s activity timeline, audit trail, approval chain and approval history.
  • Submit a quote for approval; approve, reject or request changes (subject to the approval policy below); and work a pending-approvals inbox.
  • Test a discount against the discount approval matrix — enter a discount percentage and an order value on the matrix screen and see whether it would need approval, and from which role.
  • Gate quoting on customer credit as well as on discount — see Credit on a quote.
  • Convert an accepted quote into a contract or a sales order (see Orders & contracts).

A quote is given its number the moment it is created — Q-2026-00001, then Q-2026-00002, restarting at 00001 each January.

That format is not fixed. Administration → Auto-numbering (the tile under Data & Schema) gives each document type its own card, where you set the format template, when the counter resets, the starting number and the step between numbers. A sample number updates as you type, and the same engine that mints real numbers validates what you have written — so a template that cannot work is rejected before you save it, not after.

A template is literal text plus tokens. Exactly one sequence token — {SEQ}, {SEQ:5} for a fixed width of five, or a run of zeros like {00000} — and any of the date tokens {YYYY}, {YY}, {MM}, {DD} and {Q} (calendar quarter). The reset period can be never, yearly, monthly or daily, and it has to agree with the template: a yearly reset needs a year token, a monthly reset needs year and month, a daily reset needs year, month and day. Without them the counter would restart into numbers it has already issued, so the editor refuses to save.

These are the defaults each tenant starts from:

Document Default format Example Resets
Quote Q-{YYYY}-{SEQ:5} Q-2026-00001 Yearly
Sales order SO-{SEQ:5} SO-00001 Never
Sales agreement SA-{YYYY}-{SEQ:6} SA-2026-000001 Yearly
Subscription SUB-{YYYY}-{SEQ:5} SUB-2026-00001 Yearly
Contract C-{YYYY}-{SEQ:6} C-2026-000001 Yearly
Work order WO-{YYYY}-{SEQ:5} WO-2026-00001 Yearly

One caveat on that list: the sales-order format applies to orders raised from a quote. An order created directly from Orders → New is given a system-generated number instead, and editing the format does not change it.

Numbering is per tenant and per document type, and each number is claimed atomically, so two people creating quotes at the same instant can never be handed the same one. Gaps are possible — a number is claimed just before the document is written, and an abandoned save leaves that number spent. Editing a format changes what the next document gets; documents already issued keep the numbers they were given.

Tax is worked out per line and stored on the line. When you add a line, CPQ takes the tax code from the product, applies it to the line subtotal — the discounted amount, not the list amount — and saves both the code and the resulting tax with the line. Change the quantity or the discount later and the tax is recomputed from the code that line is already carrying.

The quote header follows: subtotal, discount total and tax total are summed from the lines, and the grand total is subtotal plus tax. That is what keeps a quote total comparable with the invoice the customer eventually receives.

Rates are read from the tax code itself — GST18 is 18%, VAT20 is 20%, SALES_TAX_8.5 is 8.5% — and the codes EXEMPT, NONE, ZERO, TAX_EXEMPT and NON_TAXABLE are treated as zero-rated. A code carrying no rate in its name contributes no tax to the quote; if you need a code of that kind to be taxed, give it a rate-bearing one.

That is a quote-line rule, and only a quote-line rule. The tax codes, jurisdictions and rates maintained under Admin → Tax Management back CPQ’s tax engine on invoices and through the tax API instead — see Tax on invoices. Give a code a rate-bearing name as well as a maintained rate and the two stay in step.

Versions are snapshots you take deliberately. Take one before you rework a quote and you keep a record of what it looked like — name, number, status, subtotal, discount, tax, grand total, line count and currency, plus who took it and when, with an optional description of what changed. The versions screen lists them newest-first and can put any two side by side so you can see exactly which numbers moved. Versions are a history, not a working copy: the live quote is always the one you edit.

The quote team records who is working the deal — each member with a team role (owner, contributor, reviewer or approver), an access level and, where relevant, their commission role. Alongside your own quotes, you can list quotes across the team.

The collaboration screen on a quote holds three tabs:

  • Notes — dated, attributed comments, each optionally marked internal, with a filter to show only the internal ones.
  • Attachments — supporting documents recorded against the quote with a name, a link and a description.
  • Competitors — who else is in the deal: their competing product, strengths and weaknesses, whether they are priced lower, similar or higher, your win probability and whether that competitor is still active, won or lost.

A quote can stand alone, but it usually hangs off something. Open an opportunity and Create quote carries the opportunity’s customer, contact and the opportunity link straight into the new quote. The first quote created that way becomes the opportunity’s primary quote, shown on the opportunity with a Primary badge in its quotes list — and an opportunity cannot be moved to closed-won until it has a quote linked to it.

Partner-sourced business arrives one step earlier, as a deal registration. A registration names the partner, the customer and optionally the contact and opportunity, all validated against your own records rather than typed as free text. Once it is approved, Create opportunity turns it into an opportunity — which then links back to the registration it came from, so the trail runs registration → opportunity → quote in both directions.

Discount is not the only thing that can stop a quote. How a customer’s exposure is measured, what a credit check decides and what a hold means are all one subject, documented under Credit management — including the thresholds, the risk score and the override flow. What follows is only what that means on a quote.

On the form. Select a customer and CPQ loads their credit position straight away — limit, current exposure, available credit and risk level, shown above the quote. A customer on a hard hold is called out there and the form will not let you save a new quote for them. That refusal is in the app rather than in the API, so read it as a prompt to deal with the hold; the gate that is actually enforced sits at submission.

At submission. Three ways credit stops a quote going into review:

  • A customer on a hard hold cannot have a quote submitted at all, and the message names the reason for the hold.
  • A credit check that comes back rejected blocks the submission and reports what was asked for against what is available.
  • A check that comes back needing approval blocks the submission and asks for a credit override. The dialog links straight to the credit check so you can raise the override without hunting for it.

A soft hold does not refuse the submission outright, but it does stop it going through unattended: the check comes back needing approval even when the customer has headroom, so a manager has to agree before the quote moves. See Credit holds.

The block clears when the override does: raise it from the credit check the dialog points you at, and an approval marks the check approved and releases any soft hold on the customer, so the quote can be submitted. Credit checks covers who processes an override and what a refusal leaves in place.

Submitting is allowed only from draft, and only when the quote has at least one line. The credit gate above runs first. If it passes, the quote moves to in review and an approval request is raised in the same breath — the two either both happen or neither does, so a quote never sits in review with no approval request behind it.

The discount approval matrix decides who that request is aimed at. CPQ works out the quote’s effective discount percentage from its own totals, finds the matrix rule whose threshold that discount exceeds, and records both the approver role from that rule and the reason — “discount 23.40% exceeds threshold 20%” — on the request. Where no rule is exceeded, the request is raised as a plain manual approval.

Routing is decided by discount percentage alone: the rule with the highest threshold that the discount still exceeds wins, so a 5% discount and a 30% discount on the same deal can land in front of different people. A matrix rule can also carry an order-value band, but that band is applied only by the Test Discount Approval checker on the matrix screen — the submission router does not read it.

Approve, reject and request-changes are not open to everyone who can reach the approvals screen. Every decision is authorised server-side, and the rule fails closed:

  • Separation of duties — you can never action a request you submitted yourself, even if you also hold the approver role. Otherwise the discount approval matrix would be a no-op: a rep could raise and clear their own over-discount.
  • Eligible approver only — a step that names a specific approver can be actioned only by that user; a step that names an approver role can be actioned by any current holder of that role. A step with neither configured has no eligible approver, so nobody can act until an administrator assigns one.

Any denial is a 403 with a message naming the reason. The UI mirrors the rule rather than letting you discover it by failing: every request carries is_submitter and can_act flags, so the inbox offers Approve and Reject only on requests you can actually action, and the request detail page — which also carries Request changes — replaces the buttons with a short explanation of why they are unavailable.

The practical consequence for a new tenant: if no approval process has been defined for quotes, the first submission creates an empty default one. It has no steps until an administrator adds them, and a request sitting on a step with no approver cannot be actioned by anyone — so define the process and its approvers before the first quote goes out.

From a quote in the CPQ sales app you can view the PDF and download, share or email the real document (see Quote delivery), or share a short text summary through the usual Android share sheet. The edit wizard opens on the quote’s own customer and line items, but its save is not accepted against the current database, so raise and revise quotes on the web — see Mobile apps.

The app also lists approval requests — pending, approved and rejected — so an approver can see what is waiting on them while away from a desk. Taking the decision is a web-app job: the approve and reject buttons in the app do not currently record anything.

Quotes also get deal rooms on mobile: a room per deal with its members and a message thread, so the conversation around a quote lives next to the quote rather than in email.

Approval processes and their ordered steps, the discount approval matrix, quote templates, validation / product / configuration rules, document numbering, and credit limits and holds are all defined by administrators. Statuses are centrally managed.