Summary

This release introduces pricing plan groups, an invoice cadence that is independent of the pricing period, reverse-a-payment support, dynamic variables in quote templates, and a clearer payment status on invoices, alongside subscription, customer and integration improvements.

Pricing

Pricing plan groups A new PricingPlanGroup resource lets you group related pricing plans together with the rules for moving between them (upgrade, downgrade and cancellation timing). A pricing plan belongs to at most one group. Create and manage groups through POST /pricing-plan-groups and the accompanying CRUD endpoints; a read-only link field on the pricing plan shows the group it belongs to. This release adds the resource and its management API; executing an upgrade or downgrade on a subscription through a group follows in a later release.

Invoice cadence independent of the pricing period Pricing item configs now support a billing_period that is separate from the pricing_period, so you can invoice on a different cadence than the one used to price usage (for example price per month, invoice per quarter). In Desk, single-cycle recurring and per-seat product items gain a “Billing period” field to set this cadence without editing the pricing period.

Subscriptions

Cancellation reason When cancelling a subscription you can now pass an optional free-text cancellation reason on the POST /v1/pricing-plan-subscriptions/{id}/cancel request. It is persisted on the subscription and is available through both the API and the customer portal, so you can record why a subscription ended.

Keep indexing overrides when copying a schedule Copying a subscription schedule in Desk now carries over its indexing overrides, so a copied schedule keeps the index adjustments you already configured instead of resetting them.

Invoices

Payment status on invoices Invoices now expose a payment_status field with the values UNPAID, PARTIALLY_PAID, PAID and OVERPAID, and Desk shows this status on the invoice screen. It gives a more precise view of collection state than the previous paid/unpaid boolean, including partial and over-payments.

Finalize invoices in order An invoice can now only be made final once the previous period’s invoice is already final. This prevents finalizing out of order, where changing an earlier period (for example through included volume) could retroactively affect a later invoice that was already final.

Keep original customer details on a credit note When crediting a standard invoice you can now choose whether to keep the original customer details from the invoice being credited, or use the customer’s current details in the platform. The choice is offered as a radio option in the credit note modal.

Fixes

bug-fix
  • The product item dropdown for adding a one-off line now shows a label for the product item type (Revenue or Deduction), so items with the same name in both categories can be told apart before adding the line.
  • “Recent invoices” lists in Desk are now sorted by date instead of returning in an unsorted order.

Payments

Reverse a payment A new reverse action, POST /v1/payments/{id}/reverse, undoes a payment without you having to know its state at the payment service provider. If the payment has not been captured yet it is cancelled; if it has already been captured it is refunded, the same way as a referenced refund. Previously you had to determine capture state yourself and choose between cancel and refund, and a refund on an uncaptured payment would fail.

Fixes

bug-fix
  • The refund button on a payment now only appears when the payment is authorised. It was previously shown on payments in an error state, where a refund is not possible.
  • Adyen recurring SEPA direct debit: two metadata field keys that exceeded Adyen’s 20-character limit have been shortened, with backwards compatibility, so these payments no longer fail metadata validation.

Quotes

Dynamic variables in quote templates Quote templates and drafts now support dynamic variables such as {{quote.customer.name}}, which are hydrated with the quote’s own data when the quote is rendered. This builds on quote templates from the previous release, letting a single template adapt to each customer and quote instead of carrying hard-coded values.

Customers

Filter customers by role The customer list in Desk can now be filtered by role (Self billing, Non processing, Processing only), using the role filter already supported by POST /v1/customers/search. This makes it quicker to narrow a large customer list to the group you care about.

Notification preferences on by default for contacts Contacts now have notification preferences enabled by default, matching the behaviour already in place for customers, so newly added contacts receive the relevant notifications without extra configuration.

Workflows

Action executions on the workflow detail page A workflow’s detail page in Desk now includes a table of its action executions, so you can see what a workflow has run and monitor its activity from one place.

Meters and events

Type to search meter property enum values Selecting a value from a list-type (enum) meter property now supports typing to filter the options, instead of only scrolling. This is noticeably faster for long lists such as country codes.

Integrations

Fixes

bug-fix
  • AvaTax: an invoice is now synced to AvaTax again when it transitions to final, so the tax provider always holds the finalized version of the document.

Deprecated API fields

The following field is now deprecated. It continues to work for backwards compatibility, but we recommend migrating to the replacement.

  • paid (Invoice): deprecated in favour of payment_status, which distinguishes UNPAID, PARTIALLY_PAID, PAID and OVERPAID rather than a single boolean.