Quote features
These features are used through create_quote, import_order_form and write_quote.
Ramps
A ramp is a quote whose terms change over time, for example a discount in year one and list price after. create_quote builds it in one call: the request’s own start_at, discount, commitment, add-ons and overrides are step 1, and ramp[] lists the later steps.
- Each step is
{start_at, discount?, commitment?, enabled_pricing_ids?, direct_pricings?, overrides?, copy_overrides_from?}. - Discounts and commitments are not carried over to the next step. Add-ons are, unless the step sets its own (
[]drops them). - Each step ends where the next one starts; the last step stays open. The initial term is not changed.
- Steps out of order, a step at or after the end of the initial term, and a ramp combined with an upgrade are refused before anything is written. A failure on any step leaves no quote behind.
- Every step bills its one-off fees at its start. A step that would bill the same one-off fee again is warned about (
one_off_repeated), with the override that waives it. - To add a step to an existing DRAFT quote, use
write_quotewithaction: createonquote_schedules. It closes the open step at the new step’s start.
Price overrides
A price override changes the price of one item on this quote only, without changing the plan. Each entry is keyed by pricing_item_config_id and takes one of:
- Pass overrides on
create_quote, on a ramp step (ramp[].overrides), or on an existing DRAFT quote withwrite_quoteaction: set_overrides, the quote or version id, andbody: {overrides, mode}(validatefirst, thenapply).set_overridesmerges with the overrides already on the quote, including ones made in Desk. On a ramp, name the step withbody.pricing_plan_schedule_id. - Per step. Every ramp step has its own overrides; a step without them bills list price.
copy_overrides_fromstarts a step from an earlier step’s overrides, so you only pass what changes. - Not billed removes the item from the quote and its invoices, without a €0 line. It shows as “not billed” in the quote’s
commercialsand summary.pricing_type: NONEmeans the same. - Change the pricing model with
pricing_typeandbands:FLAT,TIERED(graduated),TOP_TIERED(the top tier’s rate for all usage) orSTAIR_STEP. A percentage stays a percentage. Fixed fees, top-ups and pass-through configs are changed in the plan instead. - A discount, commitment or markup on a config you override is refused, because the quote and its invoices would disagree. Prices of conditions inside a config keep their own price.
- Approval policies see whether a quote has an override, not its size. Writing overrides needs the permission to edit schedule pricing overrides.
Entitlement overrides
Sets a negotiated feature value on the quote, for example 1 billing entity where the plan grants 3. Pass entitlements on create_quote, or update quote_subscriptions on a DRAFT quote. Each entry has feature_reference (or feature_id) and the value field of the feature’s type: number, switch, enum, amount or string. remove: true goes back to the plan value.
The plan or an enabled add-on must grant the feature. On a ramp the value applies to every step. When the quote converts, Solvimon checks that the values were carried over to the subscription.
Direct pricing
Prices a product the plan doesn’t carry, such as an implementation fee, on this quote only. Pass direct_pricings on create_quote, or use write_quote on quote_pricings. Items the plan already prices (override those instead), usage and seat items, and another currency are refused. Approval policies don’t see direct pricings, so every call warns you; tell the approver before finalizing.
Payment terms
The payment term is due_date_configuration on the quote’s subscription: {"type": "PERIOD_AFTER_INVOICE_DATE", "period": {"type": "DAY", "value": 30}} or {"type": "END_OF_THE_MONTH"}. Set it on create_quote, or update quote_subscriptions on a DRAFT quote. create_quote returns the payment_term the quote got and where it came from, and warns payment_term_default when Solvimon’s default applies.
Quote text
A quote version’s text is content: plain text ({"type": "DEFAULT", "default": {"header": "...", "footer": "..."}}) or rich text ({"type": "TIPTAP", "tiptap": "<ProseMirror JSON as a string>"}). Use headings, paragraphs and lists. Tables are refused, because the quote editor in Desk can’t show them; write each row as a list item instead.
Finalize and approvals
write_quote action: finalize locks a DRAFT version and starts any approval policy. Ask get_quotes action: evaluate first to see whether it will need approval.
On the live server, finalize works on the quote’s latest DRAFT version and takes two calls:
- Without
confirmed: truenothing is written. The result says what finalizing does and whether it needs approval: the policies that fire, the approvers and the strategy. It warns when the quote’s owner is the only approver. - With
confirmed: truethe version is finalized and the card shows it as FINAL or WAITING_APPROVAL.
If the approval evaluation can’t be read (your role lacks the permission), the status is UNKNOWN, never “no approval needed”. If an active policy is misconfigured, the finalize is refused before anything is written. A rep is never their own approver.
Signing
The order is: finalize → add_recipient (signer or viewer) → request_signature (DocuSign when connected) → signed → create_subscription. mark_signed records a signature collected outside Solvimon. request_signature and mark_signed are confirm-first. The agent doesn’t ask for signers before the version is FINAL, because the terms may still change. On live, signers are added in Desk.
Upgrade quotes
create_quote with upgrade_from_subscription_id quotes an upgrade of a running subscription. On acceptance the current subscription is cancelled on the start date, unused prepaid fees are credited, and both are settled on one invoice. A standalone quote would instead run a second subscription next to the first one.
start_atis required, and the customer must be the subscription’s own.- For now the target is a newer version of the same plan, or the same version with changed terms.
- Billing period, currencies, add-ons, discount, commitment and overrides are copied from the running schedule. Change them afterwards with
write_quote. - The quote card names the subscription it replaces and what acceptance does.