Summary

🛒 This release turns the customer portal from a place to look at invoices into a place to change your plan: customers can create a new pricing plan schedule, upgrade mid-cycle, top up a wallet and manage automatic top-ups without touching your product. Around it, invoices gain two display settings (tax per line item and the original customer’s line), the pay link on an invoice becomes patchable, wallet balance workflows can send emails, API keys can be deactivated from Desk, and the events and customer screens received a round of usability work. Wallet insights and a credit burndown graph in Desk round out the release.

Customer portal

Self-serve plan changes A customer can now create a new pricing plan schedule on their own subscription from the customer portal, which is what a free-to-premium upgrade needs. POST /v1/portal/pricing-plan-schedules takes the pricing_plan_subscription_id and the enabled_pricings the customer selected; the schedule reuses the subscription’s current pricing plan version, and the previous schedule is closed at the new start. PATCH /v1/portal/pricing-plan-schedules/{id} updates an existing one. Self-serve plan changes walks through both calls end to end.

Two start dates are possible. Left out, start_at puts the change at the start of the next billing period. Passed as now (it is only accepted within five minutes of the current time), the change takes effect immediately and the billing period realigns to it, which requires a subscription with billing time EXACT; on a CALENDAR subscription the request is rejected with a message telling you to omit start_at. The subscription’s next invoice is refreshed afterwards so the change is visible right away.

The upgrade and the payment can also be tied together. Call POST /v1/portal/payments/authorize with context type CREATE_PRICING_PLAN_SCHEDULE and a create_pricing_plan_schedule block naming the pricing_plan_subscription_id, pricing_plan_version_id, pricing_id and optional start_at; the schedule is created once the payment is authorized, so a customer never ends up on a new plan with an unpaid balance or the other way round. The step is idempotent: an existing schedule with the same start date is reused rather than duplicated when a retried payment lands twice.

Portal-driven changes are gated on the customer being able to pay for them. The subscription must be ACTIVE and belong to an ACTIVE customer, and it must carry an ACTIVE payment method of that same customer whose type is one of CARD, DIGITAL_WALLET, DIRECT_DEBIT, ONLINE_BANKING or BUY_NOW_PAY_LATER. Prepaid and unrecognized payment methods are rejected.

Wallet top-ups from the portal POST /v1/portal/invoices/charge-on-demand-pricing-items now charges the customer instead of only returning a preview. The request carries the pricing_plan_schedule_id, the pricing_items to charge (each with an optional flexible_amount for flexible pricing items), a payment_method_id and finalize_immediately; pass preview: true to get the previous preview-only behaviour. This completes the self-service top-up flow for credit-based pricing: the customer picks a bundle or an amount, pays with a stored payment method, and the wallet grant is booked against the invoice as it is created. See Wallet top-ups.

Automatic top-ups from the portal Automatic wallet top-ups, introduced through the platform API in a previous release, can now be managed by the customer: /v1/portal/auto-top-up-configs supports creating a config, listing the configs for a wallet_id, fetching one, and the activate and deactivate actions. The config gained a topup_amount field, which is required when the linked on-demand item uses flexible pricing and rejected when it uses a fixed price, so a customer choosing “top up $50 whenever I drop below 100 credits” is expressible without a dedicated fixed-price item. The amount is validated against the item’s flexible pricing band, and the resulting wallet grant is booked synchronously so the new balance is visible the moment the top-up completes.

Available top-ups on the wallet balance POST /v1/customers/{id}/wallets/balance can now expand charge_on_demand_pricing_items, which lists the on-demand pricing items that can top up each wallet, each with its pricing_item_id, pricing_plan_schedule_id and the expandable pricing_item itself. A portal or in-product balance widget can therefore render the balance and the top-up options the customer is entitled to from a single call, instead of resolving the customer’s schedules separately.

Invoices

Hide the tax breakdown per line item A new show_tax_per_line_item setting on the subscription controls whether the VAT breakdown is rendered per invoice line or only as a summary at the total level. It defaults to on, which is the existing behaviour, and the value in effect when the invoice is created is copied onto the invoice (and onto its credit notes), so historical documents keep rendering the way they were issued. Turning it off removes the tax rate column and the per-subtotal “incl. tax” labels from the invoice PDF and the specification page. This is aimed at self-billing setups, where a per-line tax breakdown adds noise rather than information. The toggle is available in Desk under “Edit subscription details”.

Show the original customer’s invoice line show_original_customer_invoice_line is a new boolean on the platform’s default_pricing_plan_subscription_settings, overridable per subscription, following the same pattern as display_invoice_sub_lines_per_processing_only_customer. The subscription value wins, the platform default applies when the subscription leaves it unset, and the resolved value is stored on the invoice so it survives regeneration and crediting. Desk exposes it in the Edit subscription modal.

Set the pay link on an invoice The pay_invoice_link on an invoice is now writable through PATCH /v1/invoices/{id}, by passing a portal_url_id. This lets you point a finalized invoice at a specific published portal URL instead of the one Solvimon generates, which matters when you send invoices through your own communication flow. The link must reference a PUBLISHED portal URL that belongs to the invoice being patched, and only a FINAL invoice can be patched. A manually set link takes precedence and is preserved when the invoice is refreshed. See Hosted checkout for how those URLs are created.

Fixes

bug-fix
  • An on-demand product is no longer charged again on the first invoice of a subscription.
  • The delivery date entered on a partial credit is now sent with the credit request, so credit notes for entities that require a delivery date (for example in Hungary) carry the right one.
  • On self-billing invoices, Desk now swaps the customer and supplier blocks the same way the invoice PDF does, so the screen matches the document.
  • Crediting an invoice sends credit_details_source in every case (full or partial, standard or one-off), and the toggle now reads as “use the original customer details”, matching what the service does by default.

Quotes

Fixes

bug-fix
  • An upgrade quote can no longer be created with a start date at or before the start of the subscription’s current schedule. This previously passed validation and produced an action queue item that failed later.

Pricing

Fixes

bug-fix
  • Pricing item configs that specify a pricing period or a currency are ignored when the schedule has no period or currency set, instead of being applied to a schedule they were not meant for.
  • “Edit plan details” no longer shows a single-select currency field for multi-currency plans, where it could not be pre-filled and did not reflect the plan’s actual currency list. Currency management for those plans stays in “Edit version details”.
  • Filling in the prices of a single-currency plan no longer triggers a request to complete prices for other currencies.

Workflows

Wallet balance actions and emails The wallet balance trigger now supports actions in general and send-email in particular, so a customer can be emailed when their credits run low rather than only receiving a webhook. Desk supports building these wallet workflows, and the wallet, credit and wallet balance workflow set is seeded in sandboxes so you can try the flow without configuring it from scratch.

Date format selector in Desk The date_format field on send-email actions, added to the API in a previous release, now has an editor in Desk: you compose the pattern from the supported tokens (yyyy, yy, MMMM, MM, dd and so on) and see a rendered example while typing, so an email that should read 24.08.2026 no longer needs an API call to configure.

Email actions on test platforms On test platforms, send-email actions now override the to and cc addresses with the platform’s support_email. Testing an invoice email flow against realistic customer data no longer risks delivering it to that customer.

Developers

API key status management An API key can now be activated and deactivated from Desk, so rotating a key no longer means creating a replacement and leaving the old one live. The API keys screen gained a Status column and a per-row menu, backed by PATCH /v1/api-keys/{id}.

Fixes

bug-fix
  • PATCH /v1/api-keys/{id} no longer returns a 404 for keys that are visible through GET /v1/api-keys. The handler resolved the key against the authenticated user’s entity instead of the platform selected through X-Platform-Id; it now resolves against the request’s platform.

Integrations

Set up your own email provider from Desk Connecting your own Mailgun account to native workflow emails previously required Solvimon to create the system integration for you through the API. Desk now exposes that setup directly, so you can connect and update your mail integration yourself and get the email configuration for a new platform working without a support round trip.

Meters and events

Events table improvements The events table now folds the deleted flag into the processing details column as a red “Deleted” badge (the “Not matched” badge gained an info icon in the same pass), and the reference column is capped at half the container width with truncation on screens below 1200px, so the columns that carry meaning stay readable. In Desk, events can also be ingested for a customer that does not exist yet: the ingest panel can create the customer inline.

Fixes

bug-fix
  • The events table shows both properties when two meter properties share a display name but differ by id, instead of rendering one of them twice. Properties are now matched by id rather than by name.

Customers

Create a customer where you need one The “New invoice” and “Ingest events” panels can now create a customer inline, so a one-off invoice or a first test event for a customer that is not in Solvimon yet no longer means abandoning the form. Creating a customer from the customers screen now navigates straight to the new customer’s detail page.

Desk

Wallet insights and credit burndown Insights gained wallet sub-tabs under Usage and Customers, and the customer screen now shows a credit burndown graph under the wallet balance box, so credit consumption over time is visible next to the current balance instead of only in a separate dashboard.

Side column and panel cleanup Content blocks in the side column place the label and the value next to each other in the same size and weight, with the edit control next to the title where the block is editable, which makes the column shorter and easier to scan. Edit and delete were also split into separate actions, so the edit modal no longer doubles as a delete confirmation.

Fixes

bug-fix
  • Copy and terminology on the pricing pages were corrected, including the wording that distinguishes a regular plan from an add-on and the fields in the “add a plan” modal.
  • The invoice summary now shows the customer prefix, and child customer names, so an invoice that bills for a hierarchy can be read without opening each line.