Summary
A quote version now reports its own deal metrics, calculated by the same invoice engine that will bill them. Shipping addresses are a resource of their own, an invoice and its replacement are linked after a credit and copy, and a payment you recorded by hand can be refunded or reversed. Schedule changes can be approved from Desk, and the Solvimon cards in an AI client are now interactive apps instead of generated HTML.
Quotes
Deal metrics for a quote version
GET /v1/quote-versions/{id}/summary returns the commercial numbers of a quote, calculated by the same invoice engine that will bill it. The response carries tcv, list_tcv, acv, contracted_arr and contracted_arr_fully_ramped, the one_off_total, commitment_total, discount_total, unallocated_discount_total and markup_total, the estimated_usage_total and estimated_tcv, and the blended_discount against list, each as an amount in the quote’s currency, with the same breakdown per subscription in pricing_plan_subscriptions.
Desk, the CRM integrations and the MCP quote tool now all show the same numbers: the total value a sales rep reads off the quote, the figure written onto the opportunity in the CRM and the amount on the first invoice are one and the same, with overrides, discounts, commitments, ramps and proration already applied. The endpoint answers 404 when no summary can be calculated, 409 while a configuration change is still being processed, and 422 when the engine cannot calculate it, for example for a term that spans too many invoices. It needs QUOTE.VIEW. See Quote deal metrics.
Edit a signer or viewer on a quote version
A recipient’s role, name or email can be changed in place, so a signer can be switched to a viewer without removing them. Previously the only way to correct a typo in an email address was to delete the signer and add them again, which lost their position in the signing order. See Quote templates.
A tighter quote PDF The schedule’s start and end dates are left aligned next to the schedule they belong to, feature entitlements that are disabled are left out, and an item that is not billed is hidden; when nothing in a schedule is billed, the whole billed-items section goes with it. Pricing item names in the portal and the PDF now render at the same size as in Desk.
Invoices
An invoice and its replacement point at each other
After a credit and copy, linked_invoices carries a REPLACED row on the original and a REPLACES row on the new invoice, alongside the existing credit links. A reconciler can therefore walk from an invoice to the document that superseded it and refund the charges that were on the original but are missing from the replacement, instead of matching on amounts and dates. The links are written only for replacements made through credit and copy, the one flow where both invoices are known at the time.
Search invoices on what they are worth
POST /v1/invoices/search takes invoice_amount_including_tax.quantity as a numeric range and invoice_amount_including_tax.currency as a filter. Use the pair to find every invoice over a threshold in one currency, which is how approval thresholds and collections queues are usually defined.
Refund or reverse a payment you recorded by hand
A payment created with POST /v1/payments, with no gateway behind it, can now be refunded with POST /v1/payments/{id}/refund or cancelled with POST /v1/payments/{id}/reverse. Both write back to the invoice, so its paid_amount and open_amount follow. A manual payment counts as captured, so reversing one cancels it outright.
The same work corrects partial refunds on gateway payments. The right amount reached the gateway, but the invoice was updated with the full original amount, so after a partial refund the invoice’s paid and open amounts, and its payment status, were wrong. See Invoice payment status.
Fixes
- A linked invoice that has no invoice number yet can be opened from the invoice detail page. Only a
FINALinvoice has a number, and the number was the thing you clicked, so right after a credit and copy neither the credit note nor the copy could be reached while both were stillDRAFT. - A discount line is rendered after the line it applies to, not before it.
Subscriptions
Approve a schedule change from Desk
A pricing plan schedule that is created as DRAFT goes through the approval flow before it takes effect, and Desk now shows that flow: the schedule’s approval_status, who has to approve, and the approve and decline actions. An approval policy can be created with Schedule as its resource, so a plan change on a running subscription can be held for review in the same way a quote is. Approval type groups no longer offer to add levels, which only ranked groups support.
Fixes
- Cancelling a subscription is retryable when the customer or one of its invoices is locked at that moment. The status moved to
CANCELLEDbefore the future invoices were deleted, and if that deletion then failed on the lock, the retry was refused because the subscription was no longerACTIVE, leaving a cancelled subscription with invoices still on it. - A discount whose end date has passed can be edited and deleted in Desk, as the API already allowed. Desk applied stricter rules than the backend and hid the buttons.
Customers
Shipping addresses as a resource
A customer can hold any number of shipping addresses at /v1/shipping-addresses, each with a reference, a description and the same address shape used elsewhere. The recipient block is separate from the customer: it has a type of ORGANIZATION or INDIVIDUAL with the matching sub-object, a phone number and an email, which covers delivery to an employee’s home address or to a site that is not the billing address.
An address is created DRAFT, goes live through activate and is retired through deprecate, and can be deleted while it is DRAFT or DEPRECATED but not while it is in use. POST /v1/shipping-addresses/{id}/set-as-default marks the one to use when a request names no address, reported as is_default. See Shipping addresses.
Wallets and credits
List auto top-up configurations on their own endpoint
GET /v1/auto-top-up-configs lists the top-up configurations of one or more wallets: pass wallet_id for a single wallet or wallet_ids[] for several, and narrow further with pricing_plan_schedule_id and statuses[]. This replaces the wallet’s expand[]=auto_top_up_configs as the way to read them: an auto top-up configuration is a top-level resource with its own lifecycle, so it now reads like one, with paging and filtering of its own.
Integrations
Key pair authentication for Snowflake
A Snowflake data export can authenticate with a key pair instead of a username and password. Put the private key, -----BEGIN PRIVATE KEY----- and all, in the credential field of the export configuration; Solvimon recognises it by that header and uses key pair authentication. Snowflake is withdrawing password authentication for non-human users, and key pairs are the only alternative the export connector supports.
AI and MCP
Solvimon cards are interactive apps
The invoice, subscription, quote and customer cards an AI client renders are now MCP Apps served from Solvimon, rather than HTML the model writes from a template. A card is a real application bundle behind a show_card tool, so it looks the same every time, cannot be fabricated by the model, and its actions carry the platform they belong to.
A sales representative can open what the cards show The Sales Representative role now includes the Document Viewer, Quote Template Viewer and Quote Viewer roles. A sales rep reading a quote through an AI client was shown a card for a document they then could not open.
Desk
Mark a credit invoice as paid A credit invoice can be marked as paid, and the change undone, from the invoice page. The API already accepted it; Desk offered the action on regular invoices only, and now also on credit invoices.