> 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

Happy Halloween. This release has no tricks, only treats. Its theme is this: you see the result before you commit, so no surprise waits for you afterwards.

Preview the invoice of a plan change before you make the change. The preview is available from your integration and from the customer portal. Your upgrade screen can show the amount, and the customer decides with the number in front of them.

Solvimon refuses a wallet grant that it cannot book at the moment you create it, not later in accounting. Desk hides the actions that a role does not permit. A user no longer finds a permission limit on an error page.

Quotes receive three features that sales teams asked for:

* **Mandatory signing.** You can require a signature before a customer accepts a quote.
* **Ramps.** You can sell a ramp of consecutive schedules on one subscription, each step on its own plan version.
* **Templates on upgrades.** You can start an upgrade quote from a quote template, so it uses the same defaults as a new quote.

You can upload a usage file of up to 2 GB directly to storage, and Solvimon processes it from there. Workflows can tag the emails that they send, and they can export to each ERP that you have connected.

## Quotes

**Signing can be made mandatory**
A platform can require a signature before a quote is accepted. Set `quote_settings.signing_required` on the [platform](https://docs.solvimon.com/api-docs/configuration-api/platforms/patch-platforms-by-resource-id) for the default. Set `signing_required` on a [quote template](https://docs.solvimon.com/api-docs/configuration-api/quote-templates/patch-quote-templates-by-resource-id-or-reference) to override it for the quotes built from that template. A quote version resolves the value and reports it read-only, so a single quote cannot switch signing off. The template's value wins when the quote has a template that sets one. The platform default applies otherwise. Both default to `false`, so a platform that does not configure signing is not affected. See [Quote templates](/platform-guides/customers-and-billing/quoting/quote-templates).

**A quote can carry a ramp of consecutive schedules**
[POST /v1/quotes/init](https://docs.solvimon.com/api-docs/configuration-api/quotes/post-quotes-init) takes a `pricing_plan_schedules` list on a subscription, where it took a single `pricing_plan_schedule`. Each entry is one step of the same subscription, priced on its own plan version. This is how you sell a multi-year ramp: year one discounted, years two and three at full price. A schedule can now also end before the subscription's initial term ends, so the first step does not have to run the full term. The singular `pricing_plan_schedule` still works. Validation errors name the schedule by its index only when the request used the list. See [Quotes](/platform-guides/customers-and-billing/quoting).

**The upgrade flow takes a quote template**
[POST /v1/quotes/upgrade](https://docs.solvimon.com/api-docs/configuration-api/quotes/post-quotes-upgrade) accepts `quote_template_id`, so an upgrade quote starts from the same commercial defaults as a new one. Desk offers the template picker in the upgrade flow. An id that does not resolve to a quote template on the platform answers `404`. See [Upgrade quotes](/platform-guides/customers-and-billing/quoting/upgrade-quotes).

### Fixes

bug-fix

* A subscription that is canceled, or has a cancellation scheduled, no longer offers the [upgrade quote](/platform-guides/customers-and-billing/quoting/upgrade-quotes) flow. The quote it produced could not be acted on.
* Quote PDFs break between pages where the content allows it. The billing period is left out of a schedule when it matches the pricing period.

## Subscriptions

**Preview the invoice a plan change produces**
[POST /v1/invoices/change-plan/preview](https://docs.solvimon.com/api-docs/transaction-api/invoices/post-invoices-change-plan-preview) returns the invoice a [plan change](/platform-guides/customers-and-billing/subscriptions/plan-changes) creates at the start of the new schedule, and changes nothing. The body is the one that [change-plan](https://docs.solvimon.com/api-docs/configuration-api/pricing-plan-subscriptions/post-pricing-plan-subscriptions-by-resource-id-change-plan) takes, with the subscription named in it. It holds `pricing_plan_subscription_id`, the target `pricing_plan_id`, an optional `start_at` and an optional `billing_period`. The group's timing policy resolves the start exactly as the change itself does. A `NEXT_BILLING_PERIOD` policy previews the invoice of the next period. An immediate policy previews the invoice of the change. Running discounts and coupons on the current schedule are carried into the preview. An upgrade screen can show the amount before the customer commits. Until now, you had to make the change and read the invoice afterwards. The call needs the `INVOICE.PREVIEW` permission.

The [customer portal](/platform-guides/customers-and-billing/self-serve-plan-changes) has the same route at `POST /v1/portal/invoices/change-plan/preview`, limited to the subscription the session is scoped to.

**A schedule's overridden pricing follows the plan version's entitlements**
An entitlement added to a pricing on an active plan version now reaches the schedules that override that pricing with `SPECIFIC`. Those schedules kept only the entitlements the override held when it was created, so a feature added to the plan never arrived for customers on custom pricing. You can also reset a schedule's entitlement overrides with [PATCH /v1/pricing-plan-schedules/\{id}](https://docs.solvimon.com/api-docs/configuration-api/pricing-plan-schedules/patch-pricing-plan-schedules-by-resource-id), which puts it back on the version's own entitlements. See [Custom pricing](/platform-guides/customers-and-billing/subscriptions/custom-pricing).

### Fixes

bug-fix

* [Copying](https://docs.solvimon.com/api-docs/configuration-api/pricing-plan-schedules/post-pricing-plan-schedules-by-resource-id-copy) a subscription or a schedule copies its override pricings and the discounts that target them. The copy dropped overrides priced per currency or per billing period, and the request still answered `200`.

## Customer portal

**Checkout asks for a phone number**
The [checkout](/platform-guides/customers-and-billing/hosted-checkout) form has a phone number field. The customer enters it as a single input with the country dialing code in it. Labels are hidden where the field explains itself, so the form stays short on a payment terminal or a phone.

### Fixes

bug-fix

* Charging [on-demand pricing items](/platform-guides/products-and-pricing/pricing-plans/on-demand-charges) with `finalize_immediately` works on a platform that holds invoices for approval. The one-off invoice is finalized without going through the approval policy. Before, the call answered `422` saying the invoice was not `FINAL` and left a `DRAFT` invoice behind on every attempt. An invoice that cannot be finalized now answers a validation error naming `finalize_immediately` and the status it reached.

## Invoices

**Invoices follow a change of payment acceptors on the subscription**
Changing the payment acceptors on a [subscription](https://docs.solvimon.com/api-docs/configuration-api/pricing-plan-schedules/patch-pricing-plan-schedules-by-resource-id) refreshes the payment methods on its `OPEN`, `DRAFT` and `FINAL` invoices. Invoices in any other status are left alone. Before, an invoice offered a method that you had withdrawn, or missed a method that you had added, until you updated each invoice by hand. See [Payment options](/platform-guides/platform-configuration/payment-options).

### Fixes

bug-fix

* A [one-off invoice](/platform-guides/invoicing/invoices/one-off-invoices) created without a payment method no longer picks up the billing entity's payment acceptor on its own. The invoice offered a method the caller did not ask for.

## Payments

**Your own beneficiary name on the invoice's bank details**
A [payment acceptor](https://docs.solvimon.com/api-docs/configuration-api/payment-acceptors/patch-payment-acceptors-by-resource-id) takes an optional `beneficiary_name`. When set, it is used as the `legal_name` in the invoice's `payment_actions[].bank_account`. It replaces the billing entity's legal name, or the customer's organization legal name on a self-billing invoice. A platform that collects through an account held in a different name can print that name on the invoice without changing its billing entities. Leave it out and nothing changes. See [Payment options](/platform-guides/platform-configuration/payment-options).

## Wallets and credits

**A wallet grant that cannot be booked is refused when you create it**
[POST /v1/wallet-grants](https://docs.solvimon.com/api-docs/transaction-api/wallet-grants/post-wallet-grants) validates `paid_amount` against the grant. Its currency must equal `grant_amount.currency`. Its quantity cannot be negative and cannot exceed `grant_amount.quantity`, because the promotion is the difference between the two and a negative promotion cannot be booked. A credits grant takes no `paid_amount` at all, because a credit has no exchange rate to book the difference with. An unpaid grant defaults to the grant's own currency. These configurations previously failed later, inside accounting, far from the call that caused them. See [Credit types and wallets](/platform-guides/wallets-credits/credit-types-wallets).

## Pricing

**Price caps keep the precision you configure**
A pricing band's `minimum_amount` and `maximum_amount` are stored at the precision you send, instead of being rounded to the currency's decimals. A cap of `0.005 EUR` on a percentage price stays `0.005 EUR`, where it was stored as `0.01 EUR` without warning. A platform that prices in fractions of a cent, such as payment and interchange fees, can set a floor or a ceiling the currency has no unit for. See [Flexible pricing](/platform-guides/products-and-pricing/pricing-plans/flexible-pricing).

## Meters

**A required meter value or property can be made optional**
[PATCH /v1/meters/\{id}](https://docs.solvimon.com/api-docs/configuration-api/meters/patch-meters-by-resource-id-or-reference) accepts `required` going from `true` to `false` on a [meter value](/platform-guides/meter-and-event-design/meter/meter-values) or [meter property](/platform-guides/meter-and-event-design/meter/meter-properties) of an `ACTIVE` meter. Events already ingested keep their values. Events that arrive without the field are accepted from that point on. This also makes it possible to remove a field that nothing references. Make the field optional, then remove it in a second update. Deleting a field that is still in use stays blocked. Desk allows the same change on the meter form.

## Event ingestion

**Upload a usage file of up to 2 GB straight to storage**
[POST /v1/files](https://docs.solvimon.com/api-docs/event-api/files/post-files) with `source: "BUCKET"` answers with a signed upload link instead of taking the file's content in the request body. Upload a gzipped CSV to that link, then call [process](https://docs.solvimon.com/api-docs/event-api/files/post-files-by-resource-id-process). Solvimon ingests up to 2 GB compressed and 5,000,000 lines per file. The content never passes through the API, so a retry re-sends only the upload. `line_counts` reports how many lines were done, not matched, duplicate or in error. A [result file](https://docs.solvimon.com/api-docs/event-api/files/get-files-by-resource-id-result-download-url) gives the outcome per line. See [Large event file uploads](/platform-guides/meter-and-event-design/usage-events/large-event-file-uploads).

## Workflows

**Tag the emails a workflow sends**
The "send email to customer" [action](https://docs.solvimon.com/api-docs/configuration-api/workflow-actions/post-workflow-actions) takes up to three free-text tags in `send_email_to_customer.tags`. Each tag is ASCII and at most 128 characters. Desk exposes them on the action form. The tags travel with the message, so you can identify the emails of one workflow in your email provider's reporting. See [Workflow actions](/platform-guides/workflows/workflow-actions).

**Export to ERP offers every connected ERP**
The "export to ERP" [action](/platform-guides/workflows/workflow-actions) lists the accounts of every connected [ERP integration](/integrations/enterprise-resource-planning-erp), where it listed only Exact Online. Any ERP you have connected now appears in the integration picker: Exact Online, NetSuite, Xero, Dynamics Finance, Dynamics Business Central, QuickBooks, Rillet and Campfire.

## Reporting

**A conditions column in the invoice report**
The [invoice report](/platform-guides/analytics-reporting/report-downloads/invoice-header-report) carries a conditions column. It is resolved the same way as the comparator column the [usage report](/platform-guides/analytics-reporting/report-downloads/matched-events) already has. A line priced through a condition says which condition applied, without a second report to cross-reference.

## AI and MCP

**Download a quote's PDF from its card**
The [quote card](/mcp-server/tools/get-quotes) an AI client renders has a download action, as the invoice card does. It also shows the quote's deal metrics and its signers.

## Desk

**Desk shows only the actions your role allows**
Actions and pages a user's role does not permit are no longer offered. A Quote Viewer no longer sees **Accept** on a final quote or **Cancel approval request** on someone else's quote. A Customer Draft Contributor no longer sees **Save and activate** when adding a customer. Publishing a draft pricing plan version, through **Activate subscription** or through the schedule editor, is offered only to users who may publish one. Before, clicking through to a permission error was the only way to find out. See [Roles and permissions](/platform-guides/platform-configuration/users-permissions/roles-permissions).

**Insights dashboards carry a chat**
A Dynamic Insights dashboard has the [AI chat](/platform-guides/analytics-reporting/insights/ask) next to it, so you ask a question about a graph where the graph is.

**Variables moved under Meters**
The Variables screen is a tab on the Meters page rather than a separate entry. This puts [meter property variables](/platform-guides/meter-and-event-design/meter/meter-property-variables) next to the meters they belong to.