Quotes & contract pricing
A quote is your priced answer to a customer’s request: one or more part lines, each with a cost, a sell price, and the margin between them. Quotes live under Pipeline → Quotes, move through a five-status lifecycle, and — for customers with portal access — are approved or declined by the customer online.
The quote list
Screen: The Quotes tab. A KPI strip with four tiles: LIVE QUOTES (with a draft count beneath), ACCEPTED, AVG MARGIN, and OPEN QUOTE VALUE. Below, the heading “Quotes · outbound”, a search box (“Search quote #, customer, or part…”) with a + New Quote button beside it, and a table of quotes: quote number, customer, first part number (with a “+N” suffix when the quote has more lines), a status pill, total, a color-coded margin percentage, and the validity date.
- Search matches the quote number, the customer, or any line’s part number.
- Long lists page with Load more.
- A small dot next to the quote number marks a quote that was priced automatically.
Creating a quote
A quote starts from a request, from a deal, or from scratch:
-
From an RFQ — the usual path. Open the request and click Create quote → (see The RFQ inbox). APEX then:
- Creates a draft quote numbered
Q-<year>-<sequence>for the RFQ’s customer. - Seeds one line with the request’s part number, description, quantity, and condition.
- Prices the line from the customer’s contract, if an active price agreement covers it (next section).
- Flips the RFQ to
QUOTEDand links the two records.
- Creates a draft quote numbered
-
From scratch — for demand that never came in as a logged request, click + New Quote beside the quote list’s search box. The New Quote drawer takes the Customer, one line (Part # — required — plus Description, Qty, and Condition), and — unlike the RFQ path — a Unit cost and Unit price up front, so the margin is honest from the first draft. Create quote confirms with a toast; the quote is not linked to any RFQ.
-
From a deal — Create quote on the deal’s Quotes table opens the same drawer with the deal’s customer fixed, and ties the new quote to the deal. See The deal pipeline.
A quote’s lines and prices are fixed when the quote is created — the quote record has no line editor today. Set the customer’s contract prices before quoting, so the draft prices itself correctly. Quotes created from an RFQ also carry no unit cost and no validity date (the New Quote drawer takes a cost and price up front); quotes that arrive with cost, price, and expiry already filled come from your data import or integrations.
Contract pricing
Negotiated prices for key accounts live on the customer profile: Customers → (customer) → Contract pricing. Each agreement fixes a price for one part number in one condition, optionally capped at a maximum quantity and bounded by an effective window.
Screen: The customer profile’s Contract pricing section. Each agreement is a row: the part number, a condition pill, the agreed price with currency, and an Active or Inactive pill, with the quantity cap and effective window beneath (“Up to 10 · 2026-01-01 – 2026-12-31”, or “Always in effect”). Below the list, an add row: Part #, Condition, Agreed price, Ccy, Max qty, Effective from, Effective until, and an Add agreement button. Each row has a Remove button.
When a quote is created, APEX checks each line against the customer’s agreements. An agreement applies when the part number and condition match, the line quantity is within the cap, and today falls inside the effective window. If several apply, the most recently negotiated one wins.
- An applied agreement fills the line’s unit price automatically and tags the line with a cyan Contract pill in the quote’s line table.
- If the line already carries a deliberate, different price, the entered price wins and the line is not tagged — a rep’s override is respected.
Adding a contract price
- Open Customers, then the customer’s profile, and scroll to Contract pricing.
- Enter the Part # and pick the Condition the price applies to.
- Enter the Agreed price (and currency — agreements apply to USD quotes today).
- Optionally cap it with Max qty and bound it with Effective from / Effective until.
- Click Add agreement. Removing one is one click — Remove — and only affects future quotes; already-created quotes keep their prices.
The quote record
Screen: The quote detail. A header with the quote number, the customer (and ”· from RFQ-…” when it was built from a request), and the status pill. A meta row: TOTAL COST, QUOTE PRICE, MARGIN (color-coded), VALID UNTIL, and — on automatically priced quotes — PRICED BY. A Lifecycle cell with five status buttons (DRAFT · SENT · ACCEPTED · REJECTED · EXPIRED) and a PDF control on the right. A Market comps cell (a placeholder note today). The Line items table: line number, part number, description, condition, quantity, unit cost, unit price (with the Contract pill on contract-priced lines), and the line margin. Footer links: Open deal → (when the quote belongs to a deal) and ← Quotes.
The Market comps cell is a placeholder: live marketplace comparables and a suggested price are planned, not built. Pricing is yours.
Quote statuses
| Status | What it means | How it gets there |
|---|---|---|
DRAFT | Being built — invisible to the customer. | Every new quote starts here. |
SENT | Offered to the customer; the portal shows it for decision. | You click SENT. The first send stamps the sent date. |
ACCEPTED | The customer said yes. | The customer approves on the portal, or you click ACCEPTED after a phone/email yes. |
REJECTED | The customer said no. | The customer declines on the portal (optionally with a reason), or you click REJECTED. |
EXPIRED | The validity date passed without a decision. | You click EXPIRED — APEX does not flip it automatically. |
Change status by clicking the buttons in the Lifecycle cell — the current status is highlighted and the toast confirms each move (“Q-2026-0004 marked SENT.”).
Marking a quote SENT publishes it to the customer’s portal — it does not email the customer. Send the quote by your usual channel, or point the customer at their portal.
A SENT quote past its Valid until date stops being answerable on the portal, but its status
stays SENT until you mark it EXPIRED yourself — the follow-ups worklist flags these as
PAST DUE so they don’t linger unnoticed.
The quote PDF
A quote that has a PDF on file shows Download PDF → in the Lifecycle cell. Quotes without one show a disabled PDF · soon button — the quote PDF export pipeline is on its way, so today a PDF is present only on quotes that brought one along from your previous system.
What the customer sees
Customers with portal access find the quote under Your quotes as soon as it is SENT —
drafts are never visible, and the portal shows sell prices only, never your cost or margin.
While the quote is open for a response (SENT and not past its validity date), the portal shows a Your decision panel with Approve quote and Decline buttons. A decline can carry an optional reason, which is saved onto the quote record. Either decision updates the quote’s status in your console immediately. See Customer Portal for the customer-side walkthrough.
The follow-ups worklist
The Follow-ups tab is the chase list: every SENT quote with no decision yet, ranked so the
highest-value quote that is going cold sits on top. Quotes drop off automatically the moment they
are accepted, rejected, or expired.
Screen: The Follow-ups tab. A KPI strip: OPEN SENT, OPEN VALUE, EXPIRING ≤7D, and STALE ≥14D. Below, the heading “Quote follow-ups” and a table: an urgency pill, quote number, customer, part, value, when it was sent (“12d ago”), when it expires (“in 3d” / “5d overdue”), and a Follow up button that opens the quote.
| Urgency pill | When it shows |
|---|---|
| PAST DUE | The validity date has passed with no answer — about to be lost. |
| EXPIRING | Three days or less to the validity date. |
| STALE | Sent 14+ days ago. |
| AGING | Sent 7+ days ago. |
| SENT | Fresh — sent within the last week. |
A working rhythm: open Follow-ups once a day, start at the top row, click Follow up, call or write the customer, and record the outcome on the quote (ACCEPTED / REJECTED / EXPIRED) so the list stays honest.
Roles: anyone with module access can build, send, and decide quotes for the customers in their data scope — there is no separate approval role between draft and sent.