Skip to navigation

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 for the default. Set signing_required on a quote template 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.

A quote can carry a ramp of consecutive schedules POST /v1/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.

The upgrade flow takes a quote template POST /v1/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.

Fixes

  • A subscription that is canceled, or has a cancellation scheduled, no longer offers the upgrade quote 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 returns the invoice a plan change creates at the start of the new schedule, and changes nothing. The body is the one that 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 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}, which puts it back on the version’s own entitlements. See Custom pricing.

Fixes

  • Copying 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 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

  • Charging on-demand pricing items 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 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.

Fixes

  • A one-off invoice 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 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.

Wallets and credits

A wallet grant that cannot be booked is refused when you create it POST /v1/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.

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.

Meters

A required meter value or property can be made optional PATCH /v1/meters/{id} accepts required going from true to false on a meter value or meter property 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 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. 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 gives the outcome per line. See Large event file uploads.

Workflows

Tag the emails a workflow sends The “send email to customer” action 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.

Export to ERP offers every connected ERP The “export to ERP” action lists the accounts of every connected ERP integration, 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 carries a conditions column. It is resolved the same way as the comparator column the usage report 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 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.

Insights dashboards carry a chat A Dynamic Insights dashboard has the AI chat 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 next to the meters they belong to.