> For the complete documentation index, see [llms.txt](https://docs.limio.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.limio.com/release-notes/limio-commerce-release-notes/readme/release-116.md).

# Release 116

### :sparkles: Highlights

* **Stripe Billing, end to end.** Stripe is now supported across the whole subscription lifecycle. Customers can buy, cancel, upgrade, downgrade, change address, gift a subscription and manage their payment methods, all powered by Stripe.
* **More ways to pay.** Stripe checkout now supports BACS Direct Debit, Apple Pay and Google Pay, and you can present different payment methods per offer.
* **Flexible discounts and promotions.** A new billing-agnostic Limio Discount object and redesigned Promo Codes let you define a discount once and apply it through promo codes at checkout.
* **Smarter self-service.** Customers can change quantity, remove offers from a subscription and update their address through self-service journeys.
* **A redesigned catalog dashboard.** The catalog home page is now a data-driven dashboard giving you an at-a-glance view of your store.
* **Secure by default.** PCI DSS payment page protections are now always on.

{% hint style="danger" %}

#### Breaking changes

* If you use SalesforceV3 platform events with update or cancel subscription, add the `AccountId__c` and `ContactId__c` attributes to your Salesforce configuration before upgrading
* PCI DSS payment page protections are now always on — verify any custom scripts on your checkout pages still load correctly after upgrading
* The legacy `BEARER_MMA` order submission path has been removed — external integrations using it must migrate to the admin order API before upgrading
  {% endhint %}

***

### New Features

#### Stripe Billing, end to end

Stripe is now a fully supported billing provider in Limio, covering the whole journey from checkout to self-service.

**Your customers can:**

* **Buy a subscription** through Stripe checkout, built on Stripe's Payment Element, paying by card, BACS Direct Debit, Apple Pay or Google Pay, with the available payment methods configurable per offer
* **Buy** [**several offers in one checkout**](https://docs.limio.com/integrations/zuora-integration/manage-your-pricing/how-to-configure-subscriptions-in-limio-offers-with-initial-price-and-zuora-rate-plans/how-to-acquire-multiple-offers-in-a-single-subscription), **buy as a** [**gift**](https://docs.limio.com/integrations/stripe-billing-integration/gift-subscriptions), and **redeem promo codes** with the discount correctly charged
* **Manage their subscription through self-service**: upgrade, downgrade or cancel, change their address, and view or change payment methods

**For your team**

Limio and Stripe always stay in sync. After every order, payment amounts, dates and status are refreshed from Stripe, and each customer has a single Stripe account with all their invoices and payment methods in one place.

Everything is visible in Limio too: orders, customer data, and process events showing each step of a Stripe order with any errors, such as a declined card. Failed events are surfaced on the dashboard.

Limio for Salesforce also works with Stripe Billing as the underlying billing system, so your agents can take Stripe payments in Salesforce-driven journeys. Read more about [Stripe payments for Salesforce](https://docs.limio.com/integrations/setting-up-limio-for-salesforce/detailed-salesforce-setup/stripe-payments-for-salesforce).

Read more in the [Stripe Billing Overview](https://docs.limio.com/integrations/stripe-billing-integration/stripe-billing).

#### Introducing Discounts and Promo Codes (beta)

We are introducing a better way to run promotions in Limio, built on two new catalog objects.

A **Discount** is the deal: "20% off for 3 months", or "£10 off the basket", applied to everything or just specific items.

A **Promo Code** is how customers claim it: the code they type at checkout, like SUMMER20, with its own redemption limit, start date and expiry date. One Discount can power any number of codes, so changing the deal is one edit, not five.

Both work like the rest of your catalog: templates, filtering, bulk actions and API access. Create a Discount, click **Create Coupon** to generate the linked Stripe coupon automatically, add Promo Codes and publish.

In this release, Discounts work with Stripe Billing only. Support for Zuora and for redeeming Discounts through Limio for Salesforce is planned for a future release. To try it today, turn on Settings > Beta > "Use Limio Discounts".

Read more in the [Discounts & Promo Codes documentation](https://docs.limio.com/product/pricing/discounts-and-promo-codes).

#### Self-service subscription changes

Customers can now make more changes to their subscription without contacting support, through update subscription journeys:

* **Change quantity**: increase or decrease seats or copies, with pricing and proration handled correctly
* **Remove an offer** without cancelling the whole subscription. The offer stays active until the end of the current term, and a subscription always keeps at least one offer
* **Change their address** through a dedicated change-of-address journey

These journeys are built with the Limio SDK; there is no out-of-the-box component yet. See the [Update Subscription SDK documentation](https://docs.limio.com/developers/limio-sdk/subscription-update-checkout) for the quantity and offer removal journeys, and the [Self-Service Checkout SDK documentation](https://docs.limio.com/developers/limio-sdk/self-service-checkout) for the change-of-address journey. If you integrate with the API directly, see the [Manage subscription updates guide](https://docs.limio.com/guides/developer-guides/guide-manage-subscription-updates).

#### Manage subscriptions from Salesforce

Agents can now upgrade, downgrade or change quantities on a customer's subscription directly from Limio for Salesforce, a new flow in this release. In addition, for tenants on Stripe Billing, the agent actions already available with Zuora now work with Stripe too, including changing a customer's payment method and changing their address.

#### Redesigned catalog dashboard

The catalog home page can now be upgraded to a data-driven dashboard giving you a clear overview of your store the moment you log in:

* **New orders** over the last 30 days
* **Cancellations** over the last 30 days
* **Recent orders**, including failed ones so nothing slips past
* **Failed process events**, so problems surface the moment you log in
* **The most recent abandoned carts**

{% hint style="info" %}
**Note**: The dashboard is off by default. To try it, turn on **Settings > General Settings > Beta settings > "Use new data-driven Home Page?"**.
{% endhint %}

Read more in the [Home Dashboard documentation](https://docs.limio.com/product/introduction/home-dashboard).

#### Analyse your checkout A/B tests with the Limio MCP

This release improves the Limio MCP's order analytics, so your marketing team can measure checkout performance and A/B test results directly through the MCP. Orders now record which checkout page they came through, and you can filter, group and total orders by count or revenue. For example, ask your AI tool with the Limio MCP connected: "which checkout page had more orders in the last 2 weeks?"

Get started with the Limio MCP here: [Limio MCP Server](https://docs.limio.com/ai/mcp-server/mcp-server), and see [What You Can Do](https://docs.limio.com/ai/mcp-server/usage) for order analytics examples.

#### Single sign-on with Okta and Google

The Limio App now supports single sign-on via Okta and Google. Your team members can sign in to Limio using their existing corporate credentials instead of a separate Limio username and password.

A Limio user account must be created by an admin before the first federated login, so that the correct permissions can be assigned when the user authenticates. Existing username-and-password logins are unaffected and continue to work as before.

Read more about configuring SSO here: [Login options (SSO)](https://docs.limio.com/product/settings/security/login-options-sso). Please contact <support@limio.com> if you are interested in using this feature.

#### Support quantity and add-ons in purchase links

Purchase links can now include add-ons and quantities. You can define which offer an add-on belongs to and set the quantity of each offer or add-on directly in the link, so dynamically built links (for example from a questionnaire flow) can land customers on checkout with a fully composed basket. Existing purchase link formats keep working unchanged.

Learn how to configure purchase links here: [Purchase Links](https://docs.limio.com/product/checkout/how-to-configure-purchase-links)

#### Configurable cart item names

The name shown for items in the cart was previously hardcoded as "product name - offer name". A new Cart Item Name property lets you build the label from any attribute on the order item (offer, product or add-on), so each brand can show cart items the way that makes sense for them. The current format remains the default. Read more on the [Cart Items component page](https://docs.limio.com/components/component-library/cart-components/component-cart-items).

### Improvements

#### Subscription events now include Account and Contact IDs

When a subscription is updated or cancelled, the event sent to Salesforce now includes the customer's Account and Contact IDs, the same way new order events already do. Your Salesforce automation can act on these events directly, without a secondary lookup.

{% hint style="warning" %}
**Note**: If you use SalesforceV3 platform events with update or cancel subscription, add the `AccountId__c` and `ContactId__c` attributes to your Salesforce configuration before upgrading. Without them, these platform events will not process successfully.
{% endhint %}

#### Stronger payment page protection (PCI DSS)

Payment page script protections (PCI DSS v4) were previously opt-in via a flag. From Release 116 they are always on.

{% hint style="warning" %}
**Note**: If you inject custom scripts on checkout pages (for example analytics or consent tools), verify they still load correctly after upgrading.
{% endhint %}

#### Manage your catalog through MCP

Previously the Limio MCP could only create and update offers, using a fixed set of standard fields. It now reads your catalog templates first, so it knows exactly which fields, options and defaults apply, including your custom attributes. Read more in the [Limio MCP documentation](https://docs.limio.com/ai/mcp-server/mcp-server).

#### Checkout forms prefill from any order value

When a customer opens a checkout from an assisted checkout link or a recovery link, the form is now pre-filled with everything Limio already knows, including your custom fields, not just the standard name and address ones. This means less typing for the customer, which can lead to fewer abandoned checkouts.

#### Show customer email on the basket detail view

When you open a basket in the Limio admin (Subscriptions > Baskets), the customer's email address now appears in the Details section, so you can see whose basket it is without digging into the raw JSON data.

#### Filter cross-sells by underlying product ID

The cross-sell component hides offers and add-ons the customer already has. It now determines this using the Limio product rather than the underlying billing system product code. This means filtering works correctly when several add-ons share one Zuora product, and for tenants on Stripe Billing.

#### Clearer error messages for payment forms

Previously, when a customer's card details failed validation at checkout, the same error message appeared in multiple places at once. This is now corrected: each error shows only at the level it belongs. Field validation errors appear next to the field, and genuine payment failures show as an order-level error. This applies to both Stripe and Zuora payment forms.

#### Subscription identifier available in the callout plugin

If you use the [callout plugin](https://docs.limio.com/integrations/order-orchestration/callout-plugin) to notify your own systems about orders, the request body now always includes a `subscriptionIds` field identifying the subscription(s) the order relates to. Your systems no longer need to call Limio back to work out which subscription an order belongs to. This works for both Zuora and Stripe.

#### Publish offers and add-ons directly from the catalog

Offer and add-on pages in the catalog now have their own Publish and Unpublish buttons. Previously, releasing a new version of an offer or add-on required building and publishing a page that used it. Now you publish the item directly, and the new version is immediately live in Limio for Salesforce, upgrade and downgrade options, cross-sells and upsells, and purchase links. Shop pages work as before and still require a page rebuild to show changes.

Read more in [Manage Versions with Publish](https://docs.limio.com/product/pricing/how-to-manage-offers-and-add-ons-versions-with-publish).

#### Strengthened platform security

Following our latest penetration test, the Limio app now sends stricter browser security headers, and API error responses no longer reveal internal details.

#### More complete subscriber timeline in Limio for Salesforce

The subscriber timeline now shows more complete and consistently formatted event details.

### Bug Fixes

#### Hot Sync now supports Subscription Term billing periods

Subscriptions using Zuora's "Subscription Term" billing period now sync into Limio correctly. Previously Limio's hot sync rejected them and affected customers couldn't load their account page.

#### Hot-synced multi-product subscriptions now display an individual price for each item

Hot-synced subscriptions with multiple products no longer display as a single bundled offer in self-service. Each product now shows individually with its own price and quantity.

#### Billing address country now updates with the "same as delivery" checkbox

Ticking "My billing address is the same as my delivery address" now correctly updates the billing address country dropdown.

#### Customers paying by invoice can place new orders

Customers who pay by invoice can now place a new order without errors. Previously, AutoPay was switched on while processing the order, which isn't allowed for invoice payment, so the order failed. AutoPay is now kept off for customers paying by invoice.

#### Cart total currency default

The floating cart header no longer defaults to GBP when the cart is empty.

#### Duplicated add-ons no longer use the original name

Duplicating an add-on now gives the copy its new name instead of keeping the original add-on's name.

#### Compatible add-on descriptions render correctly

Compatible add-on descriptions now display in self-service update journeys. The component now reads the same cross-sell display name and description fields used at acquisition (`cross_sell_display_name__limio`, `cross_sell_display_description__limio`).

#### No payment method created for gift recipients

An empty payment method no longer appears in the saved payment methods component for customers who redeemed a gift.

#### Correct "current plan" shown when updating multi-offer subscriptions

When a customer with a multi-offer subscription went to upgrade one of its offers, the Update Subscription Offers component could show the wrong offer as their current plan, which could cause confusion. This is now fixed: the current plan card always shows the offer the customer chose to update.

#### Structured custom attributes no longer break catalog publishing

Publishing catalog items with structured custom attributes (for example a recurring date stored as month + day) no longer fails silently. This is now resolved.

#### Claiming an anonymous subscription now works with multiple subscriptions

Customers who purchased through an anonymously authenticated checkout were sometimes unable to claim their subscription (via the MMA claim API) if the checkout session held more than one. Claims now succeed, and all of their subscriptions are associated with one owner.

#### Purchase and promo links load reliably

Checkouts opened from a purchase or promo link now reliably load the selected offer and discount.

### Refactors and cleanup

#### Removed legacy order submission path

The legacy order submission path using `BEARER_MMA` authorisation has been removed. Integrations using the standard self-service, admin or Salesforce order flows are unaffected.

{% hint style="warning" %}
**Note**: If you have an external integration that submits subscription orders using this path, migrate it to the admin order API before upgrading.
{% endhint %}

#### Other internal improvements

A number of internal engineering improvements were also delivered in this release, with no direct customer-facing change:

* Removed the legacy @limio/ui-form library. The migration to @limio/form-lite was completed in Release 115, so this removal has no effect on checkout behaviour in this release.
* Catalog data validation is now driven by metadata rather than hardcoded properties.
* Internal code quality improvements across the data layer, payment manager and checkout basket logic.

*Please remember to perform a hard refresh in your browser after upgrading your environment.*


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.limio.com/release-notes/limio-commerce-release-notes/readme/release-116.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
