> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.solvimon.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.solvimon.com/_mcp/server.

## 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](https://docs.solvimon.com/api-docs/configuration-api/quote-versions/get-quote-versions-by-resource-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](/platform-guides/customers-and-billing/quoting/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](/platform-guides/customers-and-billing/quoting/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](/platform-guides/invoicing/invoice-corrections/credit-invoices), the one flow where both invoices are known at the time.

**Search invoices on what they are worth**
[POST /v1/invoices/search](https://docs.solvimon.com/api-docs/transaction-api/invoices/post-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](https://docs.solvimon.com/api-docs/transaction-api/payments/post-payments-by-resource-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](/platform-guides/invoicing/invoices/invoice-payment-status).

### Fixes

bug-fix

* A linked invoice that has no invoice number yet can be opened from the invoice detail page. Only a `FINAL` invoice 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 still `DRAFT`.
* 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](/platform-guides/customers-and-billing/quoting/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

bug-fix

* Cancelling a subscription is retryable when the customer or one of its invoices is locked at that moment. The status moved to `CANCELLED` before the future invoices were deleted, and if that deletion then failed on the lock, the retry was refused because the subscription was no longer `ACTIVE`, 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](/platform-guides/customers-and-billing/customer) can hold any number of shipping addresses at [/v1/shipping-addresses](https://docs.solvimon.com/api-docs/configuration-api/shipping-addresses/post-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](/platform-guides/customers-and-billing/customer/shipping-addresses).

## Wallets and credits

**List auto top-up configurations on their own endpoint**
[GET /v1/auto-top-up-configs](https://docs.solvimon.com/api-docs/configuration-api/wallets/get-auto-top-up-configs) lists the [top-up](/platform-guides/wallets-credits/wallet-top-ups) 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](/integrations/data-exports/export-snowflake) 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.