> 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

This release brings dynamic meter creation during ingest (send events now, decide what to bill for later), quote templates, on-demand charging end-to-end (API and portal), a new Metronome integration, more control over credited invoices, and a range of subscription, invoicing and Desk improvements.

## Event ingestion

**Create meters on the fly during ingest**
You can now feed Solvimon events without configuring [meters](/platform-guides/meter-and-event-design/meter) first, and figure out what to bill for later. [`POST /v1/events/ingest`](/platform-guides/meter-and-event-design/usage-events/event-ingestion-api) can create meters, properties and values automatically for data that doesn't exist yet: send the event, and Solvimon sets up the underlying meter on the fly.

This changes how you can approach metering. Instead of deciding up front which usage is billable, you can stream everything that might matter and treat that decision as a downstream one: some events stay as signals you observe and analyse, others become the basis of a charge once you attach pricing to them. It also streamlines onboarding, since getting a working event feed no longer depends on a fully configured meter catalog, and it gives your metering setup room to evolve with your product, driven by the events you actually see rather than the ones you predicted.

A new `meter_validation` query parameter controls the behaviour: `STATIC` (the default, unchanged) requires the meter to already exist and rejects the event otherwise, while `DYNAMIC` creates whatever is missing and then processes the event against it. Concurrent creation of the same meter is handled safely, so two events racing to create the same meter won't fail.

## Pricing

**Charge on-demand (one-off) pricing items**
Some charges don't fit a recurring schedule: a one-time setup fee, or an [add-on](/platform-guides/products-and-pricing/pricing-plans/add-ons) a customer buys on the spot. You can now flag selected [one-off](/platform-guides/products-and-pricing/pricing-plans/one-off-pricing) product items as "on-demand" and charge them on top of an existing subscription whenever you need to, on their own invoice and with an optional preview first. See [On-demand charges](/platform-guides/products-and-pricing/pricing-plans/on-demand-charges).

* Retrieve all on-demand pricing items available for a schedule, so you can present them to your customers, for example as buy buttons in your own UI or portal.
* Charge one or more on-demand items, optionally previewing the resulting invoice before it is created, and optionally finalising it in a single step.

**Nested pricing improvements in Desk**
Working with deeply nested pricings is now more manageable. You can collapse and expand individual nesting levels to focus on the part you're editing, manage and edit the pricings per level, and expand or collapse all levels at once from the context menu, making complex pricing structures clearer to navigate and reason about.

## Quotes

**Quote templates**
You can now configure reusable quote templates in Desk that define the defaults for a quote, such as the pricing plan, subscription settings, and content blocks. When creating a new quote you can select a template to pre-fill it, so quotes start from a consistent, approved baseline instead of being built from scratch each time. This speeds up quote creation, reduces manual entry, and keeps quotes consistent across your sales and billing teams. Templates also support attachments, which are carried onto the quotes created from them.

**New quote renderer enabled by default**
The new quote renderer is now the default for everyone, and the previous developer-tool toggle has been removed, so all quotes are produced by the new renderer without any opt-in. This release also adds the remaining translations and refinements needed to fully support it.

**Set subscription custom fields when creating a quote**
When creating a quote (on quote init or on a quote upgrade), you can now set the [custom fields](/platform-guides/platform-configuration/custom-fields) for the subscription that the quote will create. The values are stored on the quote and carry over automatically once it is finalised into a subscription, so you don't have to go back and fill them in afterwards.

**Submit custom fields via URL parameter**
Quote and subscription forms can now receive `custom_fields` through URL parameters (for `v1/quotes/init`, `v1/quotes/upgrade` and `v1/pricing-plan-subscriptions/init`). This makes it possible to pre-fill custom fields when the form is embedded in an iframe, for example in Salesforce, where the embedding page can't control the request body, so values from the host system flow straight into the form.

**Quotes only for active pricing plan versions**
Quotes can now only be created for *active* pricing plan versions. This closes a gap where a quote could be built on a draft pricing plan version and then finalised, resulting in an active subscription running on a draft plan: a state you generally never want in production.

### Fixes

bug-fix

* Subscription details (terms) can now be edited correctly while building a quote, where previously saving appeared to be required but had no effect.
* Signers created from an existing contact are no longer shown as "Unknown Contact" when a quote is accepted; the contact is now resolved correctly.

## Customer portal

**Upgrade subscriptions with on-demand items**
The upgrade-subscription flow in the customer portal is now wired to the on-demand pricing endpoints, replacing the earlier placeholder behaviour. Your customers can upgrade their subscription and add on-demand items to it directly from the portal, in a self-service flow.

**Quote attachments in the portal**
Attachments on a quote are now shown in the Quote Portal and can be downloaded by your customers, so any supporting documents you include on a quote are available to them directly. (Attachments can only be viewed and downloaded from the portal, not added.)

## Invoices

**Choose the source of truth for credit note details**
When you [credit a `FINAL` invoice](/platform-guides/invoicing/invoice-corrections/credit-invoices), the credit note is created in `DRAFT`, and by default its customer and billing details are refreshed to the customer's *current* values, which means a credit note can end up showing details that differ from the invoice it is crediting (for example if the address changed in the meantime). You can now control this explicitly with a new `credit_details_source` option:

* `CURRENT` (default, unchanged behaviour): the credit note is refreshed with the customer's *current* details.
* `ORIGINAL`: the customer and billing entity are copied over *exactly* from the original invoice, without a refresh. Use this when the credit note must mirror the invoice it credits, even if the customer's address or details have since changed.

See [Credit note customer details](/platform-guides/invoicing/invoice-corrections/credit-invoices#customer-details-on-the-credit-note).

### Fixes

bug-fix

* Fixed creating a one-off invoice for a billing entity when the platform's default payment acceptor belonged to a *different* billing entity. One-off invoice creation now works correctly across billing entities, regardless of which one holds the platform default.
* Fixed a bug that prevented generating an invoice preview for a customer that has no address on file, so previews now work for these customers too.
* Fixed a case where, after copying a schedule and then changing its end date, the next billing period's invoice could be skipped. Invoices are now generated reliably in this scenario.

## Customers

**New `PROCESSING_ONLY` customer role**
Processing-only customers can now be expressed through the roles model with a dedicated `PROCESSING_ONLY` role, alongside the existing boolean flag; the two are kept in sync so existing integrations keep working unchanged. As with the previous flag, a customer with the `PROCESSING_ONLY` role cannot hold any other roles, keeping processing-only customers clearly distinct.

## Subscriptions

**Upgrade before the initial term has expired**
You can now upgrade a subscription even when its initial (committed) term has not yet ended. Previously this was blocked, forcing you to wait until the initial term expired before an upgrade could go through; now you can process the upgrade whenever the customer wants to move up.

**Filter subscriptions by multiple statuses**
The `POST /v1/pricing-plan-subscriptions/search` endpoint now lets you filter by multiple statuses in a single request, so you can retrieve, for example, all active *and* cancelled subscriptions at once instead of querying each status separately.

### Fixes

bug-fix

* Fixed an issue when editing subscription terms where removing a custom field value stored an empty string instead of actually clearing the field. Empty custom fields are now correctly treated as "not set", so clearing a value has the effect you'd expect.

## Integrations

**Metronome integration**
Added a [Metronome integration](/integrations/data-imports/metronome) to Desk, available under Settings → Integrations, for syncing your usage and billing data with Metronome.

## Currencies

**Added SLE and deprecated SLL**
Added support for the new Sierra Leonean Leone (`SLE`) and deprecated the old `SLL`, following the currency's redenomination, so conversions and pricing use the correct, current currency.

## Desk

**Clearer revenue item labels**
The revenue item panel now uses clearer labels ("Add revenue item", "Revenue type") to better describe what you're configuring.

### Fixes

bug-fix

* Fixed adding metric rules from the UI, which had stopped working.
* Fixed the context menu on the "Customize price rule header text" block not showing when the header text is long.

## Deprecated API fields

The following fields and values are now deprecated. They continue to work for backwards compatibility, but we recommend migrating to the replacements.

* **`processing_only`** (Customer): deprecated in favour of the new `PROCESSING_ONLY` role. Use the `roles` field instead.
* **`forceInitOnHold`** (invoice credit request): deprecated in favour of the snake\_case `force_init_on_hold` field.
* **`SLL`** currency: deprecated; use `SLE` instead.